Langgraph从新手到老师傅-2-Agent是什么

前言

在前面的内容中,我们已经使用create_react_agent快速搭建了一个Agent,但Agent究竟是什么?它的工作原理又如何呢?本文将深入探讨Agent的构成、工作流程、结构特点以及入参和返回值的格式,帮助大家更好地理解Agent的运行机制,为后续的开发和应用奠定坚实的基础。

Agent的结构

按Langgraph文章里的说法,Agent是由三样东西组成的:

  • 大模型
  • 工具
  • 提示词

简单来说,Agent就是一个干活的系统,目的是满足用户的需求。大模型会一直不停地循环工作。在每次循环里,它会挑选要用的工具,然后接收或者观察这个工具用完后的结果。接着,它会根据这个结果来决定下一步怎么做,一直这样循环下去,直到把用户的需求搞定,或者达到某个停止的条件。

示意图如下

图解释

  • START 开始点,输入用户需求
  • LLM 大模型,整个系统的大脑
  • END 任务结束点
  • Tool Executor 调用工具
  • Request Tool Call 大模型把调用工具的参数交给 ToolExecutor
  • Observe Response ToolExecutor 把执行的结果返回给大模型

上文我们创建的Agent到底是什么样子的呢?Langgraph也提供了相应的方法,我们可以把整个工作流程输出成图片。

python 复制代码
# 省略代码

prompt = "你是一个生活小助手"
tools = [get_weather]
agent = create_react_agent(model=model, prompt=prompt, tools=tools)

# 打印agent的样子看看
mermaid_png_data = agent.get_graph().draw_mermaid_png()
with open("agent.png", "wb") as f:
    f.write(mermaid_png_data)

最终图片为,和我们前面提到的流程图非常相似

其他Agent的结构

但是create_react_agent能创建的agent还可以更复杂一些,它支持在调用大模型的前面和后面加入回调,还支持自定义输出内容的格式化。

我们看下代码

python 复制代码
def pre_model_hook(messages):
    return messages
    
def post_model_hook(messages):
    return messages
    
def response_format(messages):
    return messages

agent2 = create_react_agent(
    model=model,
    prompt=prompt,
    tools=tools,
    pre_model_hook=pre_model_hook,
    post_model_hook=post_model_hook,
    response_format=response_format,
)

mermaid_png_data = agent2.get_graph().draw_mermaid_png()
with open("agent2.png", "wb") as f:
    f.write(mermaid_png_data)

我们用create_react_agent创建了一个新的agent,传入了更多的参数

  • pre_model_hook 每次模型调用前执行此函数
  • post_model_hook 每次模型调用完成后执行此函数
  • response_format 最终结束前,把内容格式化

生成的图片为

Agent的入参和返回值

上文中我们调用了agent,使用了下面的参数,并返回了一个结果,那么agent接收的参数到底是什么数据格式,返回的又是什么格式呢?只有明白了这些数据格式,才能更好的开发我们的业务。

python 复制代码
messages = {"messages": [{"role": "user", "content": "上海天气怎么样"}]}
ai_reponse = agent.invoke(messages)["messages"][-1]

入参

Agent的入参是一个必须拥有messages键的字典,值可以有很多类型,比如

字符串

python 复制代码
messages = {"messages": "上海天气怎么样"}
agent.invoke(messages)

字典

python 复制代码
messages = {"messages": {"role": "user", "content": "上海天气怎么样"}}
agent.invoke(messages)

字典数组

python 复制代码
messages = {"messages": [{"role": "user", "content": "上海天气怎么样"}]}
agent.invoke(messages)

自定义的对象

python 复制代码
messages = {
    "messages": [{"role": "user", "content": "上海天气怎么样"}],
    "user_name": "Alice",
}
agent.invoke(messages)

返回值

invoke的返回值模默认情况下是一个有messages键的字典,messages的值是一个数组,数组的元素是不同的消息,比如HumanMessage,AiMessage,ToolMessage等。也可以使用自定义的格式化器修改输出的数据格式。

下面我们看下输出的内容

python 复制代码
messages = {"messages": [{"role": "user", "content": "上海天气怎么样"}]}
reponse = agent.invoke(messages)
print(reponse)

格式化下返回值内容

