给模型接了一个日志查询工具,返回原始 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 字以内,回答仍然引用到关键行。
工具结果是上下文里最容易膨胀的部分,进历史前先摘要,比事后裁剪省事。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
