跳转至

工具

许多 AI 应用通过自然语言与用户交互。然而,一些用例要求模型使用结构化输入直接与外部系统(如 API、数据库或文件系统)进行交互。在这些场景中,工具调用使模型能够生成符合指定输入模式的请求。

**工具**封装了一个可调用函数及其输入模式。它们可以传递给兼容的聊天模型,从而让模型决定是否调用某个工具以及使用哪些参数。

工具调用

模型进行工具调用的示意图

工具调用通常是有条件的。基于用户输入和可用工具,模型可能会选择发出一次工具调用请求。该请求会在一个 AIMessage 对象中返回,其中包含一个 tool_calls 字段,用于指定工具名称和输入参数:

llm_with_tools.invoke("2 乘以 3 等于多少?")
# -> AIMessage(tool_calls=[{'name': 'multiply', 'args': {'a': 2, 'b': 3}, ...}])
AIMessage(
  tool_calls=[
    ToolCall(name="multiply", args={"a": 2, "b": 3}),
    ...
  ]
)

如果输入与任何工具都无关,模型只会返回一条自然语言消息:

llm_with_tools.invoke("你好,世界!")  # -> AIMessage(content="你好!")

需要注意的是,模型并不会执行该工具——它只会生成一个请求。工具调用的执行由单独的执行器(例如运行时或智能体)负责,并返回结果。

详见工具调用指南

预构建工具

LangChain 为常见的外部系统(包括 API、数据库、文件系统和网页数据)提供了预构建的工具集成。

集成目录中浏览可用工具。

常见类别:

  • 搜索:Bing、SerpAPI、Tavily
  • 代码执行:Python REPL、Node.js REPL
  • 数据库:SQL、MongoDB、Redis
  • Web 数据:抓取与浏览
  • API:OpenWeatherMap、NewsAPI 等

自定义工具

你可以使用 @tool 装饰器或普通 Python 函数定义自定义工具。例如:

API Reference: tool

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
    """将两个数字相乘。"""
    return a * b

详见工具调用指南

工具执行

虽然由模型来决定何时调用工具,但工具调用的实际执行必须由运行时组件处理。

LangGraph 为此提供了预构建的组件:

  • ToolNode:用于执行工具的预构建节点。
  • create_react_agent:构建一个可自动管理工具调用的完整智能体。