跳转至

工具

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

**工具**封装了可调用函数及其输入架构。这些可以传递给兼容的聊天模型,允许模型决定是否调用工具以及使用什么参数。

**工具**封装了可调用函数及其输入架构。这些可以传递给兼容的聊天模型,允许模型决定是否调用工具以及使用什么参数。

工具调用

模型工具调用图

工具调用通常是**有条件的**。根据用户输入和可用工具,模型可能选择发出工具调用请求。此请求在 AIMessage 对象中返回,其中包括指定工具名称和输入参数的 tool_calls 字段:

llm_with_tools.invoke("What is 2 multiplied by 3?")
# -> AIMessage(tool_calls=[{'name': 'multiply', 'args': {'a': 2, 'b': 3}, ...}])
AIMessage(
  tool_calls=[
    ToolCall(name="multiply", args={"a": 2, "b": 3}),
    ...
  ]
)
await llmWithTools.invoke("What is 2 multiplied by 3?");
AIMessage {
  tool_calls: [
    ToolCall {
      name: "multiply",
      args: { a: 2, b: 3 },
      ...
    },
    ...
  ]
}

如果输入与任何工具无关,模型仅返回自然语言消息:

llm_with_tools.invoke("Hello world!")  # -> AIMessage(content="Hello!")
await llmWithTools.invoke("Hello world!"); // { content: "Hello!" }

重要的是,模型不执行工具——它只生成请求。单独的执行器(如运行时或智能代理)负责处理工具调用并返回结果。

有关更多详细信息,请参阅工具调用指南

预构建工具

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

浏览集成目录以获取可用工具。

浏览集成目录以获取可用工具。

常见类别:

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

自定义工具

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

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
    """Multiply two numbers."""
    return a * b

你可以使用 tool 函数定义自定义工具。例如:

import { tool } from "@langchain/core/tools";
import { z } from "zod";

const multiply = tool(
  (input) => {
    return input.a * input.b;
  },
  {
    name: "multiply",
    description: "Multiply two numbers.",
    schema: z.object({
      a: z.number(),
      b: z.number(),
    }),
  }
);

有关更多详细信息,请参阅工具调用指南

工具执行

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

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

  • @[ToolNode][]: 执行工具的预构建节点。
  • @[create_react_agent][]: 构建自动管理工具调用的完整智能代理。
  • @[ToolNode]: 执行工具的预构建节点。
  • @[createReactAgent][create_react_agent]: 构建自动管理工具调用的完整智能代理。