问题出现得很突然,日志倒是留得挺全。Agent 注册了 34 个工具,每次请求把全量 schema 塞进上下文,模型在多轮里挑中了 delete_file,理由是“用户说要清理一下”,实际只是想删一条草稿。
刚开始盯着「工具名相似,delete_file 与 delete_draft 只差一个词」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。所有工具一次性下发,模型选择空间过大。还有一种是危险工具没有单独的描述约束和确认步骤。
不容易想到的是,没有按场景裁剪工具集。
先统计各工具的实际调用占比
python -c "import json,collections;d=[json.loads(l) for l in open('calls.jsonl')];print(collections.Counter(x['tool'] for x in d).most_common(10))"
随后按场景拆分工具白名单
python -c "print({'draft':['read','write_draft'],'ops':['read']})"
给危险工具加二次确认参数
python -c "print({'delete_file':{'confirm':True}})"
剩下的就是用同一句指令验证只命中安全工具
python tool_try.py --scene draft --msg '清理一下草稿'
改完先别撤,确认这几项。草稿场景下发的工具从 34 个降到 4 个,同一句指令只调用 delete_draft,delete_file 需要显式确认才可执行。
工具越多模型越容易误选,按场景下发白名单比写一堆“不要调用某工具”的提示更有效;危险操作要单独加确认参数。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