json 复制代码
{
    "messages": [
        HumanMessage(content="上海天气怎么样", 
            additional_kwargs={}, 
            response_metadata={}, 
            id="201fff64-d5ef-43bd-9d06-e43708b53c43"),
        AIMessage(content="", 
            additional_kwargs={
                "tool_calls": [
                    {
                        "id": "call_c9390d5c26ab4a66b1ece6",
                        "function": {
                            "arguments": "{"city": "上海"}",
                            "name": "get_weather"
                        },
                        "type": "function",
                        "index": 0
                    }
                ],
                "refusal": None
            },
            response_metadata={
                "token_usage": {
                    "completion_tokens": 17,
                    "prompt_tokens": 166,
                    "total_tokens": 183,
                    "completion_tokens_details": None,
                    "prompt_tokens_details": {
                        "audio_tokens": None,
                        "cached_tokens": 0
                    }
                },
                "model_name": "qwen-max",
                "system_fingerprint": None,
                "id": "chatcmpl-09e4a4e5-fce7-975a-9038-225c9705274a",
                "service_tier": None,
                "finish_reason": "tool_calls",
                "logprobs": None
            }, 
            id="run--9d0a9d35-0617-4df0-b17f-28f298cb44cf-0",
            tool_calls=[
                {
                    "name": "get_weather",
                    "args": {
                        "city": "上海"
                    },
                    "id": "call_c9390d5c26ab4a66b1ece6",
                    "type": "tool_call"
                }
            ], 
            usage_metadata={
                "input_tokens": 166,
                "output_tokens": 17,
                "total_tokens": 183,
                "input_token_details": {
                    "cache_read": 0
                },
            "output_token_details": {}
            }),
        ToolMessage(content="上海的天气: 阴天,18摄氏度", 
            name="get_weather", 
            id="3b087f96-97b7-461b-8634-0dc6067f0c90", 
            tool_call_id="call_c9390d5c26ab4a66b1ece6"),
        AIMessage(content="上海现在的天气是阴天,温度是18摄氏度。", 
            additional_kwargs={
                "refusal": None
            }, 
            response_metadata={
                "token_usage": {
                    "completion_tokens": 17,
                    "prompt_tokens": 215,
                    "total_tokens": 232,
                    "completion_tokens_details": None,
                    "prompt_tokens_details": {
                        "audio_tokens": None,
                        "cached_tokens": 0
                    }
                },
                "model_name": "qwen-max",
                "system_fingerprint": None,
                "id": "chatcmpl-fe071b3e-60c9-91b8-b395-8eb621725bd1",
                "service_tier": None,
                "finish_reason": "stop",
                "logprobs": None
            }, 
            id="run--8540229b-9caa-46db-8f03-ea4175dd14e4-0", 
            usage_metadata={
                "input_tokens": 215,
                "output_tokens": 17,
                "total_tokens": 232,
                "input_token_details": {
                    "cache_read": 0
                },
            "output_token_details": {}
            })
    ]
}

可以看到返回值是包含messages的字段,messages是一个数组,里面由HumanMessage、AIMessage和ToolMessage组成。

总结

通过本文的详细介绍,我们对Agent有了全面的了解。Agent由大模型、工具和提示词组成,其工作原理是通过大模型的循环工作,不断挑选工具、接收结果并决定下一步操作,直至满足用户需求或达到停止条件。我们还展示了如何使用Langgraph提供的方法将Agent的工作流程输出成图片,直观地呈现其结构。此外,create_react_agent不仅可以创建简单的Agent,还能通过加入回调和自定义输出内容的格式化,创建更复杂的Agent。最后,我们深入分析了Agent的入参和返回值的格式,明确了其数据结构,这对于开发业务应用至关重要。

相关推荐
袁庭新3 小时前
2025年08月总结
人工智能·aigc
DreamLife☼3 小时前
工业 5G + AI:智能制造的未来引擎
人工智能·5g·ai·制造·控制·工业·scada
我希望的一路生花3 小时前
ArtCAM 2008安装教程
人工智能·adobe·cascadeur
uwvwko3 小时前
buuctf——web刷题第5页
前端·python·php·web·ctf·buuctf
美团技术团队3 小时前
美团正式发布并开源 LongCat-Flash-Chat,动态计算开启高效 AI 时代
人工智能·开源
Java中文社群3 小时前
炸了!Google新发图片大模型简直逆天!
人工智能
YF云飞3 小时前
CVPR2019 Oral论文《Side Window Filtering》解读及算法 Python 实现
python·算法·计算机视觉
大翻哥哥3 小时前
Python轻量化革命:用MicroPython构建边缘智能设备
开发语言·python
深兰科技3 小时前
柳州市委常委、统战部部长,副市长潘展东率队首访深兰科技集团新总部,共探 AI 赋能制造大市与东盟合作新局
人工智能·beautifulsoup·numpy·pyqt·matplotlib·pygame·深兰科技