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 以内,缓存命中后计费继续下降,工具选择准确率不变。
容易忽略的是,工具定义是常驻开销,轮数越多越明显,精简描述和动态挂载比压缩历史更划算。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
