跳到主要内容

错误的上下文管理模式

哪些看似合理的上下文管理会破坏缓存?​

模式做法主要危害
动态系统提示词每轮把时间戳、变量注入 system 消息整段后缀缓存失效,延迟与成本翻倍
动态用户配置每轮在上下文里更新余额、剩余调用次数同上;应改为按需的状态管理机制
工具定义动态排序按使用频率调整 tools 顺序工具定义篇幅大,首个变动工具起全部缓存失效
滑动窗口只保留最近若干条消息破坏前缀一致性并丢失关键工具结果
文本格式化把 role-content 结构压成纯文本流偏离训练格式,损害模型核心能力
  • 效果对比: 实验表明保持工具固定顺序对模型选择工具的能力几乎没有影响,对性能的提升却很显著;
  • 共同解法: 都收敛回 对缓存友好的三条核心原则;

滑动窗口为什么会引发重复工具调用?​

  • 机制: 窗口大小设为 10 时,第 11 条消息进来会丢弃最早一条;
  • 问题一: 破坏上下文前缀一致性,KV Cache 失效;
  • 问题二: 丢失关键的工具调用结果;
  • 实例: 第 2 轮调用文件读取工具拿到关键内容,第 15 轮仍需引用,但原始结果已滑出窗口,模型只能依赖被截断的对话推断;
  • 观察: 使用滑动窗口的 Agent 经常陷入循环,反复执行相同工具调用,因为它“忘记”了之前已获得的结果;
  • 结论: 错误率显著上升,代价远超省下的 token;

为什么文本格式化破坏性最大?​

  • 做法: 把结构化的 role-content 消息转换为 “USER: ... ASSISTANT: ...” 纯文本流;
  • 关键区别: 问题不在缓存,而在偏离模型训练时使用的标准消息格式;
  • 训练背景: 模型在训练阶段接触大量基于角色的对话数据,已学会解析这种结构化格式;
  • 额外负担: 消息变成纯文本后,模型需额外消耗注意力去推断角色边界与对话结构;
  • 症状: 重复执行已完成操作、忽略工具调用结果、该调用工具时却生成文本响应、格式解析错误;
  • 原因: 模型提供商为标准接口做了大量优化,偏离标准格式往往是在给自己挖坑;

应遵循哪些上下文管理纪律?​

  • 静态前缀只在设计期确定,运行期不做任何改写;
  • 动态信息一律以新消息追加到轨迹末尾;
  • 工具定义顺序与内容保持字节级稳定;
  • 需要控制长度时使用有损但有原则的 上下文压缩,而不是按条数截断;
  • 全程使用标准角色消息,不自行拼接字符串;