[ToolNode在LangGraph中的运用-01]LangChain和LangGraph两种编程模式的同一性

张开发
2026/4/7 16:28:44 15 分钟阅读

分享文章

[ToolNode在LangGraph中的运用-01]LangChain和LangGraph两种编程模式的同一性
LangGraph赋予我们根据推理任务自由构建流程图的能力所以我们完全可以不使用工具而将每个工具的功能实现在某个节点中这样对于流程的每个步骤都具有精准的控制。但是任何事都有利弊这样的编程模式让我们摒弃了ToolNode具有的很多能力在利用LangGraph开发Agent过程中有效地使用ToolNode有时可以起到事半功倍的作用。1. create_agent工厂函数如何构建状态图基于LangGraph的编程模式将推理任务转换成由节点和边的状态图。我们利用StateGraph作为Builder来构建这个状态图在在添加所有功能节点后通过在节点之间添加“边包括静态边和条件边”实现节点之间基于状态的路由。对于常规调用区别于中断恢复调用入口节点率先执行节点执行后会改变状态边决定的路由规则根据当前状态选择下一步执行的节点。整个执行就以这样的方式向前推进直到没有后续节点需要执行或者达到设定的步数限制。对于LangChain编程模式这里指利用create_agent工厂函数创建的Agent它依然会利用StateGraph来构建上述的状态图而且绑定的默认状态类型为AgentState它具有一个核心的字段messages用来存储整个执行过程中产生的各种消息HumanMessage、AIMessage和ToolMessage。它关联的reducer函数确保针对该字段的更新永远是往此消息列表中追加新的消息。在没有中间件注册的情况下状态图的节点只有两个一个是用于封装指定模型组件的model节点另一个则是用于封装所有注册工具的tools节点其类型就是ToolNode注册的工具同样会被绑定到model节点封装的模型组件上。tools节点到model节点之间由一条静态边而model节点到tools和__end__节点有一条条件边所以整个图结构总是如下所示的样子。我们调用Agent时可以在状态成员messages添加一条HumanMessage或者多条消息为LLM的推理模拟一段对话作为入口的model节点率先被执行它会将整个消息历史、系统提示词和注册的工具集作为调用LLM的输入。2. 双节点状态图推进流程LLM会根据提示词体现的推理任务以及可用的工具集确定是否需要对其中的一个或者多个工具发起调用。如果需要它会为每个待调用的工具生成一个ToolCall对象该对象承载着工具名称、工具调用ID以及从输入提取出来的参数列表。这个ToolCall列表作为AIMessage的核心内容返回给model节点后者将其添加到状态成员messages保存的对话历史中。model到tools和__end__节点的条件边体现了这样的路由规则如果消息历史中的最后一条AIMessage携带ToolCall对象则路由到tools节点否则任务AIMessage携带的就是最终的回答流程立即终止。tools节点执行的时候会从消息历史中提取最后一条AIMessage并提取所有的TooCall对象如果自己封装的工具包含其中则以并发的方式执行它们。如果工具返回一个Command对象其updates字段返回的内容会被用来增量更新状态其中必需包含一个ToolMessage保证整个消息历史结构完整性goto字段用于实现跳转。返回的非Command内容会被用来创建一条ToolMessage并被添加到消息历史中。如果在没有利用Command的goto字段完成跳转的情况下tools到model之间的边会再次路由到model节点上。整个Agent的执行就按照这样的方式不断循环。3. 两种编程模式的同一性对于任何一个利用LangChain(create_agent)编程模式创建的Agent都可以采用基于LangGraph的编程模式来编写。比如如下这个简单至极的用于提供天气信息的Agent。fromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlangchain_core.messagesimportHumanMessagefromlangchain.agentsimportcreate_agentfromdotenvimportload_dotenv load_dotenv()tooldefget_weather(city:str)-str:A tool to get weather information for a given city.returnfIts sunny today in{city}.agentcreate_agent(modelChatOpenAI(modelgpt-5.2-chat),tools[get_weather])messageHumanMessage(contentWhat is the weather like in Suzhou?)formessageinagent.invoke({messages:[message]})[messages]:message.pretty_print()输出 Human Message What is the weather like in Suzhou? Ai Message Tool Calls: get_weather (call_I1qmj6ySikQ7TbefTCCY3zUg) Call ID: call_I1qmj6ySikQ7TbefTCCY3zUg Args: city: Suzhou, China Tool Message Name: get_weather Its sunny today in Suzhou, China. Ai Message It’s **sunny in Suzhou, China** right now. ☀️ If you’d like, I can also tell you the **temperature, humidity, or a multi‑day forecast**.如果采用基于LangGraph的编程模式来重写就是如下这个样子fromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlangchain_core.messagesimportHumanMessagefromlanggraph.graphimportStateGraphfromlanggraph.prebuiltimportToolNode,tools_conditionfromlangchain.agentsimportAgentStatefromdotenvimportload_dotenv load_dotenv()tooldefget_weather(city:str)-str:A tool to get weather information for a given city.returnfIts sunny today in{city}.llmChatOpenAI(modelgpt-5.2-chat).bind_tools(tools[get_weather])defmodel(state:AgentState):responsellm.invoke(state[messages])return{messages:[response]}agent(StateGraph(AgentState).add_node(model,model).add_node(tools,ToolNode(tools[get_weather])).set_entry_point(model).set_finish_point(model).add_edge(tools,model).add_conditional_edges(model,pathtools_condition).compile())messageHumanMessage(contentWhat is the weather like in Suzhou?)formessageinagent.invoke({messages:[message]})[messages]:message.pretty_print()输出 Human Message What is the weather like in Suzhou? Ai Message Tool Calls: get_weather (call_iRrmDOHkfnmTw8WSi5CFmDDP) Call ID: call_iRrmDOHkfnmTw8WSi5CFmDDP Args: city: Suzhou Tool Message Name: get_weather Its sunny today in Suzhou. Ai Message It’s sunny in Suzhou today. ☀️

更多文章