注:文章使用了 Pi 和 GPT 6.1 terra 进行整理和润色。并尽可能人工修改了一些不说人话的表述😂。
在 Pi 使用 GPT 模型并且用 Responses API 形式调用工具时,你可能见过这样的情况:明明只需要一个搜索关键词,模型却把工具定义里的可选参数也一一写出来,填上空字符串、空数组或 false。如果对应字段的 schema 允许 null,模型也可能填入 null。
这不一定是模型“过度积极”地使用工具,也不一定是提示词要求它这么做。一个值得检查的原因是:工具 schema 可能在发送或处理过程中变成了严格模式要求的形式,使原本可选的字段也必须出现在调用中。
从一个现象说起
假设一个搜索工具的 query 是必填参数,domainFilter、includeContent、provider 和 modelId 是可选参数。你只是想做一次普通搜索,期待的调用可能是:
1 | { "query": "Pi tool calling" } |
但实际看到的可能更像这样:
1 | { |
上面的 JSON 只是说明现象的简化示例,不代表某次真实请求。关键区别是:在普通 schema 中,可选字段通常可以省略;在严格模式所要求的 schema 中,对象的所有属性都需要列为必填。要保留“没有提供值”的语义,一种做法是在 schema 中明确允许字段取 null。严格模式本身不会自动允许或要求使用 null。
以这个例子中的 provider 和 modelId 为例:它们主要用于选择部分 LLM 提供商及其模型,以调用这些提供商的搜索能力。只有打算使用相应的 LLM 提供商搜索能力时,才需要按工具要求填写;普通搜索通常应当省略它们。若模型为了“填满参数”而传入空值或不匹配的值,工具可能尝试使用错误的提供商或模型配置,进而导致搜索失败。
因此,这不只是调用记录看起来冗长:模型多填的参数可能改变工具用途,甚至让原本能成功的调用因为多写了参数失败。
