适用读者:上下文越用越乱、记忆越存越错、RAG 检索出来答不对的人。
前置:S21-J19(卷一–卷四)、S20-J05(上下文工程决策树)、S20-B01(RAG 流程)。
覆盖旧文:4887–4901(《Agent 工程》卷五–卷七,15 章:5.x 上下文边界 5 章 / 6.x 记忆 5 章 / 7.x 检索 5 章)。
扩展点:E-S21-035(上下文的四个失效模式:污染、遗忘、溢出、断点)、E-S21-036(记忆三层与"守门员":什么该记、冲突怎么办)、E-S21-037(RAG 四步与五类失败诊断)。
下一篇:待写(J21 · 卷八到卷十一):MCP、Skills、Loop 与多 Agent。
1. 一句话结论
上下文的问题不是"装不下",是"装错了"。压缩、记忆、检索三件事解决的是同一个问题的三个面:在正确时刻,让窗口里只留下正确的东西。
出处:
A-4887(5.1 上下文里到底装了什么)…A-4901(7.5 RAG 失败模式与诊断)。
2. 上下文的四个失效模式(E-S21-035)
| 模式 | 表现 | 处置 |
|---|---|---|
| 溢出 | 超窗口被截断,早先约束丢失 | 双路径压缩(摘要 + 落盘),先落盘再摘要 |
| 污染 | 早期错误结论被后续推理不断引用 | 隔离(子 Agent)+ 显式"作废"标记 |
| 遗忘 | 长任务里目标/约束漂移 | 状态栏 + 定期复述硬约束(见 §5) |
| 断点 | 换会话即失忆,无法续跑 | 结构化笔记落盘,Session ≠ Context |
"上下文里到底装了什么"(5.1):system 规则、工具定义、历史对话、检索片段、工具输出、当前任务。判据:先按"是否影响正确性"排序,再按"是否可再取"决定删留——可再取的(文档原文、工具输出)优先落盘,不可再取的(人类口头约束)必须常驻。
KV Cache 与成本(5.3):缓存只对稳定前缀生效。把时间戳、随机 ID、动态用户信息放系统提示最前面 = 每次都全量重算。判据:"会变的东西一律往后放"。
上下文污染与遗忘(5.4):错误一旦进入上下文,就会被后续步骤当作事实。处置:显式推翻("前面那条结论作废,原因是 X")比"不再提"有效——模型看不到"你已放弃"这件事。
3. 记忆:三层与守门员(E-S21-036)
短记忆:当前会话(窗口内)
长记忆:跨会话(用户偏好、项目事实)→ 需检索注入
外部记忆:文件/数据库/向量库(可审计、可更新、可删除)
| 章 | 结论 |
|---|---|
| 6.1 三层记忆 | 分层不是"越多越好",而是"按访问频率与寿命分层" |
| 6.2 MemGPT 思路 | 把上下文当内存:主上下文=RAM、外部存储=磁盘,靠"换页"扩容量 |
| 6.3 ChatMemory 到生产 | 从"存全部历史"到"存摘要 + 关键事实 + 检索" |
| 6.4 冲突与遗忘 | 同一事实多次写入需时间戳 + 来源优先级;被推翻的要标记而非删除 |
| 6.5 常见误区 | 记忆不是把历史都塞进去;全量历史 = 成本与噪声双高 |
守门员(gatekeeper)四问:
① 这条信息会不会影响未来决策?(否 → 不记)
② 它会过期吗?(会 → 记时间戳与失效条件)
③ 它与已有记忆冲突吗?(是 → 按来源优先级裁决,保留冲突记录)
④ 它敏感吗?(是 → 不记或加密,且可删除)
判据:"能删的记忆才是好记忆"——不可删除的记忆(写进提示词、写进微调)会变成永久污染源(见 §5 记忆即攻击面)。
长任务的交接(5.5):Session ≠ Context。会话是通道,上下文是内容。交接要交的是:目标、已完成、未完成、约束、下一步——五行足够,不需要完整历史。
4. RAG 四步与五类失败(E-S21-037)
① 切片(chunking)② 嵌入(embedding)③ 召回(retrieve)④ 重排(rerank)
| 步 | 取舍 | 判据 |
|---|---|---|
| 切片 | 固定长度 / 语义 / 结构(标题层级) | 按文档结构切优先;块间留重叠 |
| 嵌入 | 模型维度、多语言、领域适配 | 换模型必须重建索引(不可混用) |
| 召回 | 向量 / 关键词 / 混合 | 专有名词、编号、代码 → 必须加关键词检索 |
| 重排 | cross-encoder / LLM 判分 | 候选 20~50 条再重排,成本可控 |
五类失败诊断(7.5):
| 症状 | 归因 | 验证方式 |
|---|---|---|
| 检索命中但答错 | 块内缺语境("它""该值"指代丢失) | 人工读块:脱离原文能否看懂 |
| 检索不命中 | 切片错位 / 关键词缺失 | 用问题原文做关键词检索对照 |
| 命中旧版本 | 索引未重建 / 版本混存 | 查块元数据版本号 |
| 答非所问 | 重排缺失,噪声进上下文 | 对比重排前后 top-5 |
| 引用不存在 | 模型编造 | 强制"只答块内内容,附块 ID" |
Contextual Retrieval(6.5):给每个块补一段"它属于哪份文档、讲什么"的上下文再嵌入。原文称"失败率降约 2/3",该数字未在本环境复现,待核;方向上可靠(块脱离语境是主要失败源)。
知识库当代码库管(6.7 / 6.8):版本、变更记录、回滚、按目录组织(文件系统范式)。判据:"知识更新没有 diff,就等于没有更新"。
5. 记忆即攻击面(6.9 的工程结论)
| 攻击 | 机制 | 防护 |
|---|---|---|
| 知识投毒 | 往知识库写入恶意内容,检索后被当事实 | 写入审核、来源白名单、内容指纹 |
| 记忆持久化后门 | 诱导 Agent 记住"以后都这么做" | 记忆写入需人工确认;定期审计 |
| 跨用户污染 | 共享记忆空间混入他人数据 | 记忆按租户隔离,键空间带前缀 |
判据:"记忆是权限,不是缓存"——写入权限要收紧,读取要可审计。
6. 反例:八种"上下文越用越乱"
| 做法 | 后果 |
|---|---|
| 系统提示前置动态内容 | KV Cache 全失效,成本翻倍 |
| 工具输出全文回灌 | 溢出,早先约束被截断 |
| 早期错误不显式作废 | 污染整条推理链 |
| 全量历史当记忆 | 成本与噪声双高,关键事实被淹没 |
| 记忆只写不删 | 冲突累积,行为漂移 |
| 换嵌入模型不重建索引 | 召回质量断崖 |
| 只用向量检索查编号/代码 | 专有名词召回失败 |
| 不校验引用 | 编造引用无法发现 |
7. 自测
- 上下文四个失效模式与处置?
- 记忆三层各解决什么?守门员四问?
- 为什么"Session ≠ Context"?交接要交哪五项?
- RAG 四步的取舍判据?五类失败的验证方式?
- 为什么说"记忆是权限"?
答案
- 溢出→压缩落盘;污染→显式作废+隔离;遗忘→状态栏复述;断点→结构化笔记。
- 短/长/外部;四问:影响决策、是否过期、是否冲突、是否敏感。
- 会话是通道、上下文是内容;交目标、已完成、未完成、约束、下一步。
- 按结构切、换模型重建、专名加关键词、候选再重排;失败按块语境/关键词/版本/重排/引用逐项验证。
- 写入决定未来行为,等于授权;必须收紧写入、可审计、可删除。
8. 下一篇
待写(J21 · 卷八到卷十一)—— MCP 的两层结构与懒连接、Skill 的三段结构与渐进式披露、Loop 引擎与会话持久化、多 Agent 的天花板与并发代价。
本篇属于系列《S21 · Agent 与工具协议》。旧文来源:A-4887–4901(卷五–卷七 15 章);扩展点 E-S21-035…038。Contextual Retrieval 的"失败率降 2/3"为原文说法,未在本环境复现(待核)。