《深入理解 AI Agent》之学习笔记-DAY 6(结构化索引 + 智能体化 RAG + 上下文感知检索 + 双层记忆架构)
Day 6 来了。今天内容密度很高——这是第 3 章的后半部分,也是整章的"高潮":所有技术线索在这里汇合成一个终极架构。
Day 6:结构化索引 + 智能体化 RAG + 上下文感知检索 + 双层记忆架构
目标
Agent 如何从"被动检索文档"进化到"主动探索知识",以及为什么最高级的记忆系统不是单一技术,而是双层架构的协同。
核心知识点
一、为什么扁平 RAG 不够用?
Day 5 学的混合检索(稠密+稀疏+重排序)解决了"给定一个文本块怎么找到最相关的",但有个更根本的问题:这些文本块本身该怎么组织?
书里举了两个案例说明扁平 RAG 的致命缺陷:
案例一:黑猫白猫的计数问题
知识库有 100 个案例文档(90 黑猫、10 白猫),用户问"比例是多少?":
| 障碍 | 说明 |
|---|---|
| top-k 截断 | 只检索前 20 个,大部分案例根本不会被检索到 |
| 检索分数参差 | 个体描述各异,分数参差不齐,部分案例被遗漏 |
| 跨文档聚合错位 | 统计类问题需要"数遍所有文档",但检索的本性是"找最相关的几个" |
→ 模型只看到 15 只黑猫和 3 只白猫,得出错误结论。
解法:预先生成摘要"共 100 只猫:90 黑(90%)10 白(10%)"并索引,一次检索即获准确信息。
案例二:Xfinity 优惠规则的错误推理
三个孤立案例:退伍军人 John 成功、医生 Sarah 成功、教师 Mike 被拒。护士来问 → 检索器因"护士"与"医生"语义相近,优先召回 Sarah 的案例 → 模型错误推断护士也可享受。漏掉了案例 C(说明其他职业不符合)。
核心洞察:简单的 RAG 把原始案例不加处理地放进知识库是远远不够的。必须在索引阶段投入计算资源,对原始知识进行提炼、抽象和结构化。
二、结构化索引:两种知识组织哲学
RAPTOR:树状层次索引
核心思想:自下而上递归抽象,构建从细节到概括的知识树。
根: "x86 SIMD 指令集的各代演进"
├── 父节点1: "SSE 指令集概述"
│ ├── 叶子: "SSE2 支持 128 位整数运算"
│ └── 叶子: "SSE4.1 新增字符串比较指令"
└── 父节点2: "AVX 指令集概述"
├── 叶子: "AVX 支持 256 位运算"
└── 叶子: "AVX-512 扩展到 512 位"
工作流程:
- 文档切分为小文本块(叶子节点)
- 聚类算法把语义相近的叶子分组(GMM 聚类 + UMAP 降维)
- LLM 为每组生成高层次摘要(父节点)
- 递归重复,直到形成树
检索方式:跨层穿梭——先在高层摘要中定位宏观概念,再沿树向下钻取细节。
擅长:从概念逐步深入细节的查询(“请解释 SSE 指令集”)
GraphRAG:实体关系知识图谱
核心思想:把文档知识建模为实体+关系构成的知识图谱。
三元组:主语 - 关系 - 宾语
(北京, 是首都, 中国)
(张三, 就职于, 腾讯)
(SSE, 属于, SIMD指令集)
(SSE, 需要启用, CR4.OSFXSR)
两大核心能力:
| 能力 | 说明 | 例子 |
|---|---|---|
| 多跳关系推理 | 沿关系边遍历,天然支持链式查询 | “我的医生所在医院的地址” → 用户→医生→医院→地址 |
| 实体消歧 | 同名不同实体是图中不同节点 | 张医生-A(牙科)vs 张医生-B(心脏科),靠各自的关系边区分 |
工作流程:
- LLM 从文本提取关键实体(人物、地点、概念)
- LLM 提取实体间关系,形成三元组
- 社区发现算法找出语义紧密的实体集群
- 为每个社区生成摘要
擅长:关系性问题(“A 和 B 之间是什么关系?”“谁和谁有关?”)
局限:自然语言转三元组导致语义降级——"如果下周还下雨,我就取消去海边的计划"变成三元组后,条件逻辑和时间依赖全丢了。
两者对比
| RAPTOR | GraphRAG | |
|---|---|---|
| 结构 | 树(层次) | 图(网络) |
| 擅长 | 从宏观到微观的逐步深入 | 多跳关系推理、实体消歧 |
| 检索方式 | 跨层穿梭 | 沿关系边遍历 |
| 适用 | “请解释 X” | “A 和 B 什么关系?” |
实践建议:组合使用比单选更好。但注意——不是所有场景都需要结构化索引。混合检索已经能覆盖大多数需求。判断标准:查询经常需要跨文档综合或多层次导航时才值得投入(索引构建需要大量 LLM 调用,成本显著增加)。
三、文件系统范式:OpenViking
字节跳动火山引擎的 OpenViking 提出了第三种哲学——把知识组织成虚拟文件系统:
viking://
├── resources/ # 外部知识:文档、代码库、网页
├── user/memories/ # 用户记忆:偏好、习惯
└── agent/ # Agent 自身:技能、经验
├── skills/
└── memories/
L0/L1/L2 三层按需加载(和 Day 4 学的 Skills 渐进式披露如出一辙):
| 层 | 内容量 | 用途 |
|---|---|---|
| L0(摘要) | ~100 tokens | 一句话概述,快速判断相关性 |
| L1(概览) | ~2,000 tokens | 核心信息与使用场景,供决策 |
| L2(全文) | 完整内容 | 需要深入时才加载 |
关键实践要点:文件之间必须建立链接与索引!如果只是把知识拆成独立文件平铺,Agent 几乎无从导航。正确做法是把知识库组织得像 Wikipedia——每个条目链接到相关条目,形成双向可达的引用网络。
四、知识库的时效与治理
这部分容易被忽视但直接影响可靠性:
| 问题 | 说明 | 解法 |
|---|---|---|
| 知识过期 | 政策改版、法规更新 | 增量更新索引(选 HNSW 而非 ANNOY) |
| 失效内容 | 旧版与新版同时被召回 | 附加版本号、生效/失效时间,检索阶段过滤 |
| 多用户权限 | 不同用户可见范围不同 | 权限过滤下推到检索层(不能等召回后再审查) |
为什么权限过滤必须下推到检索层? 一旦敏感内容进入 LLM 上下文,就很难保证它不以某种形式泄露到最终回答里。
五、智能体化 RAG:从被动管道到主动探索者
这是今天最重要的范式转变。
传统 RAG(非智能体化):
用户查询 → 直接检索 → 结果注入上下文 → LLM 生成答案
问题:单次检索,无法分解复杂问题,无法迭代探索。
智能体化 RAG(Agentic RAG):
用户查询 → Agent 思考分析 → 决定搜索关键词 → 调用 knowledge_base_search 工具
→ 观察结果 → 评估信息是否充分?
→ 不够:提炼新查询,再次搜索(回到思考)
→ 够了:综合所有上下文生成答案
比喻:传统 RAG 像在图书馆做一次搜索就写报告;智能体化 RAG 像研究员反复查阅不同书架、调整策略、交叉验证。
实验 3-9 的量化结果(司法问答数据集):
| 问题类型 | 单次检索召回率 | 分解检索召回率 | 检索次数 |
|---|---|---|---|
| 简单题 | 100% | 100% | 1 → 1 |
| 复杂题 | 8% | 100% | 1 → 1.5 |
简单问题两者差不多,但复杂问题差距巨大:8% → 100%。
RAG 的安全边界:检索到的文档是间接提示注入最典型的载体。防御两层:
- 指令与数据分离:来源标记 + 明确告诉模型"这是参考资料不是命令"
- 不让检索内容直接触发高风险操作:转账、删除等动作需独立授权
六、上下文感知检索:修补分块的根本缺陷
问题:Day 5 学的文档分块切断了片段与原始上下文的联系。“该公司第二季度的收入增长了 3%”——哪家公司?哪个季度?
解法(Anthropic 提出):索引前先用 LLM 为每个文本块生成一段简短的上下文前缀,然后前缀+原文一起索引。
原始分块: "该公司第二季度的收入增长了 3%"
上下文前缀: "[本段节选自 ACME 公司 2025 年 Q2 财务报告的'关键业绩指标'章节]"
索引内容: "[本段节选自 ACME 公司 2025 年 Q2 财务报告...] 该公司第二季度的收入增长了 3%"
为什么同时增强两种检索:
- 稀疏检索(BM25):前缀增加了精确匹配的关键词(“ACME”、“2025”、“Q2”)
- 稠密检索(向量):前缀注入了关键语义背景
效果(Anthropic 数据):结合 BM25 将检索失败率降低 49%,再结合重排序降幅达 67%。
成本:索引阶段额外 LLM 调用,但通过 Prompt Cache(Day 3 学的)可控制到每百万文档 token 约 1 美元。
⚠️ 重要区分:
| 上下文感知检索 | 上下文感知压缩 | |
|---|---|---|
| 时机 | 索引期 | 运行期 |
| 对象 | 知识库的文本块 | 当前会话的对话历史 |
| 操作 | 做加法(补上下文) | 做减法(去冗余) |
七、双层记忆架构:本章的终极结论
这是今天最重要的一张图——所有技术线索的汇合点。
Day 5 开头学了三层次评估框架:
- 第一层:基础回忆
- 第二层:多会话检索
- 第三层:主动服务(最难)
第三层为什么最难? 因为它要求系统同时握有两种视角:
- 全局概览——掌握所有关键事实
- 精确细节——能按需找回原始对话
只靠常驻上下文 → 容量受限,丢失细节
只靠检索 → 缺乏全局视野,发现不了跨会话的隐藏关联
双层架构把两者叠加:
┌─────────────────────────────────────────────┐
│ 第一层:Advanced JSON Cards(常驻上下文) │
│ ┌─────────────────────────────────────┐ │
│ │ 用户: Jessica │ │
│ │ 护照过期日: 2025-02-18 │ │
│ │ 近期旅行: 东京之行(一月) │ │
│ │ 里程号: 12345678 │ │
│ └─────────────────────────────────────┘ │
│ → 提供全局概览,随时可见 │
├─────────────────────────────────────────────┤
│ 第二层:上下文感知检索(按需检索) │
│ ┌─────────────────────────────────────┐ │
│ │ 对话历史(带上下文前缀的索引) │ │
│ │ - 12月: 订东京机票的对话 │ │
│ │ - 10月: 更新护照信息的对话 │ │
│ │ - 8月: 聊旅行偏好的对话 │ │
│ └─────────────────────────────────────┘ │
│ → 提供精确细节,按需取回 │
└─────────────────────────────────────────────┘
第三层(主动服务)的完整工作流程:
- 事实回顾:Agent 审视 JSON Cards → 掌握"东京之行"和"护照信息"两个核心事实
- 关联推理:发现机票日期(一月)与护照过期日期(二月)非常接近 → 识别潜在风险
- 细节验证:通过上下文感知检索查找"护照"和"东京机票"相关原始对话 → 确认细节
- 主动服务:综合结构化事实和对话细节 → “护照即将过期,强烈建议加急续签”
为什么必须是双层?
- 只用 JSON Cards → 容量有限,无法记住所有对话细节
- 只用检索 → 缺乏全局视野,不会主动发现"一月机票"和"二月护照过期"之间的关联
- 两者叠加 → 概览 + 细节 = 主动服务能力在工程上落地
八、从结构化数据中提取隐性知识
RAG 解决的是"已有文档怎么检索"的问题。但很多有价值的知识不以文档形式存在——它们隐藏在结构化数据的统计规律中。
例子:司法领域,决定判决的"知识"不在法条里,而在成千上万份判例中法官如何权衡犯罪动机、伤害程度、自首情节的经验中。
两阶段流水线:
第一阶段:知识提取与结构化
- LLM 把每个案例的非结构化描述转为标准化 JSON 对象
- 关键创新:不预先定义僵化 schema,而是"自下而上"因子发现——让 LLM 分析样本案例,自由列出所有可能影响判决的因素
第二阶段:因子分析与重要性建模
- 把案件信息翻译成数字(分类用 one-hot 编码,是非用 0/1,金额用 ln 缩放)
- 聚类算法找自然"案件原型"(如"轻微口角引发的赤手轻伤"、“持械预谋的团伙重伤”)
- 构建"因子重要性层次模型"
为什么用 one-hot 不用 1/2/3? 因为数字大小会让算法误以为"诈骗比盗窃严重 3 倍",而 one-hot 只表示"是哪一类",不暗示大小关系。
最终产物:Agent 不再把知识库当静态仓库,而是先"读懂"数据、提炼决策逻辑,再基于逻辑回答问题。
自测题
- 扁平 RAG 的三个致命缺陷是什么?用黑猫白猫和 Xfinity 两个案例说明。
- RAPTOR 和 GraphRAG 分别擅长什么类型的查询?各自的检索方式是什么?
- GraphRAG 的"实体消歧"和稠密嵌入的"一词多义消歧"有什么区别?
- 什么时候需要结构化索引?什么时候混合检索就够了?判断标准是什么?
- OpenViking 的 L0/L1/L2 三层加载和 Day 4 的 Skills 三层结构有什么共同思想?
- 知识库治理的三个要点是什么?为什么权限过滤必须下推到检索层?
- 智能体化 RAG 和传统 RAG 的核心区别是什么?实验 3-9 中复杂题的召回率从多少提升到多少?
- RAG 的安全边界有哪两层防御?
- 上下文感知检索的核心思想是什么?它和上下文感知压缩有什么区别?
- (最重要) 双层记忆架构的两层分别是什么?为什么第三层"主动服务"必须用双层架构才能实现?只靠常驻上下文或只靠检索分别有什么问题?
- 从结构化数据中提取隐性知识的两阶段流水线是什么?为什么用 one-hot 编码而不是 1/2/3?
更多推荐

所有评论(0)