工具调用
概述
许多 AI 应用程序直接与人类交互。在这些情况下,模型以自然语言响应是合适的。但如果我们希望模型也*直接*与系统(例如数据库或 API)交互,那该怎么办?这些系统通常具有特定的输入模式;例如,API 经常有必需的有效载荷结构。这种需求促使了*工具调用*的概念。您可以使用工具调用来请求符合特定模式的模型响应。
您有时会听到术语 函数调用
。我们将其与 工具调用
互换使用。
关键概念
- 工具创建:使用 @tool 装饰器创建工具。工具是函数与其模式之间的关联。
- 工具绑定:工具需要连接到支持工具调用的模型。这使模型能够感知工具及其所需的输入模式。
- 工具调用:在适当时,模型可以决定调用工具,并确保其响应符合工具的输入模式。
- 工具执行:工具可以使用模型提供的参数进行执行。
推荐用法
此伪代码说明了使用工具调用的推荐工作流程。创建的工具会作为一个列表传递给 .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
,其中包含模型的自然语言响应(例如,“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
),这些组件通常会代表用户调用工具。
- 请参阅我们关于工具调用的操作指南。
- 请参阅 LangGraph 关于使用 ToolNode 的文档。
强制使用工具
默认情况下,模型可以根据用户的输入自由选择要使用的工具。但在某些情况下,您可能希望影响模型的决策过程。LangChain 允许您强制选择工具(使用 tool_choice
),确保模型使用特定工具或给定列表中的*任何*工具。这对于构建模型的行为并引导其实现预期结果非常有用。
- 请参阅我们关于强制使用工具的操作指南。
最佳实践
在设计模型要使用的工具时,请务必记住:
- 具有明确工具调用 API 的模型在工具调用方面将优于未经微调的模型。
- 如果工具具有精心选择的名称和描述,模型将表现得更好。
- 简单、范围狭窄的工具比复杂工具更容易供模型使用。
- 要求模型从大量工具列表中选择会对模型构成挑战。