在实际开发中,经常还有如下的需求:
- 禁止模型调用某个工具
- 强制调用某个工具
- 注册多个函数工具
禁止模型调用工具#
默认情况下,模型会自行决定是否使用 tool。但有时你希望它只能用自己的知识回答,怎么办?
你可以通过 tool_choice: "none" 禁用工具调用。
const result = await openai.chat.completions.create({ model: 'gpt-3.5-turbo-1106', messages: [{ role: 'user', content: '北京天气如何?' }], tools, // 工具注册了,但不会被调用 tool_choice: 'none', // 显式禁止调用工具})强制调用工具#
有时候你希望无论用户说什么,模型都必须调用某个函数。
思考🤔什么场景有这样的需求?
- 系统内部函数(写日志、上报埋点):比如用户输入“哈哈哈”,你并不在乎他问了啥,但系统强制调用
logUserInteraction(),确保每次对话都会记录到数据库里。 - 必须走翻译函数:如果你做一个“统一英文客服”,无论用户输入中英文,都必须调用
translateToEnglish(),再交给后续处理。 - 结构化场景
- 提取表单信息:无论用户说“我的名字是张三”还是“我来自北京”,你都强制调用
extractUserProfile(),把内容整理成{name: "张三", city: "北京"}。 - 生成 SQL:即使用户说“hi”,也要求模型调用
toSQL(),这样就能保持统一的 SQL 输出。
- 提取表单信息:无论用户说“我的名字是张三”还是“我来自北京”,你都强制调用
const res = await openai.chat.completions.create({ model: 'gpt-3.5-turbo-1106', messages, tools, tool_choice: { type: 'function', function: { name: 'getCurrentWeather', // 强制调用该函数 }, },})注册多个工具#
很多实际场景中,我们的机器人不仅能查天气,还可能支持查时间、查汇率、订机票……
tools 支持同时注册多个函数。模型会根据用户提问智能选择对应函数,无需额外配置。
额外需注意字段#
parallel_tool_calls
是否允许模型在一次回复里并行提出多个 tool 调用。默认是开启的。
注意,parallel_tool_calls 只决定“能不能一次要多个工具”;用哪个工具仍由 tool_choice(或模型自动选择)决定。还有就是,parallel_tool_calls: false 只是禁止并行提出多个调用,也就是模型通常会只给一个 tool_call。它不保证“一轮就结束”。模型仍可能在下一轮继续提别的工具。
description
在 tools.function 中,description 字段能显著影响模型选择工具的行为。如果你注册多个工具,要写清楚每个工具的用途和限制,否则模型可能误选。