跳到主要内容

如何将运行时值传递给工具

支持的模型

本操作指南使用具有原生工具调用功能的模型。您可以在 所有支持工具调用的模型列表 中找到列表。

您可能需要将值绑定到工具,这些值只有在运行时才知道。例如,工具逻辑可能需要使用发出请求的用户的 ID。

大多数情况下,此类值不应该由 LLM 控制。实际上,允许 LLM 控制用户 ID 可能会导致安全风险。

相反,LLM 应该只控制由 LLM 控制的工具参数,而其他参数(如用户 ID)应该由应用程序逻辑固定。

本操作指南展示了一种设计模式,该模式在运行时动态创建工具,并将适当的值绑定到它们。

我们可以将它们绑定到聊天模型,如下所示

选择您的聊天模型

安装依赖项

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
});

传递请求时间信息

我们的想法是在请求时动态创建工具,并将适当的信息绑定到它。例如,此信息可能是从请求本身解析的用户的 ID。

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

const userToPets: Record<string, string[]> = {};

function generateToolsForUser(userId: string) {
const updateFavoritePets = tool(
async (input) => {
userToPets[userId] = input.pets;
return "update_favorite_pets called.";
},
{
name: "update_favorite_pets",
description: "add to the list of favorite pets.",
schema: z.object({
pets: z.array(z.string()),
}),
}
);

const deleteFavoritePets = tool(
async () => {
if (userId in userToPets) {
delete userToPets[userId];
}
return "delete_favorite_pets called.";
},
{
name: "delete_favorite_pets",
description: "Delete the list of favorite pets.",
schema: z.object({}),
}
);

const listFavoritePets = tool(
async () => {
return JSON.stringify(userToPets[userId] ?? []);
},
{
name: "list_favorite_pets",
description: "List favorite pets if any.",
schema: z.object({}),
}
);

return [updateFavoritePets, deleteFavoritePets, listFavoritePets];
}

验证工具是否正常工作

const [updatePets, deletePets, listPets] = generateToolsForUser("brace");

await updatePets.invoke({ pets: ["cat", "dog"] });

console.log(userToPets);
console.log(await listPets.invoke({}));
{ brace: [ 'cat', 'dog' ] }
["cat","dog"]
import { BaseChatModel } from "@langchain/core/language_models/chat_models";

async function handleRunTimeRequest(
userId: string,
query: string,
llm: BaseChatModel
): Promise<any> {
if (!llm.bindTools) {
throw new Error("Language model does not support tools.");
}
const tools = generateToolsForUser(userId);
const llmWithTools = llm.bindTools(tools);
return llmWithTools.invoke(query);
}

此代码将允许 LLM 调用工具,但 LLM 不知道存在 用户 ID!您可以看到 user_id 不在 LLM 生成的参数中

const aiMessage = await handleRunTimeRequest(
"brace",
"my favorite animals are cats and parrots.",
llm
);
console.log(aiMessage.tool_calls[0]);
{
name: 'update_favorite_pets',
args: { pets: [ 'cats', 'parrots' ] },
type: 'tool_call',
id: 'call_97h0nQ3B3cr0m58HOwq9ZyUz'
}
提示

点击 这里 查看上面运行的 LangSmith 跟踪。

提示

聊天模型只输出调用工具的请求。它们实际上并没有调用底层工具。

要了解如何调用工具,请参阅 如何使用模型调用工具


此页面是否有帮助?


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