如何将运行时值传递给工具
先决条件
本指南假设你熟悉以下概念
支持的模型
本操作指南使用具有原生工具调用功能的模型。你可以找到一个 支持工具调用的所有模型列表.
你可能需要将值绑定到在运行时才知道的工具。例如,工具逻辑可能需要使用发出请求的用户的 ID。
大多数情况下,此类值不应由 LLM 控制。事实上,允许 LLM 控制用户 ID 可能会导致安全风险。
相反,LLM 应该只控制由 LLM 控制的工具参数,而其他参数(如用户 ID)应该由应用程序逻辑固定。
本操作指南展示了一种设计模式,该模式在运行时动态创建工具并将适当的值绑定到它们。
我们可以将它们绑定到聊天模型,如下所示
选择你的聊天模型
- 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
});
传递请求时间信息
想法是在请求时动态创建工具,并将适当的信息绑定到它。例如,此信息可能是从请求本身解析的用户 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 跟踪。
提示
聊天模型只输出调用工具的请求。它们不会实际调用底层工具。
要了解如何调用工具,请参阅 如何使用模型调用工具.