如何从工具中返回工件
本指南假设您熟悉以下概念
工具是可以由模型调用的实用程序,其输出旨在反馈给模型。但是,有时工具执行的一些工件我们希望使其能够访问链或代理中的下游组件,但我们不想将其本身暴露给模型。
例如,如果工具返回类似自定义对象或图像的内容,我们可能希望将有关此输出的一些元数据传递给模型,而无需将实际输出传递给模型。同时,我们可能希望能够在其他地方访问此完整输出,例如在下游工具中。
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
选择您的聊天模型
- OpenAI
- Anthropic
- FireworksAI
- MistralAI
- Groq
- VertexAI
安装依赖项
请参阅 本节了解有关安装集成软件包的一般说明.
- npm
- yarn
- pnpm
npm i @langchain/openai
yarn add @langchain/openai
pnpm add @langchain/openai
添加环境变量
OPENAI_API_KEY=your-api-key
实例化模型
import { ChatOpenAI } from "@langchain/openai";
const llm = new ChatOpenAI({
model: "gpt-4o-mini",
temperature: 0
});
安装依赖项
请参阅 本节了解有关安装集成软件包的一般说明.
- npm
- yarn
- pnpm
npm i @langchain/anthropic
yarn add @langchain/anthropic
pnpm add @langchain/anthropic
添加环境变量
ANTHROPIC_API_KEY=your-api-key
实例化模型
import { ChatAnthropic } from "@langchain/anthropic";
const llm = new ChatAnthropic({
model: "claude-3-5-sonnet-20240620",
temperature: 0
});
安装依赖项
请参阅 本节了解有关安装集成软件包的一般说明.
- npm
- yarn
- pnpm
npm i @langchain/community
yarn add @langchain/community
pnpm add @langchain/community
添加环境变量
FIREWORKS_API_KEY=your-api-key
实例化模型
import { ChatFireworks } from "@langchain/community/chat_models/fireworks";
const llm = new ChatFireworks({
model: "accounts/fireworks/models/llama-v3p1-70b-instruct",
temperature: 0
});
安装依赖项
请参阅 本节了解有关安装集成软件包的一般说明.
- npm
- yarn
- pnpm
npm i @langchain/mistralai
yarn add @langchain/mistralai
pnpm add @langchain/mistralai
添加环境变量
MISTRAL_API_KEY=your-api-key
实例化模型
import { ChatMistralAI } from "@langchain/mistralai";
const llm = new ChatMistralAI({
model: "mistral-large-latest",
temperature: 0
});
安装依赖项
请参阅 本节了解有关安装集成软件包的一般说明.
- npm
- yarn
- pnpm
npm i @langchain/groq
yarn add @langchain/groq
pnpm add @langchain/groq
添加环境变量
GROQ_API_KEY=your-api-key
实例化模型
import { ChatGroq } from "@langchain/groq";
const llm = new ChatGroq({
model: "mixtral-8x7b-32768",
temperature: 0
});
安装依赖项
请参阅 本节了解有关安装集成软件包的一般说明.
- npm
- yarn
- pnpm
npm i @langchain/google-vertexai
yarn add @langchain/google-vertexai
pnpm add @langchain/google-vertexai
添加环境变量
GOOGLE_APPLICATION_CREDENTIALS=credentials.json
实例化模型
import { ChatVertexAI } from "@langchain/google-vertexai";
const llm = new ChatVertexAI({
model: "gemini-1.5-flash",
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 ]
}
]
相关
您现在已经了解了如何从工具调用中返回其他工件。
以下指南可能会让您感兴趣