Agent 挂了 20 个工具,每个 schema 平均 150 token,每轮对话都要完整重发,单次请求输入从 1200 token 涨到 4200,成本直接翻了两倍。

一开始怀疑是「参数 schema 里塞了冗余示例」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。tools 数组每次请求都要完整传。也可能是工具描述字段写得过长。

少数情况下是前缀缓存没有命中。

量一次 tools 的 token 占用

python -c "import json,tiktoken;e=tiktoken.get_encoding('o200k_base');print(len(e.encode(json.dumps(json.load(open('tools.json')),ensure_ascii=False))))"

精简描述与示例 保留必填说明

python tools_lint.py --in tools.json --max-desc 60 --out tools_min.json

再往下按会话阶段动态挂载工具

python -c "print('mount tools per stage')"

等前面都确认过,再开启前缀缓存并验证命中

python bench_cache.py --prefix tools_min.json --n 5

那几天正好在做别的变更,先把时间线对齐才敢动手。

恢复的判定其实很直接。单次输入 token 降到 2500 以内,缓存命中后计费继续下降,工具选择准确率不变。

容易忽略的是,工具定义是常驻开销,轮数越多越明显,精简描述和动态挂载比压缩历史更划算。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189