给模型接了一个日志查询工具,返回原始 20KB 日志,第二轮请求报 context_length_exceeded,之前几轮都正常,历史里还留着上一次的工具结果。

真正麻烦的地方在于,几个原因的现象几乎一样。工具结果原样进历史,单条就占几千 token;每轮都把旧工具结果重发,占用持续累积;没有对结果做摘要或截断;模型又基于长结果生成长回答,双向叠加。

量一下工具结果的实际 token

python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode(open('tool_out.txt').read())))"

随后对结果做头尾截断再回填

python -c "t=open('tool_out.txt').read();print(t[:2000]+'...'+t[-500:])"

历史里只保留结果的摘要

python -c "print({'role':'tool','content':'共 320 行,含 4 条 ERROR,首条时间 02:11'})"

第二轮重放验证不再超限

python replay.py --turn 2 --trim-tool-output 2500

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

别只看报错消失,验证要多做一步。第二轮请求返回 200,历史里工具结果长度稳定在 2500 字以内,回答仍然引用到关键行。

工具结果是上下文里最容易膨胀的部分,进历史前先摘要,比事后裁剪省事。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189