LangChain 工具调用概念指南
概述
许多AI应用程序直接与人类交互。在这些情况下,模型用自然语言响应是合适的。但是,如果我们希望模型也能直接与系统(如数据库或API)交互呢?这些系统通常有特定的输入模式;例如,API经常有必需的负载结构。这种需求促成了工具调用的概念。您可以使用工具调用来请求符合特定模式的模型响应。
信息提示:您有时会听到术语
函数调用
。我们将此术语与工具调用
互换使用。
核心概念
(1) 工具创建: 使用 @tool 装饰器创建工具。工具是函数与其模式之间的关联。
(2) 工具绑定: 工具需要连接到支持工具调用的模型。这使模型了解工具以及工具所需的相关输入模式。
(3) 工具调用: 在适当的时候,模型可以决定调用工具并确保其响应符合工具的输入模式。
(4) 工具执行: 可以使用模型提供的参数执行工具。
推荐用法
以下伪代码说明了使用工具调用的推荐工作流程。创建的工具作为列表传递给 .bind_tools()
方法。可以像往常一样调用此模型。如果进行了工具调用,模型的响应将包含工具调用参数。工具调用参数可以直接传递给工具。
# 工具创建
tools = [my_tool]
# 工具绑定
model_with_tools = model.bind_tools(tools)
# 工具调用
response = model_with_tools.invoke(user_input)
工具创建
创建工具的推荐方法是使用 @tool
装饰器。
from langchain_core.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""将 a 和 b 相乘。"""
return a * b
API 参考: tool
进一步阅读
- 查看我们关于工具的概念指南以获取更多详细信息
- 查看支持工具调用的模型集成
- 查看我们关于工具调用的操作指南
工具绑定
许多模型提供商支持工具调用。
提示:查看我们的模型集成页面,了解支持工具调用的提供商列表。
要理解的核心概念是,LangChain 提供了一个标准化接口来连接工具和模型。.bind_tools()
方法可用于指定模型可以调用哪些工具。
model_with_tools = model.bind_tools(tools_list)
作为一个具体示例,让我们取一个函数 multiply
并将其作为工具绑定到支持工具调用的模型。
def multiply(a: int, b: int) -> int:
"""将 a 和 b 相乘。
Args:
a: 第一个整数
b: 第二个整数
"""
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("2乘以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的模型在工具调用方面会比非微调模型表现更好
- 如果工具有精心选择的名称和描述,模型会表现得更好
- 简单、范围狭窄的工具比复杂工具更容易被模型使用
- 要求模型从大量工具列表中选择对模型来说是一个挑战
详细解释
什么是工具调用?
工具调用是现代AI系统中的一个重要概念,它允许语言模型不仅生成文本响应,还能与外部系统和API进行交互。这种能力使得AI助手能够执行实际的操作,如查询数据库、调用API、执行计算等。
为什么需要工具调用?
- 结构化交互:许多系统需要特定格式的输入,工具调用确保模型输出符合这些要求
- 功能扩展:通过工具调用,模型可以访问实时数据、执行复杂计算、与外部服务交互
- 可靠性:相比让模型生成代码或命令,工具调用提供了更可靠和安全的执行方式
实际应用场景
- 数据查询:让模型查询数据库并返回结构化结果
- API调用:与第三方服务集成,如天气API、支付系统等
- 计算任务:执行复杂的数学计算或数据处理
- 文件操作:读取、写入或处理文件
技术实现要点
- 模型支持:不是所有模型都支持工具调用,需要选择合适的模型
- 工具设计:工具应该简单、专注,有清晰的文档说明
- 错误处理:需要考虑工具调用失败的情况
- 安全性:确保工具调用不会造成安全风险
这个概念指南为开发者提供了使用LangChain进行工具调用的完整框架,从基础概念到实际实现都有详细说明。
的模型
2. 工具设计:工具应该简单、专注,有清晰的文档说明
3. 错误处理:需要考虑工具调用失败的情况
4. 安全性:确保工具调用不会造成安全风险
这个概念指南为开发者提供了使用LangChain进行工具调用的完整框架,从基础概念到实际实现都有详细说明。
本文档翻译自 LangChain官方文档