工具集成
让智能体调用外部工具(如 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())执行流程
agent节点: LLM 接收到问题,决定调用get_weather工具。- 条件边:
should_call_tools检测到tool_calls,路由到tools节点。 tools节点:ToolNode执行get_weather工具,并将结果作为ToolMessage添加到状态中。- 返回
agent节点:agent节点接收到工具调用的结果。 agent节点: LLM 根据工具结果生成最终的自然语言响应。- 条件边:
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 错误或异常。 - 状态管理: 将工具调用的结果清晰地存储在状态中,方便后续节点使用。
- 安全性: 对执行代码或访问敏感数据的工具要格外小心,实施严格的安全措施。
💡 下一步: 学习 多智能体协作,了解如何让多个具备不同工具的智能体协同工作。
