工具调用
概览
许多 AI 应用直接与人类交互。在这些情况下,模型以自然语言响应是合适的。 但对于我们希望模型也直接与系统(如数据库或 API)交互的情况呢? 这些系统通常具有特定的输入模式;例如,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() 方法可用于指定模型可以调用的可用工具。
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。
然而,如果我们传入与工具相关的输入,模型应该选择调用该工具:
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'}
有关使用方法的更多详细信息,请参阅我们的 操操作指南!
工具执行
工具 实现 可运行 接口,这意味着它们可以直接被调用(例如,tool.invoke(args))。
LangGraph 提供预构建组件(例如,ToolNode),这些组件通常会代表用户调用工具。
- 查看我们的工具调用指南。
- 查看 LangGraph 关于使用 ToolNode 的文档。
最佳实践
在设计由模型使用的工具时,重要的是要记住:
- 具有明确 工具调用 API 的模型在工具调用方面将优于未微调的模型。
- 如果工具具有精心选择的名称和描述,模型将表现得更佳。
- 简单的、范围狭窄的工具比复杂的工具更容易被模型使用。
- 向模型提供大量工具供其选择会给模型带来挑战。