记录一下那天晚上的排查过程。查询工具在数据库里没查到记录时返回 None,序列化成 JSON 后工具消息的 content 是 null,模型收到后不回答,而是把同一个工具再调三次,日志里四次调用的参数完全一样。

刚开始盯着「提示词没有说明空结果该怎么回复」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。工具消息 content 为 null 模型读不到结果。另一种情况是返回值没有统一包装 成功与失败结构不同。

少数情况下是Agent 循环没有调用次数上限。

先在工具出口统一包成对象

python -c "import json;r=None;print(json.dumps({'ok':r is not None,'data':r},ensure_ascii=False))"

接着把空结果替换成明确文案

python fix_tool.py --null-text '未查询到记录' --in out.json

回放一次带工具消息的请求

curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d @replay.json

给 Agent 循环加最大轮数

python -c "print({'max_steps':4})"

怎么算真的好了,看的是同一批现象。空结果那一轮模型直接给出未查询到的答复,不再重复调用,日志里同一参数只出现一次。

补一句。null 和空对象在模型眼里是两件事,工具层统一成固定结构,比在提示词里反复强调更可靠。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189