跳至主要内容

如何禁用并行工具调用

先决条件

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

OpenAI 特定

此 API 目前仅受 OpenAI 支持。

OpenAI 模型默认情况下会并行执行工具调用。这意味着如果我们问一个问题,比如 "东京、纽约和芝加哥的天气如何?",并且我们有一个获取天气的工具,它将并行调用该工具 3 次。我们可以使用 parallel_tool_call 调用选项强制它仅调用一次工具。

首先让我们设置我们的工具和模型

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

const adderTool = tool(
async ({ a, b }) => {
return a + b;
},
{
name: "add",
description: "Adds a and b",
schema: z.object({
a: z.number(),
b: z.number(),
}),
}
);

const multiplyTool = tool(
async ({ a, b }) => {
return a + b;
},
{
name: "multiply",
description: "Multiplies a and b",
schema: z.object({
a: z.number(),
b: z.number(),
}),
}
);

const tools = [adderTool, multiplyTool];

const llm = new ChatOpenAI({
model: "gpt-4o-mini",
temperature: 0,
});

现在让我们快速展示一下如何禁用并行工具调用的工作原理

const llmWithTools = llm.bindTools(tools, { parallel_tool_calls: false });

const result = await llmWithTools.invoke(
"Please call the first tool two times"
);

result.tool_calls;
[
{
name: 'add',
args: { a: 5, b: 3 },
type: 'tool_call',
id: 'call_5bKOYerdQU6J5ERJJYnzYsGn'
}
]

正如我们所见,即使我们明确地告诉模型调用工具两次,但通过禁用并行工具调用,模型被限制为只调用一次。

将此与不传递 parallel_tool_calls 作为 false 的情况进行比较

const llmWithNoBoundParam = llm.bindTools(tools);

const result2 = await llmWithNoBoundParam.invoke(
"Please call the first tool two times"
);

result2.tool_calls;
[
{
name: 'add',
args: { a: 1, b: 2 },
type: 'tool_call',
id: 'call_Ni0tF0nNtY66BBwB5vEP6oI4'
},
{
name: 'add',
args: { a: 3, b: 4 },
type: 'tool_call',
id: 'call_XucnTCfFqP1JBs3LtbOq5w3d'
}
]

你可以看到,你得到了两个工具调用。

你也可以像这样在运行时传递参数

const result3 = await llmWithNoBoundParam.invoke(
"Please call the first tool two times",
{
parallel_tool_calls: false,
}
);

result3.tool_calls;
[
{
name: 'add',
args: { a: 1, b: 2 },
type: 'tool_call',
id: 'call_TWo6auul71NUg1p0suzBKARt'
}
]

此页面有帮助吗?


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