- Kimi K3 动态加载工具把工具声明作为 system 消息插入 messages,替代全量堆在请求顶层 tools 字段,Kimi 第一方 Agent 产品适配后 ToolCall 相关 Token 下降约 70%,输入 Token 整体下降约 30%
- 动态加载工具不要求改造既有工具定义,同一份 schema 原样放入一条消息即可,迁移成本远低于 Anthropic 同类方案
- 基本用法:对话开始只挂 3-5 个核心工具,其余工具在模型需要时再注入,上下文里永远只躺真正相关的少量工具,模型选择从 50 选 1 变成 5 选 1
- 进阶用法:搭 tool search 循环,顶层只放一个 search_tools 元工具,模型需要哪种能力就搜哪种,命中的工具声明实时注入,工具总量再大也不膨胀每一轮请求
- 推理强度(reasoning_effort)三挡可配:low 最快响应、high 平衡性能与速度、max 最强推理。对简单任务用 low 可额外节省 Token,配合动态加载效果更好
- 社区真实反馈:K3 工具场景下动态加载是必须的,否则 Token 消耗在经济上不可持续;K3 对历史思考内容敏感,建议使用经过兼容性验证的 Agent 框架,避免会话中途切换到 K3
每个 Agent 开发者都遇到过的工具膨胀问题
做过 Agent 的人都知道,工具列表越挂越长是一件很难刹车的事。模型要读文件、改代码、跑命令、搜网页、查 GitHub、操作日历——每个能力就要挂一个工具。五十个工具不稀奇,一百个也不奇怪。
主流接入方式有一个隐蔽的假设:所有工具的声明,从第一轮对话起就全部躺在上下文里。每次请求的 tools 字段都原样带上全部工具的名称、描述和参数 schema,哪怕用户只是问了一声「今天天气怎么样」。
这笔开销有两部分。明面上是 token 成本——一个带嵌套参数的工具有时候轻松几百 token,五十个工具就是几十 k,再乘以每一次请求、每一个用户。更麻烦的是准确率也受影响:候选工具越多,模型越容易选错工具、编错参数,尤其是当工具名字长得像的时候。工具定义膨胀不只是费钱,它在持续拉低工具调用的成功率。
Kimi 自己的 Agent 产品也是典型例子,挂着大量工具,流量又大,这两个成本同时被放大。
动态加载工具为什么能省下这么多 Token
动态加载工具不是一个新概念,但 Kimi K3 把它做成了 API 层面的原生特性。核心动作只有一个:在对话过程中,把工具声明作为一条 system 消息插进 messages,而不是一次性全堆在请求顶层的 tools 字段里。这条消息插在哪个位置,工具就从哪个位置开始对模型可见,它和顶层 tools 的全局工具可以并存,声明格式与顶层完全一致。
对话开始时只挂三五个核心工具,其余的等真正用到时再注入。上下文里永远只有真正相关的少量工具,模型的选择题从五十选一变成五选一。Kimi 第一方 Agent 产品完成适配后的效果非常直接:ToolCall 相关的 token 下降了约 70%,输入 token 整体消耗下降了约 30%。这个数字在工具数量越多、工具定义越重的情况下越明显。
社区中也有开发者反馈,在使用 K3 做复杂的 Agent 任务时,如果挂载大量工具而不做动态加载,Token 账单会非常难看,199 元每月的套餐在重度使用下几天就能耗完。动态加载在这个场景下不是可选项,而是经济上必须做的事。
基本用法:把工具声明放进 messages 而不是 tools 字段
迁移到动态加载不需要改动任何既有的工具定义。现有的 schema 是什么样,原样放进一条 system 消息就是。写法上唯一的区别是:以前每次请求把几十个工具全部放在顶层 tools 数组里,现在只在顶层放三五个最核心、每轮必用的工具,其余工具定义按需作为消息插入。
具体来说,应用层需要维护一个工具注册中心,每个工具有名称、描述和参数 schema。模型回了一条需要某个工具的请求后,应用层把对应工具的完整声明拼成一条 role 为 system 的消息,插入到 messages 数组的适当位置。下一轮模型就能看到并使用这个工具。对话过程中累积使用的工具各自只出现一次,不会重复膨胀。
这里有一个和 Anthropic 同类方案的关键区别值得注意。Anthropic 的 Tool Search Tool 要求开发者为每个工具增加一个 defer_loading 字段来改造既有工具定义,而 Kimi K3 的方案不需要任何字段级别的改动,同一份 schema 原样使用,迁移成本几乎为零。
进阶用法:搭 tool search 循环让模型自己找工具
动态加载工具真正发挥价值的上限不止于手动管理工具注入。如果工具总量很大,比如几十上百个,靠开发者手动判断「哪个工具该在哪个时机注入」并不现实。
更实用的架构是在顶层只放一个由后端实现的 search_tools 元工具。模型在执行过程中需要某个能力时,先调用这个 search_tools 搜索,传一句自然语言描述当前需要的工具类型。你的应用收到搜索请求后,在内部工具库中检索出命中的工具,把它们的完整声明作为 system 消息注入 messages。模型在下一轮拿到这些工具定义后直接调用。这样无论工具总量有多大,每一轮请求里实际存在的工具声明都只有几个。
API 层面没有提供现成的 tool search 接口,这是有意为之——检索策略和具体业务强相关,自己实现几行代码的搜索逻辑比迁就一个通用的检索接口效果好得多。社区中的使用经验也印证了这个方向:在实际的 Agent 框架中,可以把工具搜索和分段注入变成一个可控的流程,先让模型输出详细计划,再按计划分阶段加载对应工具,配合分层路由,效果不错。
配合推理强度设定再省一笔
Kimi K3 的模型 API 支持 low、high 和 max 三挡推理强度设定。low 对应最快的响应速度,适合简单问题或者非关键判断;high 是性能与响应速度的平衡档;max 则启用最强的推理能力,适合复杂推理和多步规划。推理强度越高,模型思考越充分,Token 消耗也越大。
对有经验的 Agent 开发者来说,这提供了一个很实用的调优杠杆:对简单任务用 low 推理强度能省下大量不必要的思考 Token,对复杂任务再用 max 保证质量。把推理强度和动态加载工具组合使用,效果叠加——输入 Token 靠动态加载节省,推理 Token 靠推理强度控制,两层优化互不冲突。建议根据 Agent 任务的实际难度设置合理的推理强度,不做一刀切。
从社区反馈看动态加载的真实收益与适配注意点
从实际开发者的反馈来看,Kimi K3 在复杂 Agent 任务和代码重构场景下的表现确实强,但重度使用下 Token 消耗是一个不容忽视的现实问题。动态加载工具在工具数量超过一定规模的场景下是经济上必须的优化,而不是可选的加分项。
K3 本身有两个已知的局限性值得在集成时注意。一个是对历史思考内容敏感——K3 在后训练过程中全程使用思考历史保留模式,如果 Agent 框架没有回传全部历史思考内容,或者从其他模型正在进行的会话中中途切换到 K3,有可能引发上下文干扰,导致内容生成质量不稳定。建议使用 Kimi Code 等经过兼容性验证的 Agent 框架,并避免在会话中途切换模型。
另一个局限是 K3 可能过于主动——它的训练重点优化了长程、高难任务,在小问题或者用户意图模糊时可能会替用户做出非预期的决定。如果应用希望 Agent 更有边界感,需要在 system prompt 中对 K3 施加更明确的行为约束。动态加载工具本身能直接省钱提效,但这些系统层面的适配同样值得投入精力。