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的入参和返回值的格式,明确了其数据结构,这对于开发业务应用至关重要。

相关推荐
王彦臻37 分钟前
PyTorch 神经网络工具箱核心内容
人工智能·pytorch·神经网络
Monkey的自我迭代40 分钟前
光流估计(可用于目标跟踪)
人工智能·opencv·计算机视觉
APIshop2 小时前
Python爬虫+数据分析:电商平台数据采集与分析
爬虫·python·数据分析
程序员杰哥3 小时前
Postman接口测试的cookie,token,session....鉴权
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
戴着眼镜看不清3 小时前
2025年最新开源Nano Banana Plus商业化系统本地搭建教程
人工智能·gemini·nanobanana
肖永威3 小时前
MuMu模拟器使用入门实践指南:从ADB连接到Frida动态分析
python·adb·frida·mumu
love530love4 小时前
EPGF 架构下的 Python 环境变量设置建议——Anaconda 路径精简后暴露 python 及工具到环境变量的配置记录 [三]
开发语言·人工智能·windows·python·架构·conda·epgf 架构
卡奥斯开源社区官方4 小时前
AI设计功能性病毒:从DNA语言模型到精准杀菌实战
人工智能·语言模型·自然语言处理
山石玉人4 小时前
lora微调大语言模型(qwen1.5-chat)
人工智能·语言模型·自然语言处理
小oo呆4 小时前
【自然语言处理与大模型】大模型应用开发四个场景
人工智能·自然语言处理