Langgraph ToolNode 的原理
LangGraph ToolNode 是一个预构建的组件,用于在 LangGraph 状态图中执行工具调用。它的核心原理和工作机制如下:
基本原理
ToolNode 是一个 LangChain Runnable,它接收图状态(包含消息列表)作为输入,并输出工具调用结果的状态更新。
工作流程
- ToolNode 期望接收到的最后一条消息是包含
tool_calls
参数的 AIMessage。ToolNode 在图状态中操作,状态中包含消息列表,它期望消息列表中的最后一条消息是一个带有tool_calls
参数的 AIMessage。 - 工具调用消息需要特定的结构。AIMessage 的内容必须为空,
tool_calls
需要特定的结构,结果处理需要进行类型验证。 - ToolNode 执行工具调用,并返回 ToolMessage 格式的结果。如果请求多个工具调用,它们将并行执行,输出将是每个工具调用对应的 ToolMessage 列表。
状态管理
默认情况下,ToolNode 只会更新状态中的 messages
键。预构建的 ToolNode 仅会将消息追加到状态中的 messages
键。如果需要更新其他状态变量,则需要创建自定义节点。
ToolNode 的设计使其特别适合与 LangGraph 的 ReAct agent 配合使用,它可以自动处理返回 Command 对象的工具,并将其传播到图状态中。如果你使用的工具会通过 Command 更新状态,推荐使用预构建的 ToolNode,它可以自动处理返回 Command 对象的工具,并将其传播到图状态中。
客户服务系统
客户服务系统,其中包含一个"信息收集"Agent 和一个"问题解决"Agent。
两个 Agent 协作处理客户服务请求:
- 信息收集 Agent:负责获取客户的基本信息,通过 ToolNode 调用
get_customer_info
工具。 - 问题解决 Agent:在获得客户信息后,使用
check_order_status
和refund_order
工具来解决客户的问题。
主要特点:
- 使用 LangGraph 的 StateGraph 管理两个 Agent 的状态和流程
- 每个 Agent 有自己的 ToolNode 实例和专属工具
- 通过条件边(conditional edges)控制 Agent 之间的切换
- 使用统一的状态结构在 Agent 之间传递信息
工作流程:
- 用户提出问题
- 信息收集 Agent 提取客户ID并调用工具获取客户信息
- 系统自动切换到问题解决 Agent
- 问题解决 Agent 使用订单相关工具处理问题
- 问题解决后,流程结束
这种设计让每个 Agent 专注于特定任务,同时通过 LangGraph 的图结构实现灵活的协作。
import operator
from typing import Annotated, List, TypedDict, Literal
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, ToolMessage
from langchain_core.tools import tool
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from langchain_anthropic import ChatAnthropic
from langgraph.graph.message import add_messages
# 定义状态结构
class AgentState(TypedDict):
messages: Annotated[List[BaseMessage], add_messages]
next_agent: str
customer_info: dict
issue_solved: bool
# 定义工具
@tool
def get_customer_info(customer_id: str) -> dict:
"""根据客户ID获取客户基本信息"""
# 模拟数据库查询
return {
"name": "张三",
"id": customer_id,
"membership_level": "VIP",
"last_purchase": "2024-12-15"
}
@tool
def