跳至主要内容

如何从工具中返回工件

先决条件

本指南假设您熟悉以下概念

工具是可以由模型调用的实用程序,其输出旨在反馈给模型。但是,有时工具执行的一些工件我们希望使其能够访问链或代理中的下游组件,但我们不想将其本身暴露给模型。

例如,如果工具返回类似自定义对象或图像的内容,我们可能希望将有关此输出的一些元数据传递给模型,而无需将实际输出传递给模型。同时,我们可能希望能够在其他地方访问此完整输出,例如在下游工具中。

Tool 和 ToolMessage 接口使我们能够区分旨在用于模型的工具输出部分(这是 ToolMessage.content)和旨在用于模型外部的部分(ToolMessage.artifact)。

兼容性

此功能需要 @langchain/core>=0.2.16。请参阅此处了解有关 升级指南

定义工具

如果我们希望我们的工具区分消息内容和其他工件,我们需要在定义工具时指定 response_format: "content_and_artifact" 并确保我们返回一个元组[content, artifact]:

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

const randomIntToolSchema = z.object({
min: z.number(),
max: z.number(),
size: z.number(),
});

const generateRandomInts = tool(
async ({ min, max, size }) => {
const array: number[] = [];
for (let i = 0; i < size; i++) {
array.push(Math.floor(Math.random() * (max - min + 1)) + min);
}
return [
`Successfully generated array of ${size} random ints in [${min}, ${max}].`,
array,
];
},
{
name: "generateRandomInts",
description: "Generate size random ints in the range [min, max].",
schema: randomIntToolSchema,
responseFormat: "content_and_artifact",
}
);

使用 ToolCall 调用工具

如果我们仅使用工具参数直接调用工具,您会注意到我们只会获得 Tool 输出的内容部分

await generateRandomInts.invoke({ min: 0, max: 9, size: 10 });
Successfully generated array of 10 random ints in [0, 9].

为了同时获取内容和工件,我们需要使用 ToolCall(它只是一个包含 "name""args""id""type" 键的字典)调用我们的模型,该字典包含生成 ToolMessage(如工具调用 ID)所需的其他信息

await generateRandomInts.invoke({
name: "generate_random_ints",
args: { min: 0, max: 9, size: 10 },
id: "123", // Required
type: "tool_call", // Required
});
ToolMessage {
lc_serializable: true,
lc_kwargs: {
content: 'Successfully generated array of 10 random ints in [0, 9].',
artifact: [
0, 6, 5, 5, 7,
0, 6, 3, 7, 5
],
tool_call_id: '123',
name: 'generateRandomInts',
additional_kwargs: {},
response_metadata: {}
},
lc_namespace: [ 'langchain_core', 'messages' ],
content: 'Successfully generated array of 10 random ints in [0, 9].',
name: 'generateRandomInts',
additional_kwargs: {},
response_metadata: {},
id: undefined,
tool_call_id: '123',
artifact: [
0, 6, 5, 5, 7,
0, 6, 3, 7, 5
]
}

与模型一起使用

使用 工具调用模型,我们可以轻松地使用模型调用我们的 Tool 并生成 ToolMessage

选择您的聊天模型

安装依赖项

yarn add @langchain/openai 

添加环境变量

OPENAI_API_KEY=your-api-key

实例化模型

import { ChatOpenAI } from "@langchain/openai";

const llm = new ChatOpenAI({
model: "gpt-4o-mini",
temperature: 0
});
const llmWithTools = llm.bindTools([generateRandomInts]);

const aiMessage = await llmWithTools.invoke(
"generate 6 positive ints less than 25"
);
aiMessage.tool_calls;
[
{
name: 'generateRandomInts',
args: { min: 1, max: 24, size: 6 },
id: 'toolu_019ygj3YuoU6qFzR66juXALp',
type: 'tool_call'
}
]
await generateRandomInts.invoke(aiMessage.tool_calls[0]);
ToolMessage {
lc_serializable: true,
lc_kwargs: {
content: 'Successfully generated array of 6 random ints in [1, 24].',
artifact: [ 18, 20, 16, 15, 17, 19 ],
tool_call_id: 'toolu_019ygj3YuoU6qFzR66juXALp',
name: 'generateRandomInts',
additional_kwargs: {},
response_metadata: {}
},
lc_namespace: [ 'langchain_core', 'messages' ],
content: 'Successfully generated array of 6 random ints in [1, 24].',
name: 'generateRandomInts',
additional_kwargs: {},
response_metadata: {},
id: undefined,
tool_call_id: 'toolu_019ygj3YuoU6qFzR66juXALp',
artifact: [ 18, 20, 16, 15, 17, 19 ]
}

如果我们只传入工具调用参数,我们只会得到内容

await generateRandomInts.invoke(aiMessage.tool_calls[0]["args"]);
Successfully generated array of 6 random ints in [1, 24].

如果我们想声明式地创建一个链,我们可以这样做

const extractToolCalls = (aiMessage) => aiMessage.tool_calls;

const chain = llmWithTools
.pipe(extractToolCalls)
.pipe(generateRandomInts.map());

await chain.invoke("give me a random number between 1 and 5");
[
ToolMessage {
lc_serializable: true,
lc_kwargs: {
content: 'Successfully generated array of 1 random ints in [1, 5].',
artifact: [Array],
tool_call_id: 'toolu_01CskofJCQW8chkUzmVR1APU',
name: 'generateRandomInts',
additional_kwargs: {},
response_metadata: {}
},
lc_namespace: [ 'langchain_core', 'messages' ],
content: 'Successfully generated array of 1 random ints in [1, 5].',
name: 'generateRandomInts',
additional_kwargs: {},
response_metadata: {},
id: undefined,
tool_call_id: 'toolu_01CskofJCQW8chkUzmVR1APU',
artifact: [ 1 ]
}
]

您现在已经了解了如何从工具调用中返回其他工件。

以下指南可能会让您感兴趣


此页面对您有帮助吗?


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