Langchain实践指南:Tool对象的拓展集成 | 豆包MarsCode AI刷题

121 阅读3分钟

LangChain中的Tool调用:解析与实践

在构建智能对话系统时,语言模型的强大之处不仅在于它可以生成自然语言,还可以通过调用工具(Tools)实现复杂任务处理。LangChain 提供了对 Tool 调用 的支持,使模型能够高效处理多步骤、多工具协同的任务。本文将通过一个详细的示例,介绍 Tool 调用的机制、处理方式以及如何进一步优化解析工具调用的结果。


Tool 调用的基础

Tool 调用是模型与外部功能交互的桥梁。当模型需要额外的信息或处理逻辑(例如数学运算、数据库查询等)时,它可以生成 Tool 调用请求。这些调用会通过 .tool_calls 属性附加到响应中。

关键特点:

  1. 多工具支持
    LangChain 的模型能够一次调用多个工具,比如同时进行加法和乘法运算。

  2. 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 调用将是一个重要方向。

参考 How to use chat models to call tools | 🦜️🔗 LangChain