这道题问的是工具调用时参数格式怎么保证正确,其实本质是在问:怎么让大模型生成的东西既能被下游API解析,语义上又说得通。我一般从两个层面来想,生成时尽量约束住,生成后兜底校验修复,两条腿走路。
先说生成时约束。最直接的是约束解码,就是在每一步生成token时限制可选范围,确保输出从一开始就符合语法。比如用CFG或基于状态机的方式,像outlines或lm-format-enforcer这种库。好处是从根本上杜绝格式错误,但代价是首token延迟会增加,大概5%到15%,高并发场景下得掂量一下。再一个是Schema-guided生成,把JSON Schema编译成约束,字段类型、枚举值、必填项都能实时校验。这个特别适合字段结构复杂、有嵌套或oneOf/anyOf的场景,比如路径规划API,location和radius的格式要求很严格。但实现起来麻烦一些,尤其是动态分支切换的时候。
再说生成后校验。很多时候模型输出不是纯JSON,可能夹杂着解释文字,所以得先用正则把JSON块捞出来,再修复常见问题,比如单引号改成双引号、去掉尾随逗号。如果还解析失败,就回退让模型重试,或者调高温度增加多样性。后处理延迟低,但可靠性有限,只能处理模式化的错误,碰到深层语义错误就没办法了。
所以你看,约束解码和后处理是互补的。真正落地时我倾向组合策略:核心链路用约束解码兜住格式,后处理捕获边缘case,再加上业务校验。比如订单异常处理场景,参数里涉及退款金额、商品ID,光格式对了不够,金额不能为负、ID得存在数据库里,这就要靠业务校验。
这里有个坑:约束解码的前提是模型本身能力够,如果模型一直卡在某个token上出不来,延迟会飙升。上线前我会特别关注TTFT和重试率,埋点监控格式错误率和修复成功率。如果连续失败,得准备降级预案,比如切到规则引擎或人工兜底。
另外,我最近在关注一个方向:怎么把约束解码和[[思维链]]结合起来,让模型在规划步骤时就预判参数合法性,而不是等到生成最后一步才发现格式不对。这个做好的话,能减少很多无效重试。
所以总结一下,我更倾向把工具调用的可靠性看成分层防御体系:生成时约束做第一道墙,后处理做第二道,业务校验做第三道。没有银弹,关键是根据场景选对组合,并且把监控和降级做到位。