Agent 上下文管理与记忆系统设计
Laiyong Wang Lv6

一、上下文管理的本质

上下文生命周期的核心,是在 ReAct 循环中可干预上下文的时机窗口

如果不进行主动管理,上下文会持续“生长”,最终引发系统级问题,而不仅仅是性能变慢。


二、为什么必须管理上下文

常见误区:

“上下文变长只是变慢,可以用更多 token 解决”

实际情况:不干预会导致三类生产级崩溃:

1. 性能崩溃(Performance Collapse)

  • Token 超限,任务中断
  • 长任务无法持续执行
  • 重启后状态丢失

2. 逻辑崩溃(Logic Collapse)

  • 注意力稀释(Attention Dilution)
  • 重要信息被噪声淹没
  • 输出开始重复、矛盾、错误

Transformer 注意力复杂度为 O(n²),上下文越大,性能下降越明显(15%~47%)

3. 成本崩溃(Cost Explosion)

  • Token 成本线性增长
  • 工具调用结果堆积
  • 无效信息占据预算

三、三类典型上下文问题

1. Context Overflow(上下文爆炸)

问题:

  • 长时间运行导致 token 超限
  • Agent 被迫中断
  • 无法恢复历史状态

本质:

  • 上下文无限增长,没有上限控制

2. Context Rot(上下文腐烂)

表现:

  • 重复分析
  • 输出矛盾
  • 模型“变笨”

原因:

  • 注意力被稀释
  • 关键信息权重下降

3. Context Poisoning(上下文污染)

表现:

  • 错误信息被当作事实
  • 后续推理建立在错误基础上

本质:

  • 模型无法区分“真/假上下文”
  • 错误信息被持续引用

四、上下文管理的三大核心操作


1. Bootstrap(启动注入)

在 Agent 启动前,将必要信息注入 system prompt。

注入内容

(1)身份与规则(静态)

  • 角色定义
  • 行为约束
  • 工具使用规则

(2)状态与记忆(动态)

  • 历史摘要
  • 当前任务状态
  • 已知关键信息

2. 剪枝(Pruning)

核心目标

控制上下文膨胀,重点处理 Tool Result

关键原则

  • 对话内容:尽量保留(语义连续性)
  • 工具结果:优先裁剪(原材料性质)
  • 关键数据:先提取再删除(ID / 数值)

典型问题

  • 单次工具返回 10k+ tokens
  • 多轮调用导致上下文爆炸

3. 压缩(Compaction)

核心目标

将历史上下文转为摘要

触发时机(关键)

  • 推荐:30%~40% 上下文占用时
  • 错误做法:80% 才触发(为时已晚)

风险

  • 信息丢失(不可逆)

解决方案(Lossless策略)

  • 压缩前持久化关键数据(文件 / DB)
  • 压缩后仅保留摘要

五、文件记忆系统(File-based Memory)

1. 本质

Agent 可控写入的长期记忆系统(类似“技能库”)


2. 触发机制

(1)用户显式触发(推荐)

  • 用户主动要求记录
  • 信号明确,误判低
  • 最稳定方式

(2)Agent 主动触发

  • 通过 SKILL 描述定义触发条件
  • 适用于:
    • 用户偏好
    • 工作习惯
    • 行为模式

设计要点

  • 触发条件必须具体
  • 优先在“对话结束点”触发
  • 避免中途频繁写入

3. 局限性

文件记忆的三大崩溃点

(1)规模爆炸
  • memory.md 存在长度上限
  • 无法长期扩展
(2)语义查询困难
  • 无法处理模糊查询
  • 无法理解“上次那个…”
(3)维护成本高
  • 去重 / 更新 / 分类成本高
  • Agent 负担增加

六、搜索驱动记忆系统(RAG)

核心思想

从“全量加载” → “按需检索”


1. 为什么必须引入 RAG

解决文件记忆系统的三个问题:

  • 可扩展性
  • 语义检索能力
  • 维护成本

2. Embedding 选型原则

  • 查询与索引必须使用同一模型
  • 否则向量空间不一致,检索失效

3. Chunk 设计(关键)

影响远大于模型选型

  • Chunk 太大 → 语义稀释
  • Chunk 太小 → 上下文断裂

最佳实践

语义完整的最小单元(一个观点 / 一段对话 / 一个事件)


七、混合检索(Hybrid Search)

1. 组成

  • 向量检索(语义)
  • 关键词检索(BM25)

2. 查询执行流程

Step 1:Query 向量化

  • 使用 embedding 模型生成向量

Step 2:向量相似度搜索

  • 使用 HNSW(近似最近邻)
  • 时间复杂度:O(log n)
  • 精度损失 < 1%

Step 3:关键词评分

  • 使用 BM25(ts_rank)
  • 计算关键词匹配得分

Step 4:混合评分

score = 向量得分 × 0.7 + 关键词得分 × 0.3

Step 5:Top-K 召回

  • 按得分排序
  • 返回最相关结果

Step 6:注入上下文

  • 提取 summary / 关键信息
  • 转换为自然语言
  • 注入当前上下文

八、系统设计总结

上下文管理 = 必选项(不是优化项)

如果不做:

  • 一定会爆(只是时间问题)

推荐架构组合

  • Bootstrap(初始化)
  • Pruning(控制膨胀)
  • Compaction(摘要压缩)
  • File Memory(结构化记忆)
  • RAG(按需检索)

核心设计原则

  • 上下文必须“受控增长”
  • 信息必须“分层存储”
  • 检索必须“按需加载”
  • 写入必须“有策略”

一句话总结

Agent 的核心难点不是“让它更聪明”,而是“防止它随着运行时间变笨”