Skip to content

工具集成

让智能体调用外部工具(如 API、数据库、代码执行器)是构建强大应用的关键。LangGraph 提供了多种方式来集成和调用工具。

🛠️ Tool 对象

LangChain 的 Tool 对象是工具集成的基础。

1. 定义工具

使用 @tool 装饰器可以轻松地将函数转换为工具。

python
from langchain_core.tools import tool

@tool
def search_web(query: str) -> str:
    """
    在网络上搜索信息。
    """
    # 模拟 API 调用
    return f"关于 '{query}' 的搜索结果..."

@tool
def get_weather(city: str) -> str:
    """
    获取指定城市的天气。
    """
    if city == "北京":
        return "晴天,25°C"
    return "未知城市"

2. 绑定到 LLM

将工具列表绑定到支持工具调用的 LLM。

python
from langchain_openai import ChatOpenAI

tools = [search_web, get_weather]
llm = ChatOpenAI(model="gpt-4-turbo").bind_tools(tools)

🤖 在 LangGraph 中使用工具

1. ToolExecutor

ToolExecutor 用于执行工具调用。

python
from langgraph.prebuilt import ToolExecutor

tool_executor = ToolExecutor(tools)

2. ToolNode

ToolNode 是一个预构建的节点,可以自动执行工具调用。

python
from langgraph.prebuilt import ToolNode

tool_node = ToolNode(tools)

3. 智能体节点

智能体节点负责调用 LLM 并决定是否使用工具。

python
from langgraph.graph import StateGraph, END
from typing import TypedDict, List
from langchain_core.messages import BaseMessage, ToolMessage

class AgentState(TypedDict):
    messages: List[BaseMessage]

def agent_node(state: AgentState) -> dict:
    # 调用 LLM
    response = llm.invoke(state["messages"])
    return {"messages": [response]}

4. 构建图

python
workflow = StateGraph(AgentState)

workflow.add_node("agent", agent_node)
workflow.add_node("tools", tool_node)

workflow.set_entry_point("agent")

# 条件路由:判断是否需要调用工具
def should_call_tools(state: AgentState) -> str:
    last_message = state["messages"][-1]
    if last_message.tool_calls:
        return "tools"
    return END

workflow.add_conditional_edges(
    "agent",
    should_call_tools,
    {
        "tools": "tools",
        END: END,
    },
)

# 从工具节点返回到智能体节点
workflow.add_edge("tools", "agent")

app = workflow.compile()

🚀 完整示例

python
from langchain_core.messages import HumanMessage
from IPython.display import Image

# 调用图
inputs = {"messages": [HumanMessage(content="北京今天天气怎么样?")]}
result = app.invoke(inputs)

# 查看最终结果
print(result["messages"][-1].content)

# 可视化图
Image(app.get_graph().draw_mermaid_png())

执行流程

  1. agent 节点: LLM 接收到问题,决定调用 get_weather 工具。
  2. 条件边: should_call_tools 检测到 tool_calls,路由到 tools 节点。
  3. tools 节点: ToolNode 执行 get_weather 工具,并将结果作为 ToolMessage 添加到状态中。
  4. 返回 agent 节点: agent 节点接收到工具调用的结果。
  5. agent 节点: LLM 根据工具结果生成最终的自然语言响应。
  6. 条件边: should_call_tools 未检测到 tool_calls,流程结束。

📦 create_tool_node

对于更复杂的场景,可以使用 create_tool_node 来创建自定义的工具节点。

python
from langgraph.prebuilt import create_tool_node

# 自定义工具处理逻辑
def custom_tool_logic(tool_call):
    # ...
    pass

custom_tool_node = create_tool_node(tools, custom_logic=custom_tool_logic)

🎯 最佳实践

  • 清晰的工具描述: @tool 装饰器中的文档字符串(docstring)非常重要,LLM 会根据它来决定何时以及如何使用工具。
  • 输入类型提示: 为工具函数的参数提供明确的类型提示。
  • 错误处理: 在工具函数内部添加 try...except 块来处理潜在的 API 错误或异常。
  • 状态管理: 将工具调用的结果清晰地存储在状态中,方便后续节点使用。
  • 安全性: 对执行代码或访问敏感数据的工具要格外小心,实施严格的安全措施。

💡 下一步: 学习 多智能体协作,了解如何让多个具备不同工具的智能体协同工作。

Released under the MIT License.