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 的核心难点不是“让它更聪明”,而是“防止它随着运行时间变笨”

$li-margin-bottom = 0.8rem $post-tool-button-width = 2.5rem .post-tools-container { padding-top var(--component-gap) .post-tools-list { li { margin-bottom $li-margin-bottom &:last-child { margin-bottom 0 } } li.tools-item { position relative box-sizing border-box width $post-tool-button-width height $post-tool-button-width color var(--text-color-3) font-size 1.2rem background var(--background-color-1) border-radius 50% box-shadow 2px 2px 5px var(--shadow-color) cursor pointer &:hover { box-shadow 2px 2px 8px var(--shadow-hover-color) } i { color var(--text-color-3) } &:hover { color var(--background-color-1) background var(--primary-color) i { color var(--background-color-1) !important } } &.toggle-show-toc { display none } &.go-to-comments { .post-comments-count { position absolute top 0 right -1rem display none align-items center justify-content center box-sizing border-box min-width 1.1rem height 1.1rem padding 0 0.2rem color var(--badge-color) font-size 12px background var(--badge-background-color) border-radius 0.4rem +keep-tablet() { display none !important } } } } li.status-item { width $post-tool-button-width height $post-tool-button-width color var(--text-color-3) font-size 1.6rem cursor pointer &.post-lock { cursor default .fa-lock-open { display none color var(--keep-success-color) } &.decrypt { cursor pointer .fa-lock-open { display block } .fa-lock { display none } } } } } }