LangChain中的Tool调用:解析与实践
在构建智能对话系统时,语言模型的强大之处不仅在于它可以生成自然语言,还可以通过调用工具(Tools)实现复杂任务处理。LangChain 提供了对 Tool 调用 的支持,使模型能够高效处理多步骤、多工具协同的任务。本文将通过一个详细的示例,介绍 Tool 调用的机制、处理方式以及如何进一步优化解析工具调用的结果。
Tool 调用的基础
Tool 调用是模型与外部功能交互的桥梁。当模型需要额外的信息或处理逻辑(例如数学运算、数据库查询等)时,它可以生成 Tool 调用请求。这些调用会通过 .tool_calls
属性附加到响应中。
关键特点:
-
多工具支持
LangChain 的模型能够一次调用多个工具,比如同时进行加法和乘法运算。 -
ToolCall 结构
Tool 调用以字典的形式表示,包含以下字段:name
: 工具名称args
: 工具参数,通常是键值对形式id
: 调用的唯一标识符type
: 调用类型(一般为"tool_call"
)
示例
以下是一个同时调用两个工具的示例:
query = "What is 3 * 12? Also, what is 11 + 49?"
llm_with_tools.invoke(query).tool_calls
# 输出示例:
[
{
'name': 'multiply',
'args': {'a': 3, 'b': 12},
'id': 'call_1fyhJAbJHuKQe6n0PacubGsL',
'type': 'tool_call'
},
{
'name': 'add',
'args': {'a': 11, 'b': 49},
'id': 'call_fc2jVkKzwuPWyU7kS9qn1hyG',
'type': 'tool_call'
}
]
无效的 Tool 调用
在某些情况下,模型可能生成错误或无效的 Tool 调用(例如参数格式不正确)。LangChain 使用 .invalid_tool_calls
属性存储这些无效调用,便于开发者调试和处理。
一个无效 Tool 调用可能包含以下字段:
name
: 工具名称arguments
: 工具的原始字符串参数id
: 调用标识符error_message
: 错误信息
# 错误调用会存储在 .invalid_tool_calls 中
[
{
'name': 'multiply',
'arguments': 'a=3, b="12abc"',
'id': 'call_invalid1',
'error_message': 'Arguments are not valid JSON.'
}
]
使用 Pydantic 解析 Tool 调用
为了确保工具调用的可靠性并简化工具参数的处理,LangChain 支持使用 Pydantic 进行工具调用的验证与解析。通过 PydanticToolsParser
,我们可以将 Tool 调用解析为强类型对象,提高代码的安全性和可维护性。
1. 定义工具的数据结构
使用 Pydantic 定义每个工具的数据模型:
from pydantic import BaseModel, Field
class Add(BaseModel):
"""加法工具:加两个整数。"""
a: int = Field(..., description="第一个整数")
b: int = Field(..., description="第二个整数")
class Multiply(BaseModel):
"""乘法工具:乘两个整数。"""
a: int = Field(..., description="第一个整数")
b: int = Field(..., description="第二个整数")
2. 创建工具解析链
通过 PydanticToolsParser
,将语言模型的输出与工具解析器组合成一个完整的处理链:
from langchain_core.output_parsers import PydanticToolsParser
# 将工具与解析器绑定
chain = llm_with_tools | PydanticToolsParser(tools=[Add, Multiply])
# 运行查询
query = "What is 3 * 12? Also, what is 11 + 49?"
parsed_tools = chain.invoke(query)
# 输出解析后的工具调用
print(parsed_tools)
# 输出:
# [Multiply(a=3, b=12), Add(a=11, b=49)]
总结
LangChain 的 Tool 调用机制为语言模型提供了强大的扩展能力,使其可以高效处理复杂任务。通过使用 Pydantic 解析工具调用,我们不仅能确保调用的可靠性,还能简化工具集成的代码结构。如果你希望构建更智能的对话系统或任务处理管道,充分利用 Tool 调用将是一个重要方向。