工具调用
概述
许多 AI 应用程序直接与人类交互。在这些情况下,模型适合使用自然语言进行响应。 但是,如果我们希望模型也直接与系统(例如数据库或 API)交互,情况又如何呢? 这些系统通常具有特定的 input 模式;例如,API 通常具有必需的有效负载结构。 这种需求激发了工具调用的概念。您可以使用工具调用来请求与特定架构匹配的模型响应。
您有时会听到这个词function calling.我们将这个术语与tool calling.

关键概念
(1) 工具创建:使用 @tool 装饰器创建工具。工具是函数与其架构之间的关联。(2) 工具绑定:工具需要连接到支持工具调用的模型。这使模型能够识别工具以及工具所需的关联输入方案。(3) 工具调用:在适当的时候,模型可以决定调用工具并确保其响应符合工具的输入模式。(4) 工具执行:可以使用模型提供的参数执行工具。

推荐用法
此伪代码说明了使用工具调用的推荐工作流程。
创建的工具将传递给.bind_tools()方法作为列表。
像往常一样,可以调用此模型。如果进行了工具调用,则模型的响应将包含工具调用参数。
工具调用参数可以直接传递给工具。
# Tool creation
tools = [my_tool]
# Tool binding
model_with_tools = model.bind_tools(tools)
# Tool calling
response = model_with_tools.invoke(user_input)
工具创建
创建工具的推荐方法是使用@tool装饰。
from langchain_core.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""Multiply a and b."""
return a * b
工具装订
有关支持工具调用的提供程序列表,请参阅我们的模型集成页面。
需要理解的核心概念是 LangChain 提供了一个标准化的接口,用于将工具连接到模型。
这.bind_tools()method 可用于指定模型可以调用哪些工具。
model_with_tools = model.bind_tools(tools_list)
作为一个具体的例子,我们以一个函数multiply并将其作为工具绑定到支持工具调用的模型。
def multiply(a: int, b: int) -> int:
"""Multiply a and b.
Args:
a: first int
b: second int
"""
return a * b
llm_with_tools = tool_calling_model.bind_tools([multiply])
工具调用

工具调用的一个关键原则是,模型根据输入的相关性决定何时使用工具。模型并不总是需要调用工具。 例如,给定一个不相关的输入,模型不会调用该工具:
result = llm_with_tools.invoke("Hello world!")
结果将是一个AIMessage包含模型以自然语言做出的响应(例如,“Hello!”)。
但是,如果我们传递与工具相关的输入,模型应选择调用它:
result = llm_with_tools.invoke("What is 2 multiplied by 3?")
和以前一样,输出result将是一个AIMessage.
但是,如果调用了该工具,result将具有tool_calls属性。
此属性包括执行工具所需的一切,包括工具名称和输入参数:
result.tool_calls
{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'xxx', 'type': 'tool_call'}
有关使用的更多详细信息,请参阅我们的操作指南!
工具执行
工具实现了 Runnable 接口,这意味着它们可以被调用(例如tool.invoke(args)) 直接。
LangGraph 提供预构建的组件(例如ToolNode),它通常会代表用户调用该工具。
- 请参阅我们的工具调用操作指南。
- 请参阅有关使用 ToolNode 的 LangGraph 文档。
最佳实践
在设计模型要使用的工具时,请务必记住:
- 具有显式工具调用 API 的模型将比非微调模型更擅长工具调用。
- 如果工具具有精心选择的名称和描述,则模型的性能会更好。
- 简单、范围狭窄的工具比复杂的工具更容易被模型使用。
- 要求模型从大量工具中进行选择会给模型带来挑战。