跳到主要内容

工具

先决条件

概述

LangChain 中的 工具 抽象将 TypeScript 函数 与定义函数 名称描述输入模式 相关联。

工具 可以传递给支持 工具调用聊天模型,允许模型请求执行具有特定输入的特定函数。

主要概念

  • 工具是一种封装函数及其模式的方法,可以传递给聊天模型。
  • 使用 tool 函数创建工具,该函数简化了工具创建过程,支持以下功能
    • 定义返回 工件(例如图像等)的工具
    • 使用 注入的工具参数 从模式中隐藏输入参数(因此也从模型中隐藏)。

工具接口

工具接口在 StructuredTool 类中定义,它是 Runnable 接口 的子类。

对应于工具 模式 的关键属性

  • name:工具的名称。
  • description:工具的功能描述。
  • args:返回工具参数的 JSON 模式的属性。

执行与 工具 关联的函数的关键方法

  • invoke:使用给定参数调用工具。

使用 tool 函数创建工具

创建工具的推荐方法是使用 tool 函数。此函数旨在简化工具创建过程,应在大多数情况下使用。

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

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

有关如何创建工具的更多详细信息,请参阅 如何创建自定义工具 指南。

注意

LangChain 有几种其他创建工具的方法;例如,通过子类化 StructuredTool 类或使用 StructuredTool。这些方法在 如何创建自定义工具指南 中显示,但我们通常建议在大多数情况下使用 tool 函数。

直接使用工具

定义工具后,您可以通过调用函数直接使用它。例如,要使用上面定义的 multiply 工具

await multiply.invoke({ a: 2, b: 3 });

检查

您还可以检查工具的模式和其他属性

console.log(multiply.name); // multiply
console.log(multiply.description); // Multiply two numbers.
注意

如果您正在使用预构建的 LangChain 或 LangGraph 组件,如 createReactAgent,您可能不需要直接与工具交互。但是,了解如何使用它们对于调试和测试可能很有价值。此外,在构建自定义 LangGraph 工作流程时,您可能会发现有必要直接使用工具。

配置模式

tool 函数提供了其他选项来配置工具的模式(例如,修改名称、描述或解析函数的文档字符串以推断模式)。

有关更多详细信息,请参阅 tool 的 API 参考,并查看 如何创建自定义工具 指南以获取示例。

工具工件

工具 是可以由模型调用的实用程序,其输出旨在反馈给模型。但是,有时,我们希望使工具执行的工件可供我们链或代理中的下游组件访问,但我们不希望将其暴露给模型本身。例如,如果工具返回自定义对象、数据帧或图像,我们可能希望将有关此输出的一些元数据传递给模型,而无需将实际输出传递给模型。同时,我们可能希望能够在其他地方访问此完整输出,例如在下游工具中。

const someTool = tool(({ ... }) => {
// do something
}, {
// ... tool schema args
// Set the returnType to "content_and_artifact"
responseFormat: "content_and_artifact"
});

有关更多详细信息,请参阅 如何从工具返回工件

RunnableConfig

您可以使用 RunnableConfig 对象将自定义运行时值传递给工具。

如果您需要从工具内部访问 RunnableConfig 对象。可以通过在工具的函数签名中使用 RunnableConfig 来完成此操作。

import { RunnableConfig } from "@langchain/core/runnables";

const someTool = tool(
async (args: any, config: RunnableConfig): Promise<[string, any]> => {
/**
* Tool that does something.
*/
},
{
name: "some_tool",
description: "Tool that does something",
schema: z.object({ ... }),
returnType: "content_and_artifact"
}
);


await someTool.invoke(..., { configurable: { value: "some_value" } });

config 不会成为工具模式的一部分,并且将在运行时注入适当的值。

最佳实践

在设计供模型使用的工具时,请记住以下几点

  • 命名良好、文档正确且类型提示正确的工具更易于模型使用。
  • 设计简单且范围狭窄的工具,因为它们更易于模型正确使用。
  • 使用支持 工具调用 API 的聊天模型,以利用工具的优势。

工具包

LangChain 具有 工具包 的概念。这是一种非常薄的抽象,将设计用于特定任务的工具组合在一起。

接口

所有工具包都公开了一个 getTools 方法,该方法返回工具列表。因此,您可以执行以下操作

// Initialize a toolkit
const toolkit = new ExampleTookit(...)

// Get list of tools
const tools = toolkit.getTools()

有关更多信息,请参阅以下资源


此页是否对您有帮助?


您也可以留下详细的反馈 在 GitHub 上.