工具¶
工具 是一种封装函数及其输入模式的方法,以便可以传递给支持工具调用的聊天模型。这使得模型能够请求以特定输入执行该函数。
你可以选择定义自己的工具或使用LangChain提供的预构建集成。
定义简单工具¶
你可以将一个普通的函数传递给 create_react_agent
以用作工具:
API Reference: create_react_agent
from langgraph.prebuilt import create_react_agent
def multiply(a: int, b: int) -> int:
"""Multiply two numbers."""
return a * b
create_react_agent(
model="anthropic:claude-3-7-sonnet",
tools=[multiply]
)
create_react_agent
自动将普通函数转换为LangChain 工具。
自定义工具¶
为了更好地控制工具的行为,请使用@tool
装饰器:
API Reference: tool
from langchain_core.tools import tool
@tool("multiply_tool", parse_docstring=True)
def multiply(a: int, b: int) -> int:
"""乘以两个数字。
参数:
a: 第一个操作数
b: 第二个操作数
"""
return a * b
您还可以使用Pydantic定义自定义输入模式:
from pydantic import BaseModel, Field
class MultiplyInputSchema(BaseModel):
"""乘以两个数字"""
a: int = Field(description="第一个操作数")
b: int = Field(description="第二个操作数")
@tool("multiply_tool", args_schema=MultiplyInputSchema)
def multiply(a: int, b: int) -> int:
return a * b
有关更多自定义选项,请参阅自定义工具指南。
隐藏模型中的参数¶
某些工具需要在运行时传递一些参数(例如用户ID或会话上下文),这些参数不应由模型控制。
您可以将这些参数放在代理的 state
或 config
中,并在工具内部访问这些信息:
API Reference: InjectedState | AgentState | RunnableConfig
from langgraph.prebuilt import InjectedState
from langgraph.prebuilt.chat_agent_executor import AgentState
from langchain_core.runnables import RunnableConfig
def my_tool(
# 这个参数将由LLM填充
tool_arg: str,
# 访问代理中动态更新的信息
# 高亮下一行
state: Annotated[AgentState, InjectedState],
# 访问在调用代理时传递的静态数据
# 高亮下一行
config: RunnableConfig,
) -> str:
"""我的工具。"""
do_something_with_state(state["messages"])
do_something_with_config(config)
...
禁用并行工具调用¶
一些模型提供商支持同时执行多个工具,但允许用户禁用此功能。
对于支持的提供商,可以通过设置 model.bind_tools()
方法中的 parallel_tool_calls=False
来禁用并行工具调用:
API Reference: init_chat_model
from langchain.chat_models import init_chat_model
def add(a: int, b: int) -> int:
"""加两个数"""
return a + b
def multiply(a: int, b: int) -> int:
"""乘以两个数。"""
return a * b
model = init_chat_model("anthropic:claude-3-5-sonnet-latest", temperature=0)
tools = [add, multiply]
agent = create_react_agent(
# 禁用并行工具调用
# 高亮下一行
model=model.bind_tools(tools, parallel_tool_calls=False),
tools=tools
)
agent.invoke(
{"messages": [{"role": "user", "content": "3 + 5 和 4 * 7 是多少?"}]}
)
直接返回工具结果¶
使用 return_direct=True
可以立即返回工具结果并停止代理循环:
API Reference: tool
from langchain_core.tools import tool
@tool(return_direct=True)
def add(a: int, b: int) -> int:
"""加两个数字"""
return a + b
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=[add]
)
agent.invoke(
{"messages": [{"role": "user", "content": "3加5等于多少?"}]}
)
强制工具使用¶
要强制智能体使用特定工具,可以在 model.bind_tools()
中设置 tool_choice
选项:
API Reference: tool
from langchain_core.tools import tool
# 高亮下一行
@tool(return_direct=True)
def greet(user_name: str) -> int:
"""问候用户。"""
return f"Hello {user_name}!"
tools = [greet]
agent = create_react_agent(
# 高亮下一行
model=model.bind_tools(tools, tool_choice={"type": "tool", "name": "greet"}),
tools=tools
)
agent.invoke(
{"messages": [{"role": "user", "content": "Hi, I am Bob"}]}
)
避免无限循环
在没有停止条件的情况下强制工具使用可能会创建无限循环。可以使用以下一种保护措施来避免这种情况:
处理工具错误¶
默认情况下,代理会捕获所有在工具调用期间引发的异常,并将其作为工具消息传递给LLM。为了控制如何处理这些错误,你可以使用预构建的ToolNode
——即在create_react_agent
中执行工具的节点——通过其handle_tool_errors
参数:
from langgraph.prebuilt import create_react_agent
def multiply(a: int, b: int) -> int:
"""乘以两个数。"""
if a == 42:
raise ValueError("终极错误")
return a * b
# 使用默认错误处理运行
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=[multiply]
)
agent.invoke(
{"messages": [{"role": "user", "content": "42乘以7是多少?"}]}
)
from langgraph.prebuilt import create_react_agent, ToolNode
def multiply(a: int, b: int) -> int:
"""乘以两个数。"""
if a == 42:
raise ValueError("终极错误")
return a * b
# 高亮下一行
tool_node = ToolNode(
[multiply],
# 高亮下一行
handle_tool_errors=False # (1)!
)
agent_no_error_handling = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=tool_node
)
agent_no_error_handling.invoke(
{"messages": [{"role": "user", "content": "42乘以7是多少?"}]}
)
- 这里禁用了错误处理(默认开启)。查看所有可用策略,请参阅API参考。
from langgraph.prebuilt import create_react_agent, ToolNode
def multiply(a: int, b: int) -> int:
"""乘以两个数。"""
if a == 42:
raise ValueError("终极错误")
return a * b
# 高亮下一行
tool_node = ToolNode(
[multiply],
# 高亮下一行
handle_tool_errors=(
"不能将42作为第一个操作数,您必须交换操作数!" # (1)!
)
)
agent_custom_error_handling = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=tool_node
)
agent_custom_error_handling.invoke(
{"messages": [{"role": "user", "content": "42乘以7是多少?"}]}
)
- 在发生异常时提供自定义消息发送给LLM。查看所有可用策略,请参阅API参考。
有关不同工具错误处理选项的更多信息,请参阅API参考。
预构建工具¶
LangChain 支持广泛的预构建工具集成,用于与 API、数据库、文件系统、网络数据等交互。这些工具扩展了代理的功能,并加速了开发过程。
您可以在 LangChain 工具集成目录 中浏览所有可用的集成列表。
一些常用的工具类别包括:
- 搜索:Bing、SerpAPI、Tavily
- 代码解释器:Python REPL、Node.js REPL
- 数据库:SQL、MongoDB、Redis
- 网络数据:网页抓取和浏览
- API:OpenWeatherMap、NewsAPI 等
这些集成可以通过上面示例中显示的 tools
参数进行配置并添加到您的代理中。