📏 上下文管理
上下文窗口是 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 系统 |
- "Lost in the Middle":长上下文中间的 20%~80% 位置的信息容易被模型忽略。关键信息应放在开头或结尾。
- 注意力衰减:上下文越长,每个 Token 获得的平均注意力越低,导致细节遗漏。
- 推理成本爆炸:注意力计算复杂度 O(n²),100K Token 的成本远超 10K Token 的 10 倍。
- 延迟增长:长上下文的 Prefill 阶段延迟显著增加,影响交互体验。
- 提示注入风险:长上下文中的文档内容可能包含对抗性指令,绕过安全防护。
建议:不要盲目追求"塞满窗口"。即使模型支持百万 Token,最佳实践仍然是精简、结构化、有选择地使用上下文空间。