Kimi这次发新模型时提了一句其Turbo API 可以“保证 100% 的工具调用准确率”。
推友汉松对背后的原理做了解释:
“
Kimi 说他们的 tool-call 准确率能做到 100%,你可能会觉得这是什么黑科技。其实,背后的原理说穿了也很简单,就是给模型带上了一副“镣铐”,让它没法“说错话”。这副“镣铐”有个学名,叫“约束解码”。
想象一下你在玩填字游戏。有些格子里,你知道只能填某个字母,否则整个单词就错了。约束解码做的就是类似的事情。模型在生成每个词(token)的时候,都会提前算好,哪些词放在这里是“合规”的,哪些是“违章”的。然后,它会直接无视掉所有“违章”的选项,就像你根本不会考虑在那个格子里填一个错误的字母一样。
那模型怎么知道什么是“合规”的呢?你得先给它一本“规则手册”,比如告诉它“你现在必须说 JSON 格式的话”。模型拿到手册后,会把它拆解成一步步的小指令。比如,它知道 JSON 开头必须是 {,那么在第一步,它脑子里就只有 { 这一个选项,其他所有词都被暂时“拉黑”了。
写完 { 之后,规则手册又说了,下一个必须是引号 "。于是模型又把所有不是以 " 开头的词都屏蔽掉。就这样一步一步,每走一步,模型都只在“规则允许”的范围内选择。这就像一个新手司机,严格按照导航的每一步指令开车,绝不偏离路线。结果就是,它永远不会开到沟里去——也就是永远不会生成格式错误的输出。
所以,当你要模型生成一个 JSON 时,它不会自由发挥,说出像 Here is the JSON... 这样的话。它会被迫直接从 { 开始。这听起来有点“笨”,但却异常可靠。对于需要精确控制输出格式的任务来说,这种“笨办法”往往是最好的办法。
Kimi 在论文里面其实也提到他们使用的方法:参考了 lm-format-enforcer 的实现。
”