Appendix B 工具调用的 Token 模板

本文为论文《Kimi K2:面向智能体能力的开源大模型》「中文全文翻译」板块的对应章节,与「论文原文」板块同一章节一一对应,层级保持一致。

工具调用的 token 结构包含三个组件:

  • •

工具声明消息:定义可用工具列表以及参数的 schema;

  • •

助手消息中的工具调用部分:编码模型调用工具的请求;

  • •

工具结果消息:封装被调用工具的执行结果。

工具声明消息的原始 token 格式如下:

<|im_begin|> tool_declare <|im_middle|>

Tools

{{ tool declaration content }} <|im_end|>

蓝色高亮标记代表特殊 token,绿色部分(以括号括起)为工具声明内容。 我们使用 TypeScript 来表达工具声明内容,因为 TypeScript 是一种简洁且拥有完备类型系统的语言,能够以简练的文本表达工具参数及其约束。代码 1 展示了 以兼容 OpenAI 聊天补全 API 的 JSON 格式定义的两个简单工具的示例,作为对比,用 TypeScript 定义的相同工具(列于代码 2)则要简短得多。 为了提高兼容性,我们的部分训练数据也使用 JSON 作为工具声明语言,以便第三方框架无需额外开发即可支持我们的工具调用方案。

代码清单 1:兼容 OpenAI API 的 JSON 工具定义

代码清单 2:TypeScript 工具定义

模型响应消息中工具调用部分的 token 模板如下所列:

<tool_call_section_begin|> <|tool_call_begin|> // call_id part functions.{{tool name}}:{{counter}} <|tool_arguments_begin|> {{ json serialized call arguments }} <|tool_call_end|> <|tool_call_begin|> // more tool calls <|tool_call_end|> <|tool_call_section_end|>

如模板所示,我们支持并行工具调用,即在单个响应轮次中放置多个工具调用。 每个工具调用都有一个唯一的调用 id,格式为 functions.{tool-name}:{counter}, 其中 tool-name 是工具名称,counter 是对话中所有工具调用的从 0 开始自增的计数器。

在推理过程中,模型可能会偶尔生成意外的 token,导致解析工具调用时出现格式错误。为了解决这个问题,我们开发了一个名为 enforcer 的约束解码模块,其灵感来自 lm-format-enforcer77 7

https://github.com/noamgat/lm-format-enforcer。当生成 <tool_call_section_begin|> token 时,它会确保后续与工具相关的 token 遵循预定义模板,并且 JSON 参数字符串遵循所声明的 schema。

工具结果消息只是一个用工具的 call id 及相应结果编码的文本消息。

<|im_begin|> tool <|im_middle|>