📏 上下文管理

上下文窗口是 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,最佳实践仍然是精简、结构化、有选择地使用上下文空间。