工具 Schema 改了但 Python 函数没改,怎样在模型调用前查出参数不一致
模型看到的工具参数来自 Schema,真正执行的参数却由 Python 函数签名决定。两边只改一边,模型可能给出完全符合 Schema 的调用,应用仍然报缺参或未知参数。可以在注册工具时做静态对照,把这类漂移挡在模型调用之前。
先限制检查器承诺的范围
本文只检查显式注册、使用普通位置或关键字参数以及仅关键字参数的 Python 函数。注册表由应用编写,模型不能通过模块名动态导入函数。演示工具 lookup(order_id, region='cn') 对应两个属性,其中 order_id 必填、region 可选。复杂装饰器、内置函数与运行时代理需单独验证签名来源。
用 inspect.signature 得到参数名、参数种类和默认值是否存在,再与 Schema 的 properties 和 required 比较。required 中出现未声明属性也属于合同错误。本文不把 Python 注解自动当成完整 JSON Schema;日期、联合类型和嵌套对象需要独立的类型适配。
四种漂移要分别定位
缺参样本是函数要求 order_id,但 Schema 没有这个属性。多参样本是 Schema 增加 page,而函数不接受它。默认值样本把 region 从可选改成函数必填,Schema 却仍允许省略。可变参数样本出现 **kwargs,本文检查器明确拒绝自动判一致,避免宽泛签名掩盖拼写错误。
合法对照应通过;四种坏例分别产生可读的问题项,指明参数名和冲突方向。不要只返回 false,让维护者自己猜是函数还是 Schema 需要更新。附件使用本地函数对象,没有调用模型或查询真实订单。
结构一致仍需检查语义
失败反例是只比较参数总数。两个函数都收两个参数,名称却分别是 order_id 和 customer_id,数量一致不能证明可以调用。另一个反例是把全部属性都写入 required 来满足静态检查,却破坏原本允许省略的默认行为。修复应从对外合同出发,而不是以“能跑过检查”为目标。
OpenAI 函数调用资料定义模型如何提出工具请求,但执行仍由应用负责。静态检查通过不代表参数值正确、函数没有副作用,或 Schema 中的 region 枚举与函数真实支持集合一致。实际执行前仍要做实例校验、权限检查和业务边界判断。
上线时可把签名检查接入工具注册流程,失败则不发布该工具定义。变更默认值时还要回放旧调用,观察省略字段是否产生不同结果。检查结果记录函数身份、Schema 版本和问题列表,方便追溯。本文只验证这个有限签名合同,不声称覆盖所有 Python 调用语义,也不会修改现有生产工具。
配套文件与依据
本文的合成输入和参考结果可下载独立样本 a023.json,离线检查器 a023.py与样本放在同一目录后运行。检查器不调用模型接口。 使用 Python 3.12 或兼容版本,将上述文件下载到同一目录,执行 python a023.py。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。