多轮会话跑到第 96 条消息后,模型开始重复上一轮答案,输入 token 达到 31000。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

python -c "print(sum(len(m['content']) for m in msgs))"

历史消息只追加不裁剪,超出窗口后最早的指令被挤掉,模型失去任务约束。拼接时也没有做重要性排序。这一点先确认清楚,后面就不用反复试。

「上下文拼接超长」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

具体做法是,保留系统提示加最近 10 轮 其余摘要化;按 token 预算裁剪 不要按条数;摘要结果单独存 避免每轮重复计算;回归测试确认第 100 轮仍能正确回答。

改完照着核一遍,第 100 轮回答仍符合系统提示 输入 token 稳定在 8000 以内。

作者 9823189