前言
在前面的内容中,我们已经使用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的入参和返回值的格式,明确了其数据结构,这对于开发业务应用至关重要。