📏 上下文管理

上下文窗口是 Agent 最宝贵的资源——它承载了短期记忆、推理中间步骤和检索到的知识。如何高效管理有限的窗口空间,直接影响 Agent 的能力上限。

🎯 上下文管理的核心挑战

  • 容量有限:即使是最新的百万 Token 模型,窗口仍然是有限的
  • 成本递增:长上下文推理的注意力和计算成本随长度平方增长
  • 注意力稀释:关键信息淹没在大量无关内容中,模型容易"丢失重点"
  • 信息衰减:窗口中间位置的信息比首尾位置更容易被忽略("Lost in the Middle" 现象)

🪟 窗口滑动策略

窗口滑动(Sliding Window)是最基础也是最重要的上下文管理策略。当上下文超过预设阈值时,通过滑动窗口保留最近和最相关的信息。

滑动窗口示意

← 当前窗口 →
  • 旧消息超出窗口范围后被丢弃或压缩
  • System Prompt 和关键信息使用固定保留区(不参与滑动)
  • 新消息实时加入窗口尾部,触发滑动判断

滑动策略变体

策略机制优点缺点
FIFO 滑动 先进先出,最早消息优先丢弃 实现简单、开销低 可能丢失重要早期信息
重要性滑动 按消息的重要性评分决定保留/丢弃 保留关键信息 需要额外的评分机制
分段滑动 将窗口分为固定区、半固定区、滚动区 结构化、灵活 管理复杂度较高
注意力引导滑动 根据模型注意力分布动态决定保留内容 精准、自适应 实现复杂、额外开销

📝 摘要压缩

当对话历史过长,无法全部保留在窗口中时,摘要压缩(Summarization)将历史对话压缩为精炼的摘要,用少量 Token 承载关键信息。

📋 递归摘要

每次窗口将满时,对当前全部对话进行摘要,用摘要替换原始对话。新一轮对话从摘要+新消息开始。适用于长期对话。

🔑 关键信息提取

不保留完整对话流,只提取实体、决策、约束等结构化关键信息。信息密度最高,但可能丢失对话脉络。

📊 分层摘要

维护多层摘要:细粒度(最近 N 轮)、中粒度(按主题分段)、粗粒度(整体会话)。按需切换摘要层级。

🤖 LLM 辅助摘要

使用专门的摘要模型或同一 LLM 生成摘要。需要消耗额外的 Token,但摘要质量最高。可利用结构化 Prompt 引导摘要格式。

🎯 选择性保留

并非所有信息都同等重要。选择性保留策略对窗口中的每条信息进行价值评估,择优保留。

保留维度评估标准示例
相关性 与当前任务/查询的语义相关度 用户问"订单状态",保留订单相关对话,丢弃闲聊
新鲜度 信息的时效性和最近访问时间 优先保留最近 5 轮对话,更早的按需保留
信息量 包含的事实、决策、约束的密度 "会议定在周三下午3点" 比 "好的" 更有保留价值
持久重要性 跨会话的长期价值 用户偏好、项目约束、关键决策等跨会话知识
引用频率 被后续推理引用的次数 被多次引用的工具返回结果应保留更久

📐 结构化上下文

将上下文从"消息流"升级为结构化文档,可以显著提升模型的理解和检索效率。

🏷️ XML/JSON 结构化

用 XML 标签或 JSON 结构组织上下文,明确标识各部分的语义角色:<system>、<history>、<documents>、<task> 等。

📑 分区标记

使用明显的分隔标记将不同类型内容分区:系统指令区、对话历史区、知识库区、当前任务区。帮助模型定位信息。

🗂️ 层次化组织

按任务-子任务层次组织上下文,使用标题、列表、缩进等结构表达信息层级。适合复杂多步骤任务。

🔖 索引与目录

在上下文开头生成内容索引/目录,列出各部分内容摘要和位置。模型可通过索引快速定位相关信息。

📊 上下文管理方案对比

方案 信息保真度 Token 效率 实现难度 适用场景
无管理 极低 短对话、一次性任务
FIFO 滑动 一般对话 Agent
重要性滑动 较高 需要保留关键信息的任务
递归摘要 长期多轮对话
选择性保留 较高 较高 知识密集型 Agent
结构化上下文 较高 复杂多任务 Agent
混合方案(推荐) 生产级 Agent 系统
⚠️ 长上下文 Agent 的挑战
  • "Lost in the Middle":长上下文中间的 20%~80% 位置的信息容易被模型忽略。关键信息应放在开头或结尾。
  • 注意力衰减:上下文越长,每个 Token 获得的平均注意力越低,导致细节遗漏。
  • 推理成本爆炸:注意力计算复杂度 O(n²),100K Token 的成本远超 10K Token 的 10 倍。
  • 延迟增长:长上下文的 Prefill 阶段延迟显著增加,影响交互体验。
  • 提示注入风险:长上下文中的文档内容可能包含对抗性指令,绕过安全防护。

建议:不要盲目追求"塞满窗口"。即使模型支持百万 Token,最佳实践仍然是精简、结构化、有选择地使用上下文空间。