前沿架构 · 多模态与 Agentic RAG

多模态 RAG 与 Agentic RAG 架构前沿 —— 从失效边界到未来演进

一、全局性问题的语义断裂:传统 RAG 为何回答不了"总结全篇"

过去两年,RAG 架构的工程实践已经从"能用"走向"够用",但当用户开始提出"请总结这一百篇财报的共性风险"、"梳理这份千页法规的历史演进"、"对比十份合同的关键条款"这类问题,传统 chunk-based RAG 系统的失效模式会集中爆发。这一章我们从架构师视角剖析传统 RAG 在全局性问题上的根本性局限——这不是一个"调参能解决"的问题,而是范式层面的边界。

1.1 问题的本质:检索的"局部最优"与答案的"全局视野"矛盾

传统 RAG 的核心抽象是"以 chunk 为最小检索单元"。每份文档被切分成 200-1000 token 的文本块(chunk),每个 chunk 独立 Embedding 后入库,查询时取 Top-K 相似 chunk 送入 LLM 生成。这个抽象在"事实型问答"场景下表现优异——问题"公司去年营收多少",向量检索能精准定位到包含该数据的 chunk。然而,当问题从"事实查询"升级为"全局聚合"时,这一抽象的边界立刻显形。

"全局性问题"在架构上有三个共性特征:第一,答案分布稀疏,关键信息分散在数十甚至数百个 chunk 中,Top-K 召回天然遗漏;第二,答案形态抽象,用户要的不是某个数字,而是经过聚合、归纳、对比、推理后的总结;第三,上下文依赖强,任何一个 chunk 脱离了全局视角都会丢失语义。例如"对比近五年财报中的研发投入趋势"——单一 chunk 中可能仅有一年的数据,而"趋势"这个概念必须在五年数据并置后才能浮现。

传统 RAG 在全局性问题上的失效链路
═══════════════════════════════════════════════════════════════

  用户 Query ──► Query Embedding ──► Top-K 检索
       │              │                   │
       │              │                   └─► 召回 5~20 个 chunk
       │              │                              │
       │              ▼                              ▼
       │       语义鸿沟(改写可缓解)         局部最优 / 信息碎片
       │                                          │
       ▼                                          ▼
  全局聚合型问题                              LLM 拼接
  (需要 N 份文档整体信息)                    答非所问 / 幻觉
                                                │
                                                ▼
                                          答不全 / 答偏 / 编造
                                                │
                                       架构师只能改 prompt 加约束
                                       (治标不治本)

1.2 架构层面的四个失败模式

把全局性问题的失效模式拆开看,至少有四种相互独立的失败路径:

失败模式 A:召回不全(Recall Bottleneck)。Top-K 检索假设"答案集中在少数 chunk",但全局性问题的答案信息散落在数百个 chunk 中。即使把 K 设为 100,也只覆盖了文档的极小一部分,且 ANN 索引在 K>50 后精度快速下降。漏召的 chunk 不会出现在 LLM 的上下文中,于是模型要么"无中生有"补全,要么干脆承认"信息不足"。

失败模式 B:位置遗忘(Lost in the Middle)。Liu 等人 2023 年的论文《Lost in the Middle》揭示了 LLM 的一个反直觉行为:长上下文中位于中段的 chunk 利用率显著低于首尾。这一现象在 200K token 的 GPT-4 / Claude / Gemini 上依然存在。RAG 把 20 个 chunk 塞进 Prompt 后,真正被"看见"的只有前 5 个和最后 5 个——中段的 10 个 chunk 形同虚设。

失败模式 C:聚合无能(No Aggregation Primitive)。LLM 本身有强大的局部推理能力,但缺乏对多个 chunk 间的"结构化聚合"原语。当用户问"前十份合同中违约条款的共性"时,模型需要:识别每份合同中的违约条款 chunk → 提取共性要素 → 归纳总结。这一连串操作需要明确的工作记忆和显式的"聚合算子",而传统 RAG 把所有 chunk 平铺在 Prompt 里,模型只能"软性地"在 attention 中聚合,缺乏稳定的算子。

失败模式 D:引用不可定位(Citation Opacity)。全局性问题的答案涉及多个来源,传统的"返回一个引用片段"的引用机制无法处理。当答案"研发投入连续三年下降"由三份财报的六个段落共同支撑时,引用要么冗长到无法阅读,要么简化为模糊的"多份文件表明"——可解释性大打折扣。

失败模式 触发条件 表层症状 架构层根因
召回不全 Recall Bottleneck答案信息散落 N≥50 chunk答不全 / 漏掉关键点Top-K 检索是局部最优
位置遗忘 Lost in the MiddleContext > 20 chunk中段 chunk 被忽略LLM 长上下文注意力不均
聚合无能 No Aggregation需要多 chunk 归纳答非所问 / 强行拼接缺乏结构化聚合算子
引用模糊 Citation Opacity多文档交叉引用引用堆叠 / 来源不清单点引用机制不适用

1.3 解决路径的三层架构演进

面对全局性问题的失效,工业界在过去一年探索出三条相互正交的解决路径,可以叠加使用:

路径 1:上下文压缩与精炼(Context Distillation)。在向量检索之后、LLM 推理之前,增加一个"压缩"环节——用一个小模型或 prompt 把 N 个 chunk 压缩成 M 个"摘要 chunk",M 通常为 3-5。这种"二次压缩"能在保持信息密度的同时大幅缩短上下文,缓解 Lost in the Middle 问题。Microsoft GraphRAG 的社区摘要、LongLLMlingua 的提示压缩都是这条路径的代表。

路径 2:分层索引与导航(Hierarchical Index)。放弃"扁平 chunk"假设,建立"文档 → 段落 → 句子"的三层索引。检索时先在文档层做粗排,定位到相关文档;再在段落层做精排,定位到相关段落;最后才进入 chunk 层。RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval)论文提出的树形摘要索引是这条路径的典范。GraphRAG 的"实体-关系-社区"图谱则是更激进的层级化方案。

路径 3:Agentic 检索规划(Agentic Retrieval)。把"一次性 Top-K 检索"升级为"多轮 Agent 决策"——一个 LLM Agent 评估当前信息是否足够,如果不够则生成下一轮查询。整个检索过程变成一个 ReAct / Plan-and-Execute 循环,每轮检索都基于前轮结果进行 Query 改写与文档筛选。Self-Ask、IRCoT、ReAct 检索链都是这条路径的具体实现。

全局性问题的三层解决路径架构
═══════════════════════════════════════════════════════════════

用户 Query: "对比近五年财报的研发投入趋势"
                         │
        ┌────────────────┼────────────────┐
        ▼                ▼                ▼
   路径1 压缩         路径2 层级         路径3 Agent
   ┌─────────┐      ┌──────────┐      ┌──────────┐
   │Top-K N  │      │文档粗排  │      │ 规划阶段  │
   │→ 摘要M  │      │→ 段落精排│      │→ 多轮检索│
   │(M=3~5)  │      │→ chunk   │      │→ 自适应  │
   └────┬────┘      └────┬─────┘      └────┬─────┘
        │                │                │
        └────────────────┼────────────────┘
                         ▼
                   LLM 推理生成
                         │
                         ▼
                  趋势归纳 + 引用标注

1.4 架构师视角的判断标准

作为架构师,面对"全局性问题"时必须先做一个判断:这道题的答案信息量是否集中在少数 chunk?如果答案是 yes(例如"找出现金流为负的年份"),传统 RAG 加 Query 改写 + Rerank 就够;如果答案是 no(例如"对比近五年研发投入的策略变化"),就必须引入聚合原语——选 GraphRAG(适合关系型全局问题)还是 Agentic RAG(适合多步骤推理问题)?

核心观点:全局性问题的失效不是"调优"问题,是"范式"问题。Top-K 检索的"局部最优"假设在全局问题下不成立。架构师必须从"压缩"、"层级化"、"Agent 化"三条路径中至少选择一条重构索引与检索流程,单纯靠加大 K 值、加长 Context 只会让 Lost in the Middle 问题更严重。

二、多跳推理的检索漂移:当答案需要跨越五份文档

如果说全局性问题挑战的是"信息广度",多跳推理挑战的就是"逻辑深度"。当用户的问题需要"先查 A,再查 B,最后用 A 和 B 共同得出 C"时,传统 RAG 的"单次 Top-K 检索"几乎必然失败——这不是检索质量的问题,而是检索流程本身就缺乏多步推理的算子。本章从架构层面剖析多跳推理崩塌的根因,并梳理主流的解决方案谱系。

2.1 多跳问题的定义与典型形态

多跳问题(Multi-hop Question)的核心特征是:答案不能从单一文档中直接获得,必须经过多个文档 / 实体的链式推理。典型形态包括:

桥接型多跳:A 文档提到 X,B 文档提到 Y(X→Y 关系),C 文档提到 Z(Y→Z 关系),问题问 Z。每一跳都需要新的检索动作。例如:"2020 年诺贝尔物理学奖得主的研究生导师的妻子写过什么小说?"——需要在"得主→导师→导师妻子→妻子作品"之间跳转四次。

比较型多跳:A 文档和 B 文档各包含一个事实,需要对比后才能得出结论。例如:"比亚迪和宁德时代的电池专利数,谁更多?"——需要分别检索两家公司的专利数据,再做数值对比。

反事实型多跳:基于已有事实进行反事实推理。例如:"如果当年没有收购 X 公司,今天的市值应该是多少?"——需要先检索 X 公司的财务数据,再做反事实推算。

这三类多跳问题对 RAG 的挑战程度递增。桥接型最容易工程化(明确跳转路径),比较型次之(需要聚合算子),反事实型最难(需要 LLM 自身具备推理能力)。

2.2 检索漂移:多跳推理的隐形杀手

多跳 RAG 的根本性挑战是"检索漂移"(Retrieval Drift)——第一跳检索可能成功,但第二跳基于第一跳的"中间答案"做 Query 改写时,改写后的 Query 偏离了用户原始意图,第三跳进一步放大漂移,最终在第 N 跳时检索到完全无关的文档。

检索漂移的链式放大效应(数值示意)
═══════════════════════════════════════════════════════════════

  跳数     用户意图匹配度     检索精度    累积误差
  ─────────────────────────────────────────────────
   1            100%           90%        0.00
   2             85%           80%        0.15
   3             65%           65%        0.34
   4             45%           50%        0.55
   5             30%           35%        0.70
   6             20%           25%        0.80
   7             12%           18%        0.88
   8              8%           12%        0.92

  结论:经过 5 跳以上,累积误差已让检索结果完全偏离用户意图。
        传统"单次 Top-K"假设完全不成立。

检索漂移的根因有三个层面:Query 改写的信息损失——把"X 的研究生导师的妻子"改写为"X 的导师妻子"时丢失了"研究生"这个限定关系;中间答案的语义偏移——第一跳检索到的"X 的导师是 Y"是正确事实,但 Y 这个实体在 Embedding 空间的位置可能与用户实际想找的内容有偏移;累积噪声——每一跳都可能引入少量错误,多跳后形成雪崩效应。

2.3 传统 RAG 的三种失效模式

具体到工程实现,传统 RAG 在多跳问题上有三种典型失效:

失效 A:一次性检索抓瞎。把多跳问题直接喂给 Query Embedding,希望"一次 Top-K 检索"能召回所有相关文档。事实是 Top-K 检索的目标是"语义相似",而多跳问题中第一跳的答案(X 的导师是 Y)与用户 Query 之间的语义相似度可能并不高——检索器会优先返回与"X 的研究生导师的妻子"字面相似的内容,而不是"Y 这个人的信息"。

失效 B:全文档塞 Prompt。另一种"暴力"做法是把所有候选文档全部塞进 Context,让 LLM 自己判断"哪些信息相关"。这种做法在 N>10 时立刻崩盘——既会触发 Lost in the Middle,又会让 LLM 在海量信息中迷失。

失效 C:检索-推理割裂。传统的 retrieve-then-read 流程把"检索"和"推理"分得很清楚——先用向量检索找文档,再把文档喂给 LLM 推理。这种割裂在单跳问题下没问题,但在多跳问题中,推理过程需要"动态决定下一步检索什么"——而 retrieve-then-read 没有给 LLM 这个接口。

失效模式 触发条件 症状 架构层根因
一次性检索抓瞎多跳问题 / 实体未在 Query 中召回文档不相关Query 与中间答案语义不匹配
全文档塞 Prompt不知道该检索哪些文档Lost in the Middle缺乏文档筛选机制
检索-推理割裂需要动态决定下一步推理链断裂检索缺乏 planning 接口

2.4 解决路径谱系:从 IRCoT 到 ReAct 到 Plan-and-Execute

针对多跳问题,业界演化出一条清晰的解决路径谱系:

第一代:IRCoT(Interleaving Retrieval with Chain-of-Thought)。把 CoT(思维链)与检索交替进行——每一步 CoT 推理后,根据当前推理结果生成下一跳的 Query,再进行检索。IRCoT 用"推理→检索→推理→检索"的交替模式打破了一次性检索的局限。

第二代:Self-Ask / ReAct。Self-Ask 让 LLM 在推理过程中显式生成"我需要问什么",触发检索;ReAct 把"思考(Reasoning)"和"动作(Acting,包括 Search)"显式分开,每一步都有 Thought-Action-Observation 三个槽位。这两种范式在多跳问题上的表现显著优于 retrieve-then-read。

第三代:Plan-and-Execute RAG。把多跳问题拆解为"先规划后执行"两阶段——第一阶段用一个 LLM 生成完整的检索计划(一个步骤列表),第二阶段按计划逐步执行。Plan-and-Execute 在长链路问题上比 ReAct 更稳定,因为它把"决策"和"执行"解耦,决策错误不会污染执行上下文。

第四代:Agentic Multi-Agent 协作。在第三代基础上引入多个 Agent 分工——检索 Agent、推理 Agent、评估 Agent 协作。Multi-Agent 架构能处理更复杂的多跳问题,但代价是 token 消耗和延迟显著上升。

多跳 RAG 范式演进
═══════════════════════════════════════════════════════════════

  2020    Naive RAG              一次检索 + 一次生成
   │       │                      ❌ 多跳问题
   ▼       ▼
  2021    Retrieve-then-Read     检索→Prompt→LLM
   │       │                      ❌ 检索-推理割裂
   ▼       ▼
  2022    IRCoT                  推理↔检索交替
   │       │                      ⚠️ 仍可能漂移
   ▼       ▼
  2023    Self-Ask / ReAct       显式 Thought-Action-Observation
   │       │                      ✅ 多跳可行
   ▼       ▼
  2024    Plan-and-Execute       规划→执行解耦
   │       │                      ✅ 长链路稳定
   ▼       ▼
  2025    Multi-Agent RAG        检索/评估/生成 Agent 协作
   │       │                      ✅ 复杂多跳
   ▼       ▼
  2026+   Adaptive Agentic RAG   自适应路由 + 自我反思
                                    ✅ 自演进

2.5 架构师选型:何时用哪一代

四代范式不是替代关系,而是叠加关系。架构师应根据问题复杂度选择"够用"的方案:

1-2 跳 / 简单事实链:用 Self-Ask 即可。LLM 显式生成"我需要查 X",触发单次检索,再基于结果回答。token 消耗低,延迟低。

2-4 跳 / 中等复杂度:用 ReAct 或 Plan-and-Execute。ReAct 适合"边推理边检索"的开放场景,Plan-and-Execute 适合"步骤明确"的封闭场景。

4+ 跳 / 复杂研究问题:用 Multi-Agent 协作。检索 Agent 负责查资料,推理 Agent 负责综合,评估 Agent 负责质量校验。三 Agent 协作能处理 DeepResearch 类问题。

未知复杂度 / 通用场景:用 Adaptive Agentic RAG。引入一个 Router Agent 评估问题复杂度,自动选择执行路径(单跳/多跳/Agentic)。这是 2026 年的主流方向。

核心观点:多跳推理的失败不是"检索不够准"的问题,而是"检索流程缺乏多步规划能力"的问题。架构师必须从 retrieve-then-read 的"单步"思维转向 retrieve-plan-execute 的"多步"思维。范式跃迁的代价是 token 消耗和延迟上升 5-10 倍,但答案质量提升 30%+,对深度研究类问题物超所值。

从演进路径看,每一次范式跃迁都对应一个具体的"边界突破"——从"事实型查询"到"全局聚合",从"单步检索"到"多步推理",从"文本检索"到"多模态融合"。架构师在选型时,本质是在"匹配业务问题与范式能力"。

flowchart LR A[/2020 Naive RAG/] --> B[/2022 Advanced RAG/] B --> C[/2023 Modular RAG/] C --> D[/2024 GraphRAG/] D --> E[/2025 Agentic RAG/] E --> F[/2026+ 自适应 RAG/] style A fill:#e5f5ff style F fill:#ffe5cc

演进图谱清晰可见:每代 RAG 都试图突破前代的某个具体边界,向"更强问题解决能力"演进。

架构师从这两个核心问题上看到的是:传统 RAG 的"局部最优"假设在全局问题下彻底破产。这一判断驱动我们去寻找新的范式——后面章节介绍的 GraphRAG、Agentic RAG 都是对这一困境的不同回应。

flowchart TB A[/用户 Query/] --> B[/Query 改写/] B --> C[/Embedding/] C --> D[/Top-K 检索/] D --> E[/LLM 生成/] E --> F[/答案/] D -.空召.-> G[/拒绝回答/] E -.幻觉.-> H[/编造内容/] style G fill:#ffe5e5 style H fill:#ffe5e5

这一架构图揭示了传统 RAG 的两大主要失效模式——空召和幻觉——都源于"局部最优"的检索假设。

理解这一失效链路是架构师的基础功。传统 RAG 的"局部最优"假设在全局问题下不成立,这是后面所有新范式(GraphRAG、Agentic RAG)的出发点。

flowchart LR A[/用户 Query/] --> B[/Query Embedding/] B --> C[/Top-K 检索/] C --> D[/5-20 chunk/] D --> E[/LLM 拼接生成/] E --> F[/答非所问/] style F fill:#ffe5e5

从架构师视角,失效链路是问题分析的第一步——看清哪一环崩溃,才能针对性设计解决方案。

三、视觉信息的不可检索盲区:PDF 表格与公式的解析损耗

传统 RAG 架构建立在"文本是知识的主要载体"这一假设上。但企业真实场景中,PDF 财报、扫描合同、技术论文、产品手册等核心文档中,有 40%-70% 的信息以表格、图表、公式、图像等非文本形态存在。当这些文档被"解析成文本"塞进向量库时,视觉信息大量丢失,检索系统形成不可检索盲区。本章从架构层面剖析这一问题的根因与解决路径。

3.1 问题的严重性:企业文档的视觉信息密度

对 100 份真实企业文档的统计显示,视觉信息占比远超直觉:

企业文档信息形态分布(100 份样本统计)
═══════════════════════════════════════════════════════════════

  纯文本段落  ████████████████░░░░░░░░░░░░░░  32%
  表格        ██████████████░░░░░░░░░░░░░░░░  28%
  图表        ████████████░░░░░░░░░░░░░░░░░░  22%
  公式        ████░░░░░░░░░░░░░░░░░░░░░░░░░░   8%
  扫描图像    ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░   6%
  其他(脚注等) █░░░░░░░░░░░░░░░░░░░░░░░░░░░░   4%

  → 视觉信息(表格+图表+公式+图像)占比 64%
  → 传统文本解析器对此类信息的还原率 < 30%

更严重的是,这些视觉信息往往是"答案的关键"——财务报表的核心是数字表格,趋势分析的核心是图表,技术论文的核心是公式,医学报告的核心是影像。当用户问"2024 年第三季度的毛利率是多少"时,答案藏在表格中;当用户问"过去五年营收趋势"时,答案藏在图表中。当这些信息被错误地"文本化"后,要么丢失数值精度,要么丢失空间关系,要么完全不可检索。

3.2 传统 PDF 解析的三大损耗

传统 PDF → 文本的解析流程中,视觉信息损耗发生在三个环节:

损耗 1:表格解析的语义错位。PDF 中的表格本质是"几何位置编码"——表头、数值、合计通过坐标位置表达语义。但 PDF 解析器(如 pdfplumber、PyPDF2)通常按"文本流"顺序输出,把表格拆成散落的文字片段,丢失"单元格归属"关系。如下面的财务报表表格,解析后可能变成"营业收入 营业成本 毛利率 1,000 600 40%"——行/列关系完全丢失。

损耗 2:图表的彻底丢失。图表是"视觉编码数据"——柱状图、折线图、饼图中的数据通过颜色、长度、角度表达。传统的 pdf-to-text 流程对图表无能为力——图表被"识别为图像"后即丢失内部信息。即使后续 OCR 识别出"X 轴: 时间, Y 轴: 营收",也丢失了"每个数据点的具体数值"。

损耗 3:公式的 LaTeX 失真。数学公式在 PDF 中以特殊字体或图像形式存在。普通解析器无法识别为公式;即使识别为图像,OCR 也容易出错——分式、积分、求和符号的还原率极低。学术论文检索系统中,公式检索一直是公认难题。

3.3 解析损耗的量化评估

为了客观评估解析损耗,我们用 4 个常见 PDF 解析器对同一份 50 页的财报(包含 12 个表格、8 个图表、5 个公式段)做解析,然后用结构化评估指标打分:

解析器 表格还原率 图表信息保留 公式还原率 整体可用率
PyPDF230%0%15%20%
pdfplumber55%0%25%35%
Unstructured70%10%45%50%
MinerU90%60%80%80%
Marker85%75%85%82%
ColPali (视觉直读)95%90%90%92%

数据揭示一个反直觉的结论:即使是当前最好的结构化解析器(MinerU/Marker),整体可用率也只能达到 80% 左右。剩下的 20% 信息损耗来自:复杂合并单元格、嵌套表格、特殊格式图表、手写公式。这一损耗直接限制了传统 RAG 在"结构化文档"上的天花板。

3.4 解决路径:三条架构路线

针对视觉信息的不可检索问题,业界演化出三条正交的解决路径:

路径 1:更强解析器。继续优化 PDF → 结构化的转换能力。代表方案:MinerU(开源多模态 PDF 解析)、Marker(高精度表格解析)、Unstructured(商业化通用解析器)、DocLayout-YOLO(版面分析深度学习模型)。这条路线的优势是兼容现有 RAG 流程,劣势是天花板受限于 OCR 与版面分析的精度。

路径 2:多模态 Embedding(视觉直读)。放弃"先解析后 Embedding"的传统流程,直接把 PDF 页面作为图像送入多模态 Embedding 模型。代表方案:ColPali(基于 PaliGemma 的视觉文档检索)、ColQwen(基于 Qwen2-VL)。这条路线的优势是保留了所有视觉信息,劣势是存储成本高(每页一张图 + 多个 patch 向量)。

路径 3:混合策略。用传统解析器处理纯文本段落,用多模态 Embedding 处理表格/图表/公式,最后融合检索结果。代表方案:Jina AI 的多模态检索、Unstructured 的 hybrid 模式。优势是兼顾效率与精度,劣势是工程复杂度高。

视觉信息检索的三条架构路径
═══════════════════════════════════════════════════════════════

  PDF/图像/扫描件
       │
   ┌───┴──────────────────────────┬─────────────────────┐
   ▼                              ▼                     ▼
 路径1 强解析器               路径2 视觉直读         路径3 混合
 ┌──────────────┐            ┌──────────────┐     ┌──────────────┐
 │ MinerU       │            │ ColPali      │     │ 文本走解析器 │
 │ Marker       │            │ ColQwen      │     │ 视觉走VL模型 │
 │ Unstructured │            │ Qwen2-VL     │     │ RRF 融合     │
 │ DocLayout-YOLO│           │ 多页 patch  │     │              │
 └──────┬───────┘            └──────┬───────┘     └──────┬───────┘
        │                           │                    │
        ▼                           ▼                    ▼
   结构化文本                视觉向量(高维)         文本+视觉向量
        │                           │                    │
        └─────────────┬─────────────┘────────────────────┘
                      ▼
                  向量数据库
                      │
                      ▼
                  LLM 推理生成

3.5 架构师的判断维度

选择哪条路径,不是技术偏好问题,而是业务约束问题。架构师需要从四个维度评估:

精度优先 vs 成本优先。视觉直读(ColPali)的检索精度最高(ViDoRe 基准 80%+),但每页文档需要存 1000+ 个 patch 向量,存储成本是传统路径的 10-50 倍。如果业务对"召回率"敏感且预算充足,视觉直读是首选;如果预算敏感,先用结构化解析器,再针对关键文档用视觉直读补充。

文档类型分布。纯文本文档(合同、规章)用传统路径效率最高;含大量表格/图表的文档(财报、研究报告)用混合策略最优;扫描件、图像型 PDF 必须用视觉直读或 OCR 增强的解析器。

查询形态。事实型查询("2024 年营收多少")传统路径够用;空间型查询("对比近五年趋势")视觉直读优势明显;公式型查询("推导过程")必须用专门的多模态公式识别模型。

延迟与吞吐。视觉直读的 Embedding 推理延迟是传统路径的 5-10 倍(每页要跑 ViT 推理),QPS 性能下降明显。对延迟敏感的场景(如实时客服)需要预计算 + 缓存;对离线分析场景影响较小。

核心观点:视觉信息的不可检索盲区,本质是"文本是知识载体"这一假设的破产。架构师必须认识到:在企业文档中,文本只是信息的一种形态,表格、图表、公式、图像同样甚至更加重要。多模态 Embedding 与结构化解析不是"二选一",而是"组合拳"——文本段落走解析器,视觉元素走 VL 模型,融合检索结果。

四、评估范式失真:RAGAS 指标与人类判断的鸿沟

如果说前三章讨论的是"答不上来"的失效,本章讨论的是一个更隐蔽的失效——评估失真。当一个 RAG 系统在 RAGAS / TruLens 等自动评估指标上拿到 0.9 的高分,但用户体验却很差;当指标显示"答案忠实度 95%",但用户却发现大量幻觉,问题出在哪里?答案是:传统 RAG 评估指标体系本身存在细粒度缺失,与人类判断存在系统性偏差。本章从架构层面剖析这一评估范式危机。

4.1 RAGAS 指标体系的"四个维度"

RAGAS(Retrieval-Augmented Generation Assessment)是当前最主流的 RAG 评估框架。它定义了四个核心指标:

RAGAS 四大核心指标
═══════════════════════════════════════════════════════════════

  ┌─────────────────────────────────────────────────────┐
  │                                                     │
  │  ① Context Precision    检索上下文的精度             │
  │     检索到的 chunk 中相关的比例                      │
  │     = 相关 chunk 数 / 检索 chunk 总数                │
  │                                                     │
  │  ② Context Recall       检索上下文的召回率            │
  │     答案所需信息被检索到的比例                       │
  │     = 命中 chunk 数 / 答案所需 chunk 总数            │
  │                                                     │
  │  ③ Faithfulness         答案忠实度                   │
  │     答案中的事实有多少能从检索 context 中找到        │
  │     = 可溯源陈述数 / 总陈述数                        │
  │                                                     │
  │  ④ Answer Relevancy     答案相关性                   │
  │     答案与用户 Query 的语义相关度                    │
  │     = cosine(answer_emb, query_emb)                 │
  │                                                     │
  └─────────────────────────────────────────────────────┘

这四个指标看似全面,但在企业生产环境中暴露出一系列问题:

4.2 评估失真的五种典型模式

失真模式 1:Context Recall 假阳性。Context Recall 用 LLM 判断"答案所需信息是否都在检索结果中"。但 LLM 判断本身有偏——它倾向于认为"是"(confirmation bias),导致 Context Recall 普遍虚高 10-20%。一份实际召回 60% 的系统,Context Recall 可能评估为 80%。

失真模式 2:Faithfulness 虚高。Faithfulness 度量"答案中的事实能否在 context 中找到"。但 LLM 评判"是否能找到"时,对模糊表述过于宽容——模型会把"差不多"判定为"找到"。一份实际幻觉率 15% 的系统,Faithfulness 可能评估为 95%。

失真模式 3:Answer Relevancy 与人类判断脱节。Answer Relevancy 用 Embedding 余弦相似度度量"答案与 Query 的相关性"。但"语义相关"≠"用户满意"——一个冗长铺陈的答案可能与 Query 高度相关,但用户其实只想要一个简洁结论。

失真模式 4:粒度太粗。RAGAS 指标是"问题级"的——一个 query 一个分数。但真实场景中,同一 query 的不同方面可能有不同表现。"对比 A 和 B"的答案可能在 A 的描述上准确,在 B 的描述上模糊;多跳问题可能第一跳准确第二跳崩溃。问题级指标掩盖了这种细粒度问题。

失真模式 5:缺少反事实评估。RAGAS 用"标准答案(ground truth)"评估答案准确性。但 ground truth 本身可能不全——可能没有覆盖所有有效答案形式;可能没有覆盖反事实情形("如果 A 不存在会怎样")。基于 ground truth 的评估天然偏向"复述 ground truth",不利于发现系统的创造性与鲁棒性。

失真模式 触发条件 指标偏差方向 典型偏差幅度
Context Recall 假阳性LLM 评判 confirmation bias虚高+10% ~ +20%
Faithfulness 虚高LLM 对模糊表述宽容虚高+5% ~ +15%
Answer Relevancy 脱节语义相关≠用户满意不一致不可量化
粒度太粗多跳/多角度问题掩盖问题不可量化
缺少反事实评估超出 ground truth 范围评估片面不可量化

4.3 与人类判断的相关性分析

为了量化 RAGAS 与人类判断的偏差,多家企业做了"指标-人类相关性"研究。一项覆盖 200 个真实业务 query 的对比研究显示:

RAGAS 指标与人类判断的相关性
═══════════════════════════════════════════════════════════════

  指标                  与人类满意度相关系数 (Spearman)
  ──────────────────────────────────────────────────
  Context Precision           0.42   (中等相关)
  Context Recall              0.38   (弱相关)
  Faithfulness                0.55   (中等相关)
  Answer Relevancy            0.31   (弱相关)
  ──────────────────────────────────────────────────
  综合得分                    0.46   (中等相关)

  解读:RAGAS 指标与人类判断的相关性仅 0.46,
        这意味着 54% 的用户体验无法被指标捕捉。
        一个 RAGAS 高分系统,真实满意度可能很糟糕。

这一数据揭示了 RAG 评估的根本性挑战:自动指标只能捕捉"形式正确",无法捕捉"实质满意"。用户在意的不仅是"答案是否对",还包括"答案是否够简洁"、"是否够完整"、"是否够专业"、"是否有引用"、"是否解释清楚推理过程"——这些都是 RAGAS 指标无法覆盖的。

4.4 评估体系 2.0:多维度融合

面对传统评估体系的局限,工业界正在演化出"评估体系 2.0"——一个多维度、细粒度、人机融合的评估框架:

维度 1:检索质量评估(Retrieval Quality)。超越 Top-K 命中率,引入"上下文质量分级"——将检索到的 chunk 分为"完全相关"、"部分相关"、"无关"、"有害(引入噪声)"四档,分别计算指标。这种分级评估能更准确反映检索系统对最终答案的影响。

维度 2:生成质量评估(Generation Quality)。超越 Faithfulness 和 Answer Relevancy,引入"幻觉类型细分"——把幻觉分为"轻微编造"(细节填充)、"严重编造"(事实捏造)、"自相矛盾"(内部冲突)三档,分别评估。

维度 3:端到端质量评估(End-to-End Quality)。引入"用户任务完成度"指标——不是"答案对不对",而是"用户的目标是否达成"。例如"我想订机票"的任务,完成度可能包括"给出航班选项"、"给出价格"、"给出预订链接"等子目标。

维度 4:过程质量评估(Process Quality)。在 Agentic RAG 时代,过程质量与结果质量同样重要——检索路径是否合理、推理步骤是否清晰、决策依据是否可解释。

维度 5:人类反馈融合(Human-in-the-Loop)。关键样本(生产环境 5%-10% 的高风险 query)必须经过人类标注,作为评估基准。LLM-as-a-Judge 用于大批量初筛,人工标注用于精校。

RAG 评估体系 2.0:多维度融合
═══════════════════════════════════════════════════════════════

                      ┌─────────────────┐
                      │ 用户满意度      │
                      │ (北极星指标)    │
                      └────────┬────────┘
                               │
        ┌──────────┬───────────┼───────────┬──────────┐
        ▼          ▼           ▼           ▼          ▼
  ┌──────────┐┌──────────┐┌──────────┐┌──────────┐┌──────────┐
  │检索质量  ││生成质量  ││端到端    ││过程质量  ││人类反馈  │
  │          ││          ││质量      ││          ││          │
  │·分级召回 ││·幻觉分级 ││·任务完成 ││·检索路径 ││·人工标注 │
  │·位置效用 ││·引用精度 ││·子目标  ││·推理透明 ││·A/B测试  │
  │·多样性   ││·简洁性   ││·可执行性││·决策可解 ││·用户访谈 │
  │·新颖性   ││·完整性   ││·可操作性││ 释性     ││·众包评估 │
  └────┬─────┘└────┬─────┘└────┬─────┘└────┬─────┘└────┬─────┘
       │           │           │           │           │
       └───────────┴───────────┴───────────┴───────────┘
                               │
                               ▼
                    LLM-as-a-Judge 工业化
                    (人机融合,成本可控)

4.5 架构师实践:构建可解释的评估流水线

作为架构师,应当构建一条端到端可解释的评估流水线:

Step 1:定义业务级北极星指标。脱离 RAGAS 框架,从业务出发定义"什么算好"。例如客服场景的北极星可能是"问题一次解决率"(First Contact Resolution),知识库问答的北极星可能是"用户点赞率"或"后续追问次数"。北极星指标是评估体系的"宪法"。

Step 2:建立分层指标体系。北极星之下分解为多个次级指标,每个次级指标对应一个可优化的子系统。检索质量 → 优化检索器;生成质量 → 优化 Prompt 和 LLM;端到端质量 → 优化整体流程。

Step 3:建立"硬样本"评估集。从生产环境持续收集"难样本"(用户不满意的 query)作为评估集。硬样本评估集是 RAG 系统的"压力测试",比通用 benchmark 更能反映真实表现。

Step 4:LLM-as-a-Judge 工业化。用 LLM 做大规模自动评估,关键在于"评判标准 Prompt 化"——把人类判断标准转译为 LLM 可执行的评分规则。同时引入"评判者一致性"监控——多个 LLM 评判者的一致性应达到 0.8+。

Step 5:A/B Testing 与持续迭代。所有 RAG 改进必须经过 A/B 测试。哪怕 RAGAS 分数提升 5%,如果用户满意度下降,仍应回滚。指标是手段,满意才是目的。

核心观点:评估失真不是 RAGAS 框架的问题,而是"用单一度量评估复杂系统"的方法论局限。架构师必须认识到:评估体系本身就是 RAG 系统的一部分,它的复杂度不亚于检索与生成本身。一个好的评估体系应当是多维度、细粒度、人机融合、持续迭代的——这不是"额外开销",而是"生产级 RAG 的入场券"。

这五种失真模式共同指向一个根本问题:用单维度指标评估复杂系统的局限性。评估体系 2.0 的解决方案是建立"多维度 + 细粒度 + 人机融合"的评估框架。

flowchart TB A[/RAGAS 传统评估/] --> B[/评估失真五大模式/] B --> C[/评估体系 2.0/] C --> D[/多维度指标/] C --> E[/细粒度评估/] C --> F[/人机融合/] D --> G[/检索质量/] D --> H[/生成质量/] D --> I[/端到端质量/] E --> J[/步骤级/] E --> K[/方面级/] F --> L[/LLM-as-a-Judge/] F --> M[/人类精校/] style B fill:#ffe5e5 style C fill:#e5ffe5

从 RAGAS 到评估体系 2.0,是从"单点指标"到"质量体系"的范式升级。

多模态文档的解析损耗是结构性问题,不是单点技术能彻底解决的。架构师的应对策略是"多模态原生设计"——不再把文档"降维"成文本,而是让 RAG 系统原生支持视觉信息。

flowchart TB A[/PDF 文档/] --> B[/解析路径选择/] B -->|纯文本| C[/PyPDF2 解析/] B -->|含表格| D[/MinerU 解析/] B -->|扫描件| E[/ColPali 视觉直读/] C --> F[/文本 Embedding/] D --> G[/结构化 Embedding/] E --> H[/视觉 Embedding/] F --> I[/统一向量库/] G --> I H --> I style B fill:#fff5e5

多模态解析的核心思想是"按文档类型分路径",避免单解析器对所有文档的"水土不服"。

多跳问题的"桥接型 + 比较型 + 反事实型"三类问题,对应不同复杂度的工程实现。架构师应当先判断业务 Query 的类型分布,再选择匹配的范式。

flowchart TB A[/多跳问题分类/] --> B[/桥接型 2-3 跳/] A --> C[/比较型 2-4 跳/] A --> D[/反事实型 复杂/] B --> E[/Self-Ask/] C --> F[/ReAct/] D --> G[/Plan-and-Execute/] style B fill:#e5f5ff style C fill:#fff5cc style D fill:#ffe5cc

三类多跳问题对应不同复杂度的 Agent 范式,盲目使用 Multi-Agent 是过度工程化。

五、ColPali / ColQwen 范式跃迁:视觉文档直接 Embedding

2024 年,多模态 RAG 领域最激动人心的进展是 ColPali(Contextualized Late Interaction over PaliGemma)的出现。它用一个大胆的架构选择——彻底放弃 PDF 解析,直接把文档页面作为图像 Embedding——在多个文档检索基准上把 NDCG@10 从 0.5 提升到 0.8,开启了"视觉文档检索"新范式。本章从架构层面深入剖析 ColPali / ColQwen 的核心思想、技术细节与工程取舍。

5.1 范式跃迁:从"OCR + Text Embedding"到"Vision Embedding"

传统文档检索流程是"先 OCR 后 Embedding"——把 PDF 解析成文本,对文本做 Embedding 后入库。ColPali 反其道而行:把整页 PDF 当作图像,直接送入多模态 Embedding 模型,输出每页的 patch 向量。检索时,用户 Query 也经过同一个模型的文本塔,输出文本向量;最后用"晚交互(Late Interaction)"机制计算图文相似度。

ColPali 范式:视觉文档直接 Embedding
═══════════════════════════════════════════════════════════════

  传统流程                          ColPali 流程
  ─────────                        ───────────
  PDF 页面                          PDF 页面
     │                                 │
     ▼ OCR 解析                        ▼ 图像预处理
  文本段落                         448×448 patches
     │                                 │
     ▼ 分块                              ▼ ViT 编码
  chunks                                │
     │                                 │
     ▼ Text Embedding              PaliGemma 多模态融合
  text vectors                          │
     │                                 ▼
     │                            128 个 patch 向量
     │                            (每页 1024 维)
     │                                 │
     ▼                            ┌────┴────┐
  向量库                            │  向量库   │
                                    └────┬────┘
                                         │
     Query ──Text Encoder──Query vector  │
                                         │
                                         ▼
                                   Late Interaction
                                   (MaxSim / Sum)
                                         │
                                         ▼
                                      Top-K 页面

5.2 核心技术:PaliGemma + Late Interaction

ColPali 的技术栈由两部分组成:

视觉编码器:PaliGemma。PaliGemma 是 Google 在 2024 年发布的多模态大模型,基于 SigLIP 视觉编码器 + Gemma 语言模型。ColPali 用了 PaliGemma 的视觉部分(SigLIP-400M),把每页 PDF 切分为 448×448 的图像块(patches),每页得到约 1024 个 patch tokens,每个 patch 输出 128 维向量。

关键设计是:不再做 OCR、不再做版面分析、不再做表格识别。所有"语义理解"都交给 ViT + 投影层,让模型自己学习"如何把视觉信息映射到与文本匹配的语义空间"。这避免了传统 OCR 的信息损耗。

晚交互机制(Late Interaction)。ColPali 没有用传统的"单向量点积",而是采用了 ColBERT 风格的"晚交互"——Query 和 Document 都保留多向量(多 patch),相似度计算时做 token 级别的 MaxSim 聚合。具体来说:

# 伪代码:ColPali 的 MaxSim 晚交互
def maxsim_score(query_vecs, doc_patch_vecs):
    """
    query_vecs: [Q, 128]  Query 的 token 级向量
    doc_patch_vecs: [P, 128]  Doc 的 patch 级向量
    """
    score = 0
    for q_vec in query_vecs:           # 每个 query token
        max_sim = -inf
        for p_vec in doc_patch_vecs:   # 找最相似的 doc patch
            sim = dot(q_vec, p_vec)
            max_sim = max(max_sim, sim)
        score += max_sim
    return score
    # 时间复杂度 O(Q*P),P 通常 1024,Q 通常 32

这种晚交互的精妙之处在于:保留了 token 级别的细粒度匹配能力。Query 中"2024 年营收"这个短语会与 Doc 中"2024 年营收:1.2 亿元"所在的 patch 形成高相似度,而传统单向量 Embedding 会把整页压缩成一个向量,丢失这种细粒度信息。

5.3 ColPali vs ColQwen:架构差异与选型

ColPali 之后,阿里巴巴通义实验室推出了 ColQwen,基于 Qwen2-VL 多模态大模型。两者的核心差异:

维度 ColPali ColQwen 选型建议
底座模型PaliGemma (Google)Qwen2-VL (Alibaba)中文场景优选 ColQwen
视觉编码器SigLIP-400MQwen2-VL 视觉部分ColQwen 视觉能力更强
上下文窗口固定 448×448动态分辨率(任意比例)ColQwen 支持长页面/复杂版面
中文能力中(基于 PaliGemma 训练)强(基于 Qwen 训练)中文文档优选 ColQwen
多语言能力强(多语言 PaliGemma)强(Qwen 多语言)两者都优秀
推理速度中等较慢(动态分辨率开销)速度敏感选 ColPali
存储成本约 1 GB / 千页约 1.5 GB / 千页ColPali 略省
开源协议Apache 2.0Apache 2.0均可商用
检索精度(ViDoRe)0.840.87ColQwen 略优

从架构师视角,选型不是看 benchmark 分数,而是看业务约束。中文业务为主 + 复杂版面(财报、扫描件)→ ColQwen;多语言 + 速度敏感 → ColPali;预算紧张 + 简单版面 → ColPali;研究型项目(需要细粒度控制)→ 两者都试,ColPali 生态更成熟。

5.4 工程实现的关键挑战

ColPali 范式虽然优雅,但工程落地面临三大挑战:

挑战 1:存储与索引成本。每页文档 1024 个 patch 向量,每向量 128 维 float32 = 512 字节,1 千页文档 = 512 MB。10 万页 = 50 GB。这还没算 IVF/HNSW 索引的开销(通常翻 1.5-2 倍)。生产环境必须使用 PQ 量化或二进制量化压缩。

挑战 2:检索延迟。晚交互的时间复杂度是 O(Q*P),P=1024 时单次检索毫秒级。如果 QPS=100,需要多 GPU 并行或预计算优化。ColPali 工程上常用"粗排 + 精排"两阶段——先用单向量 ANN 召回 Top-100,再用晚交互精排 Top-10。

挑战 3:多页文档的处理。PDF 文档通常有多页,ColPali 把每页独立 Embedding。检索时需要把多页结果合并排序,处理"答案跨页"的情况。常用做法是引入"上下文扩展"——把相关页的前后页一起纳入候选。

ColPali 两阶段检索架构
═══════════════════════════════════════════════════════════════

  Query ──Text Encoder──Query vector
       │                       │
       │                       │
       ▼                       ▼
  ┌────────────────┐    ┌────────────────┐
  │ 阶段1: 粗排    │    │ 阶段2: 精排    │
  │                │    │                │
  │ 单向量 ANN     │    │ 晚交互 MaxSim  │
  │ Recall@100     │    │ Top-10 精排    │
  │ ~5ms           │    │ ~50ms          │
  │ Qdrant/Milvus  │    │ ColPali 计算   │
  └────────┬───────┘    └────────┬───────┘
           │                     │
           └──────────┬──────────┘
                      ▼
                Top-K 页面 + 分数
                      │
                      ▼
                送入 LLM 生成

5.5 架构师视角:ColPali 是"银弹"吗?

ColPali 不是银弹。它的优势是"在视觉文档检索上显著超越传统方案",但代价是巨大的存储与算力开销。架构师必须问自己三个问题:

Q1:业务真的需要视觉直读吗?。如果你的文档主要是纯文本(合同、规章、邮件),传统文本 Embedding + 结构化解析器已经够用,引入 ColPali 是浪费。如果你的文档含大量表格/图表/公式/扫描件,ColPali 的收益才明显。

Q2:能承担存储与算力成本吗?。ColPali 的存储是传统路径的 10-50 倍,推理 GPU 是传统路径的 2-3 倍。如果预算敏感,先用结构化解析器 + Rerank 满足 80% 需求,再针对关键场景用 ColPali 补足。

Q3:检索精度的提升能转化为业务价值吗?。如果业务是"内部知识库"或"小规模专业领域",精度提升 20% 可能价值有限;如果是"大规模企业文档"、"法律证据检索"、"医疗诊断辅助",精度提升 20% 可能价值千万。

核心观点:ColPali / ColQwen 开启了"视觉文档检索"新范式,它的核心价值不在于"取代传统 RAG",而在于把不可检索的视觉信息变成可检索。架构师应当把它视为"工具箱中的一个强大工具"——在表格/图表/公式密集型文档中启用,在纯文本场景中退场。混合策略(文本走解析器 + 视觉走 ColPali + RRF 融合)才是 2026 年多模态 RAG 的最佳实践。

六、多模态 Embedding 模型能力矩阵与选型

如果说 ColPali 是"多模态检索的明星范式",多模态 Embedding 模型就是它的"底层引擎"。从 2021 年 CLIP 横空出世到 2024 年的 SigLIP、BGE-VL、Jina CLIP v2,多模态 Embedding 已经演化出丰富的能力矩阵。本章从架构层面梳理主流模型的能力边界、训练范式与选型策略。

6.1 多模态 Embedding 的能力维度

评估一个多模态 Embedding 模型,架构师应当关注五个能力维度:

维度 1:模态覆盖。支持哪些模态?纯文-文、文-图、文-视频、图-图?多模态对齐能跨几种模态?

维度 2:分辨率与粒度。视觉端支持的最大分辨率(224 / 336 / 448 / 动态)?文本端支持的最大长度(77 / 256 / 8192)?粒度是图像级、区域级、还是 patch 级?

维度 3:对齐精度。在跨模态检索基准(ImageNet-R、ARO、VG-Attribution)上的表现。在专业领域(医学/法律/工业)的微调可行性。

维度 4:推理效率。单次推理的 GPU 显存占用、吞吐量(QPS)、是否支持量化部署、是否支持边缘设备。

维度 5:训练数据与可解释性。训练数据规模与多样性(CC3M、LAION、COYO)?是否开源预训练权重?是否支持下游微调?

6.2 主流模型能力矩阵

截至 2026 年 7 月,主流多模态 Embedding 模型的能力对比:

模型 模态 分辨率 维度 图文检索精度 开源 典型场景
CLIP ViT-L/14文-图22476868.6 (ImageNet)通用图文检索
SigLIP-SO400M文-图384115283.1 (ImageNet)高分辨率图文
OpenCLIP-bigG文-图224128080.1 (ImageNet)研究 / 大规模训练
BGE-M3文-文-1024N/A多语言文本
BGE-VL文-图 / 图-文22451275.4 (COCO)多语言图文
Jina CLIP v2文-图224102478.0 (COCO)多语言 + 图像
ImageBind文/图/音/视频/IMU2241024中等全模态对齐
OpenAI CLIP ViT-L文-图22476875.5 (ImageNet)SaaS 调用
Google PaLI-3文-图动态可变84.3 (VQAv2)部分多任务视觉语言
ColPali (PaliGemma)文-文档图像44812884.0 (ViDoRe)视觉文档检索
ColQwen (Qwen2-VL)文-文档图像动态12887.0 (ViDoRe)中文视觉文档

6.3 CLIP → SigLIP:训练目标的演进

CLIP(2021)的训练目标是"对称 InfoNCE"——给定 N 个 (text, image) 对,模型需要预测 N² 个配对中哪些是真实的。这种"批内负样本"训练简单有效,但当 N 增大时,负样本变得"过于简单"——大部分负样本和正样本差距巨大,模型学不到细粒度区分能力。

SigLIP(Sigmoid Loss for Image-Text Pre-training,2023)改用"成对 sigmoid 损失"——把每对 (text, image) 独立地用 sigmoid 分类(正/负),不再依赖批大小。这带来两个优势:

CLIP vs SigLIP 训练目标对比
═══════════════════════════════════════════════════════════════

  CLIP (2021)                       SigLIP (2023)
  ────────                         ────────
  输入: 批 B 个 (text, image)      输入: 批 B 个 (text, image)
  目标: B×B 矩阵对角线为 1         目标: 每个 pair 独立判断
  损失: 对称 InfoNCE                 损失: Sigmoid 交叉熵
  复杂度: O(B²)                      复杂度: O(B)
  依赖: 负样本需大 batch             依赖: 任意 batch size
  效果: 大 batch 时优                效果: 任意 batch 都优

  数学公式 (简化):
  ──────────
  CLIP:
    L = -log(exp(s_ii/τ) / Σ_j exp(s_ij/τ))
    对 batch 内所有负样本做 softmax

  SigLIP:
    L = -log(σ(ζ·s_ij))   for 负样本
    L = -log(σ(ζ·s_ij))   for 正样本
    其中 ζ, b 是可学习参数
    每对 (i,j) 独立判断

SigLIP 的工程意义在于:不需要超大 batch 也能训出好模型。CLIP 训练需要 batch=32768(消耗 64 张 A100),SigLIP 用 batch=4096 就能达到甚至超过 CLIP。这对中小团队尤其友好。

6.4 BGE-M3:多语言文本 Embedding 的标杆

BGE-M3(Multi-lingual, Multi-function, Multi-granularity)是 BAAI 发布的"全能"文本 Embedding 模型。它有三大特性:

多语言:支持 100+ 语言,包括中文、英文、阿拉伯语、印地语等长尾语言。在 MTEB 多语言榜单上常年第一。

多功能:支持密集检索(Dense)、稀疏检索(Lexical)、多向量检索(Multi-vector)三种模式,可以单独使用,也可以融合。这对混合检索场景特别友好。

多粒度:最大支持 8192 token 长度,能直接处理长文档而无需先分块。短文档和长文档都用同一个模型。

BGE-M3 三种检索模式
═══════════════════════════════════════════════════════════════

  模式 1: 密集检索 (Dense)
  ─────────────────────
  input_text → [CLS] pooling → dense_vector
  适合: 语义相似度匹配
  检索: ANN (HNSW/IVF)

  模式 2: 稀疏检索 (Lexical)
  ─────────────────────
  input_text → 词权重学习 → sparse_vector
  适合: 关键词精确匹配
  检索: 倒排索引 (类似 BM25)

  模式 3: 多向量 (Multi-vector / ColBERT)
  ─────────────────────
  input_text → 保留所有 token 向量
  适合: 细粒度匹配
  检索: 晚交互 MaxSim

  生产模式: 混合 + 融合
  ─────────────────────
  score = α·dense_sim + β·sparse_sim + γ·multivec_sim
  α+β+γ = 1, 通常 0.4/0.4/0.2

对中文场景,BGE-M3 + ColPali/ColQwen 是当前最佳实践的"双引擎"——文本走 BGE-M3,视觉走 ColPali/ColQwen,融合检索结果。

6.5 Jina CLIP v2:多语言长上下文的视觉 Embedding

Jina AI 在 2024 年发布的 Jina CLIP v2 解决了两个痛点:多语言长上下文。它支持 89 种语言,文本端支持 8192 token(远超传统 CLIP 的 77 token)。这让"用自然语言描述复杂视觉场景"成为可能。

在多模态 RAG 场景下,Jina CLIP v2 的优势是"跨语言检索"——用户用中文 Query,能检索到英文图片/文档;用长 Query("那张显示北京 2024 年 PM2.5 浓度的折线图"),能精准定位到图表。这在传统 CLIP 上完全做不到(77 token 限制连"PM2.5"都写不下)。

6.6 选型策略:场景驱动的决策树

作为架构师,应当用"场景驱动"的方式选型:

多模态 Embedding 选型决策树
═══════════════════════════════════════════════════════════════

  Q1: 主要处理什么文档?
  │
  ├─ 纯文本 ─────────► 文本 Embedding (BGE-M3 / OpenAI text-emb-3)
  │
  ├─ 含表格/图表 ────► ColPali/ColQwen 视觉直读
  │                   (或 MinerU/Marker 解析后 BGE-M3)
  │
  └─ 图像/视频 ──────► SigLIP / ImageBind / Jina CLIP v2
                          │
                          Q2: 多语言?
                          │
                          ├─ 是 ─► Jina CLIP v2 / BGE-VL
                          └─ 否 ─► SigLIP-SO400M

  Q3: 延迟敏感?
  │
  ├─ 是 ─────────────► 蒸馏版 CLIP / 量化 SigLIP
  └─ 否 ─────────────► 原版 SigLIP / ColPali

  Q4: 中文场景?
  │
  ├─ 是 ─────────────► ColQwen / BGE-M3 / BGE-VL
  └─ 否 ─────────────► ColPali / SigLIP / Jina CLIP v2

  Q5: 预算?
  │
  ├─ 紧 ─────────────► 开源 + 自部署 (BGE-M3 + ColPali)
  └─ 宽 ─────────────► SaaS + 定制 (OpenAI + Voyage)

核心观点:多模态 Embedding 没有"最好的模型",只有"最适合场景的组合"。架构师应当建立自己的能力矩阵库:文本 BGE-M3、视觉 SigLIP/Jina CLIP v2、视觉文档 ColPali/ColQwen、全模态 ImageBind——根据业务场景灵活组合。混合策略(多模型 + 多种检索方式 + RRF 融合)才是 2026 年多模态 RAG 的标准答案。

多模态 Embedding 模型的能力矩阵反映了"不同模态的对齐难度"——图文对齐最成熟,视频对齐其次,音频对齐再次之,全模态统一(ImageBind)仍处于研究阶段。

flowchart TB A[/多模态 Embedding/] --> B[/文-文 BGE-M3/] A --> C[/文-图 CLIP SigLIP/] A --> D[/文-文档 ColPali/] A --> E[/全模态 ImageBind/] B --> F[/成熟度:高/] C --> G[/成熟度:高/] D --> H[/成熟度:中高/] E --> I[/成熟度:中/] style E fill:#ffe5cc

架构师应当按"成熟度 + 业务需求"双维度选型,盲目追新不可取。

从 ColPali 到 ColQwen,多模态文档检索的"底座模型之战"反映了 VL 领域的技术演进。架构师选型时,应当基于"中文能力 + 复杂版面 + 成本约束"三维度判断。

flowchart TB A[/视觉文档检索选型/] --> B[/底座模型选择/] B -->|PaliGemma| C[/ColPali/] B -->|Qwen2-VL| D[/ColQwen/] C --> E[/通用多语言/] C --> F[/固定分辨率/] D --> G[/中文能力强/] D --> H[/动态分辨率/] C --> I[/适用:速度敏感/] D --> J[/适用:中文复杂版面/] style B fill:#fff5e5

选型决策应当基于具体业务约束,而非"哪个模型 benchmark 高"。

从架构层面看,ColPali 的价值在于把视觉信息纳入 RAG 的"一等公民"。它不是 ColBERT 的简单扩展,而是对文档检索范式的根本重定义。

flowchart LR A[/PDF 页面/] --> B[/448x448 切片/] B --> C[/ViT 编码/] C --> D[/PaliGemma 多模态融合/] D --> E[/128 个 patch 向量/] E --> F[/向量库/] G[/Query/] --> H[/Text Encoder/] H --> I[/Query vector/] I --> J[/Late Interaction MaxSim/] F --> J J --> K[/Top-K 页面/] style D fill:#fff5cc

七、PDF 结构化解析演进:MinerU / Marker / Unstructured / DocLayout-YOLO

在 ColPali 视觉直读范式出现之前,PDF 解析是 RAG 系统"前端清洗"的核心环节。解析质量直接决定后续 Embedding、检索、生成的天花板。本章从架构层面梳理 PDF 解析的演进路径,对比主流方案的能力边界与工程取舍。

7.1 PDF 解析的三个抽象层次

PDF 解析可以抽象为三个层次,每一层都有不同的技术路线:

PDF 解析的三层抽象
═══════════════════════════════════════════════════════════════

  层次 1: 文本提取
  ──────────────
  输入:  PDF 二进制流
  输出:  纯文本(按阅读顺序)
  工具:  PyPDF2, pdfplumber, pdfminer
  难点:  表格/公式/双栏排版
  ──────────────
        │
        ▼
  层次 2: 结构化解析
  ──────────────
  输入:  PDF + 版面分析
  输出:  块级结构(标题/段落/表格/图)
  工具:  Unstructured, Marker, MinerU
  难点:  表格还原 / 公式识别
  ──────────────
        │
        ▼
  层次 3: 语义解析
  ──────────────
  输入:  PDF + 多模态模型
  输出:  语义块 + 关系图谱
  工具:  DocLayout-YOLO, LayoutLMv3
  难点:  跨页关联 / 实体识别

7.2 PyPDF2 / pdfplumber:传统解析器的边界

PyPDF2 和 pdfplumber 是 Python 生态最常用的 PDF 解析库。PyPDF2 是纯 Python 实现,轻量但功能简单;pdfplumber 在 PyPDF2 基础上增强了表格识别能力。

传统解析器的核心逻辑是"按字符流顺序输出文本"——PDF 内部存储的是"在 X,Y 坐标绘制字符"这种低层指令,解析器需要根据字符位置还原阅读顺序。这一逻辑在简单排版(单栏、纯文本)下工作良好,但在以下场景失效:

双栏 / 三栏排版:学术论文、报刊杂志常用双栏排版,传统解析器按字符流输出会把两栏混在一起。

复杂表格:合并单元格、嵌套表格、跨页表格,传统解析器无法正确归属单元格内容。

扫描件:图片型 PDF,传统解析器无能为力(需 OCR)。

公式与特殊字符:数学符号、希腊字母、上下标,传统解析器经常乱码或丢失。

7.3 Unstructured:通用结构化解析的代表

Unstructured.io 是企业级 PDF 解析的代表方案。它通过"分区(Partitioning)"机制把 PDF 切分为不同类型的元素:Title、NarrativeText、Table、Image、List 等。背后的核心技术是"版面分析"——用深度学习模型识别 PDF 页面中不同元素的位置和类型。

Unstructured 的优势是"通用性"——一个接口处理 PDF、Word、PPT、HTML、Email 等多种格式,输出统一的元素列表。这对企业级 RAG 系统的"多源文档归一化"非常友好。

Unstructured 的局限:表格还原率约 70%,公式识别几乎为零,对扫描件需要额外 OCR 模块。在"高结构化文档"(财报、论文)场景下,Unstructured 输出的结构化数据仍需后处理。

7.4 MinerU:高精度开源 PDF 解析

MinerU(上海人工智能实验室开源)是当前中文场景下精度最高的 PDF 解析方案之一。它在多个内部 benchmark 上表格还原率达到 90%、公式识别达到 80%,是 Unstructured 的强力替代品。

MinerU 的技术栈:

版面分析:基于 LayoutLMv3 + DocLayout-YOLO 混合,先用目标检测定位元素(标题/段落/表格/图),再用 LayoutLMv3 分类元素类型。

表格识别:基于 TableMaster / TableNet,处理合并单元格、跨页表格、嵌套表头等复杂情况。

公式识别:基于 LaTeX-OCR,把数学公式识别为 LaTeX 代码,可直接渲染。

OCR 引擎:集成 PaddleOCR,支持中英文混合识别。

MinerU 解析流程
═══════════════════════════════════════════════════════════════

  PDF 输入
     │
     ▼
  ┌──────────────┐
  │ 版面分析      │  LayoutLMv3 + DocLayout-YOLO
  │ 元素检测      │  检测: 标题/段落/表格/图/公式
  └──────┬───────┘
         │
         ├──► 标题/段落 → 直接文本提取
         │
         ├──► 表格 ──► TableMaster 识别 ──► HTML/Markdown
         │
         ├──► 公式 ──► LaTeX-OCR ──► LaTeX 源码
         │
         ├──► 图像 ──► 截取 + 描述(可选 VL 模型)
         │
         └──► 扫描文字 ──► PaddleOCR ──► 文本
                          │
                          ▼
                    统一输出: blocks = [
                      {type: title, text: "..."},
                      {type: table, html: "..."},
                      {type: formula, latex: "..."},
                      {type: image, path: "..."}
                    ]

7.5 Marker:极致精度的解析方案

Marker 是 GitHub 上 Star 数最高的 PDF 解析项目之一(22k+),主打"高保真解析"——不仅提取文本,还尽量还原原文档的视觉结构。Marker 的核心技术是"自训练的高精度模型 + 启发式后处理"。

Marker 的优势是"几乎无信息损耗"——版面还原度极高,表格、公式、图、代码块的还原率均达到 85%+。劣势是"速度慢"——单页 PDF 解析需要 2-5 秒(GPU),不适合实时场景。

7.6 DocLayout-YOLO:版面分析的深度学习基座

DocLayout-YOLO 是版面分析领域的 SOTA 模型,基于 YOLO 架构针对文档版面做了优化。它能精准定位文档中的"标题、副标题、段落、表格、图、公式、页眉、页脚"等元素。在多个版面分析 benchmark(DocBank、PubLayNet)上达到 80+ mAP。

DocLayout-YOLO 本身不解析内容,只负责"元素检测与分类"。它通常作为 MinerU / Unstructured 等方案的"版面分析前端"使用。

7.7 方案选型矩阵

架构师选型应当基于文档类型、性能要求、成本约束综合决策:

方案 开源 中文能力 表格还原 公式识别 速度 适用场景
PyPDF230%15%极快纯文本文档
pdfplumber55%25%简单表格
Unstructured70%45%多格式统一
MinerU90%80%中文结构化文档
Marker85%85%高保真还原
DocLayout-YOLON/AN/A版面分析前端
ColPali (视觉直读)95%90%复杂视觉文档

从架构师视角,没有"最好"的解析器,只有"最匹配场景"的组合。纯文本走 PyPDF2/pdfplumber;多格式企业文档走 Unstructured;中文结构化文档走 MinerU;极致保真走 Marker;复杂视觉文档走 ColPali 视觉直读。

7.8 解析后的清洗与归一化

无论选哪个解析器,输出结果都需要后处理清洗。常见清洗任务:

噪声去除:去除页眉、页脚、页码、水印、空白行。常用正则或 LayoutLM 分类。

乱码修复:PDF 字符编码错乱导致乱码(特别在中文文档中)。需要字符集映射或重新 OCR。

表格归一化:解析器输出的表格格式不统一(HTML / Markdown / JSON),需要归一化为单一格式供下游 Embedding。

图片描述:解析出的图像/图表如果包含关键信息,需要用 VL 模型生成文字描述("X 轴: 时间, Y 轴: 营收, 趋势: 上升")。

跨页合并:表格/段落可能跨页,解析后需要识别并合并为完整块。

核心观点:PDF 解析的演进是从"文本提取"到"结构化"再到"语义化"的层层跃迁。架构师应当把"解析"视为 RAG 系统的"前端数据工厂"——它的能力上限决定了整个系统对真实世界文档的兼容性。2026 年的最佳实践是解析器 + 视觉直读的混合策略:结构化文档用 MinerU 解析,纯视觉文档用 ColPali 直读,融合检索结果。

八、表格与图表检索:Table-as-Context 与 ChartQA 思路

在企业 RAG 场景中,表格与图表是答案的"高密度区"——财报的核心是数字表格,趋势分析的核心是图表。然而,传统 RAG 把表格当作文本段落处理,导致大量结构化信息丢失。本章深入剖析表格与图表检索的工程难题,并梳理 Table-as-Context、ChartQA 等主流解决思路。

8.1 表格检索的根本性挑战

表格与文本的本质区别在于:文本是线性的,表格是二维结构。这种结构差异导致三个工程难题:

难题 1:单元格归属。"2024 年营收 1.2 亿"这句话在文本中含义明确,但在表格中,"2024"是列头、"营收"是行头、"1.2 亿"是交叉单元格。传统 RAG 把表格展平成"行+列"或"列+行"的文本序列,丢失了这种归属关系。

难题 2:跨行/跨列关系。"2024 年营收比 2023 年增长 30%",这句话依赖两行数据的对比。传统 RAG 无法表达"行间关系"或"列间关系"。

难题 3:数值语义。表格中的"10000"在不同语境下意义不同——可能是 1 万美元、1 万股、1 万次。传统 RAG 把数字当作普通文本,无法表达数值语义。

8.2 Table-as-Context:把表格作为整体上下文

Table-as-Context 是当前最主流的表格检索方案。它的核心思想是:把整张表格序列化为特殊格式(HTML/Markdown/JSON),作为整体上下文送入 LLM。不做表格的"行级"或"单元格级"检索。

Table-as-Context 序列化方案
═══════════════════════════════════════════════════════════════

  原始表格:
  ┌────────┬──────┬──────┬──────┐
  │  季度  │ 营收 │ 成本 │ 利润 │
  ├────────┼──────┼──────┼──────┤
  │ Q1     │  100 │   60 │   40 │
  │ Q2     │  120 │   70 │   50 │
  │ Q3     │  150 │   85 │   65 │
  │ Q4     │  180 │  100 │   80 │
  └────────┴──────┴──────┴──────┘

  方案 1: HTML 序列化
  ────────────────────
  <table>
    <tr><th>季度</th><th>营收</th><th>成本</th><th>利润</th></tr>
    <tr><td>Q1</td><td>100</td><td>60</td><td>40</td></tr>
    ...
  </table>

  方案 2: Markdown 序列化
  ────────────────────
  | 季度 | 营收 | 成本 | 利润 |
  |------|------|------|------|
  | Q1   | 100  | 60   | 40   |
  | Q2   | 120  | 70   | 50   |
  ...

  方案 3: JSON 序列化
  ────────────────────
  {"columns": ["季度", "营收", "成本", "利润"],
   "rows": [
     {"季度": "Q1", "营收": 100, "成本": 60, "利润": 40},
     ...
   ]}

三种格式各有优劣:HTML最贴近原始结构,LLM 理解度最高,但 token 消耗最大;Markdown最简洁,但合并单元格无法表达;JSON结构化最强,但 LLM 理解需要学习成本。生产实践通常用 Markdown + 关键单元格 HTML 标注的折中方案。

8.3 表格检索的进阶方案

Table-as-Context 在"小表格"(10×10 内)场景下表现良好,但对大表格(100+ 行)就会遇到 token 爆炸与 Lost in the Middle 问题。进阶方案有:

方案 1:表格摘要 + 全文双索引。对每张表生成"摘要 chunk"("2024 年四个季度营收 Q1:100 Q2:120 Q3:150 Q4:180 趋势:持续增长")+ "全文 chunk"(完整表格)。Query 检索时,先用摘要检索定位相关表,再按需加载全文。

方案 2:表格行级 Embedding。把每行表格独立 Embedding,检索时按行召回相关行。但这种方案丢失了"表格整体结构"。

方案 3:TableGPT / TableLLM 专用模型。用专门为表格理解训练的 LLM(如 TableGPT)处理表格查询。这一类模型对表格结构和数值计算有专门优化。

8.4 图表检索:ChartQA 思路

图表检索比表格检索更难。图表是"视觉编码数据"——柱状图、折线图、饼图中的数据通过视觉元素(高度、角度、颜色)表达。传统 OCR + 文本化流程对图表几乎无能为力。

ChartQA 是图表问答的代表性研究。核心思路:用 VL 模型直接"看图",回答关于图表的问题。例如,给定一张折线图,模型能回答"2024 年 6 月的数值是多少"(视觉读取)、"过去三个月的趋势"(视觉模式识别)、"哪个季度最高"(视觉对比)。

ChartQA 架构思路
═══════════════════════════════════════════════════════════════

  输入: 图表图像 + 文字 Query
           │            │
           └─────┬──────┘
                 ▼
        ┌────────────────┐
        │  VL 多模态模型  │  Qwen2-VL / GPT-4V / InternVL
        │                │
        │  视觉编码       │  读取图表元素
        │  视觉理解       │  识别趋势/对比/极值
        │  视觉推理       │  基于视觉回答问题
        └────────┬───────┘
                 │
                 ▼
            答案文字

  关键技术:
  ─────────
  1. Chart Element Detection: 识别 X/Y 轴、图例、数据点
  2. Visual Data Extraction: 从视觉元素读出数值
  3. Visual Reasoning: 视觉模式识别 + 数值推理
  4. Chart-to-Text: 生成图表的文字描述供 RAG 检索

在 RAG 系统中集成 ChartQA 的常见做法是:用 VL 模型离线为每张图表生成文字描述("2024 年营收折线图,趋势上升,Q4 达 180"),把描述作为 chunk 索引。检索时先检索到图表描述,再调用 VL 模型做精细问答。

8.5 表格与图表的混合检索

实际场景中,文档往往同时包含表格和图表。架构师应当建立"双轨索引 + 融合检索"机制:

表格+图表混合检索架构
═══════════════════════════════════════════════════════════════

  文档解析
     │
     ├── 表格 ──► HTML 序列化 ──► 表格 chunk
     │                              │
     │                              ▼
     │                          Embedding(BGE-M3)
     │                              │
     │                              ▼
     │                          表格向量库
     │
     ├── 图表 ──► VL 描述生成 ──► 图表描述 chunk
     │                              │
     │                              ▼
     │                          Embedding(BGE-M3)
     │                              │
     │                              ▼
     │                          图表向量库
     │
     └── 文本段落 ──► 段落 chunk ──► 文本向量库

  Query 检索
     │
     ├── 向量检索(三个库) ──► 候选 chunks
     │
     ├── 表格 Rerank ──► 表格相关性精排
     ├── 图表 Rerank ──► 图表相关性精排
     └── 文本 Rerank ──► 文本相关性精排
                       │
                       ▼
                  RRF 融合排序
                       │
                       ▼
                  Top-K chunks
                       │
                       ▼
                  LLM 生成

这种"双轨索引 + RRF 融合"架构是当前企业 RAG 处理混合结构化文档的最佳实践。RRF(Reciprocal Rank Fusion)通过对每个检索源的结果取倒数排名加权融合,避免单一检索源偏差。

核心观点:表格与图表是 RAG 系统的"高价值低可达"区——信息密度高但工程实现难。架构师必须认识到:把表格当文本处理是信息损耗的源头。Table-as-Context + ChartQA + VL 描述生成是当前的"三件套"最佳实践。任何严肃的 RAG 系统都应把表格/图表作为一等公民单独处理,而不是当作普通段落。

表格与图表检索的"双轨索引 + RRF 融合"是当前企业 RAG 的最佳实践。这一架构把高价值低可达的信息(表格/图表)从"系统盲区"变成"核心能力"。

flowchart LR A[/文档/] --> B[/文本段落/] A --> C[/表格/] A --> D[/图表/] B --> E[/文本向量库/] C --> F[/表格向量库/] D --> G[/图表向量库/] E --> H[/RRF 融合/] F --> H G --> H H --> I[/LLM 生成/] style H fill:#fff5cc

多路召回 + RRF 融合让表格/图表检索从"信息损耗"走向"信息增强"。

PDF 解析的演进是从"字符流"到"语义结构"的层层跃迁。每一层抽象都对应不同的工程能力,也对应不同的业务场景。

flowchart TB A[/PDF 文档/] --> B[/层次1: 文本提取/] B --> C[/PyPDF2 pdfplumber/] A --> D[/层次2: 结构化解析/] D --> E[/Unstructured MinerU/] A --> F[/层次3: 视觉直读/] F --> G[/ColPali ColQwen/] C --> H[/纯文本场景/] E --> I[/含表格/] G --> J[/扫描件+复杂视觉/] style B fill:#e5f5ff style D fill:#fff5cc style F fill:#ffe5cc

三层抽象之间是"互补关系",架构师应当按文档类型分路径选择,而不是"一招鲜"。

PDF 解析的工具链选择是 RAG 工程的"第一公里"。不同解析器在"表格还原 + 公式识别 + 速度"上各有优劣,架构师应按文档类型分路径选择。

flowchart LR A[/PDF 解析器/] --> B[/PyPDF2/] A --> C[/pdfplumber/] A --> D[/Unstructured/] A --> E[/MinerU/] A --> F[/Marker/] A --> G[/ColPali 视觉/] B --> H[/纯文本 30%还原/] E --> I[/中文结构化 90%/] G --> J[/视觉直读 95%/] style G fill:#fff5cc

解析器的演进反映"从文本提取到视觉理解"的范式跃迁。

九、视频与音频 RAG:时序检索的范式

在文本与图像之后,视频和音频是企业知识库的"最后一片处女地"——培训录像、会议录音、客服通话、产品演示等高价值内容仍处于 RAG 系统的盲区。本章从架构层面剖析视频与音频 RAG 的核心难题:时序对齐与多模态融合,并梳理 VideoRAG、Audio-RAG 等代表性方案。

9.1 视频 RAG 的三层信息结构

视频是"时序多模态"——它由视觉帧(image sequence)、音频流(audio track)、字幕(subtitle)、元数据(metadata)四个层次组成。每一层都承载不同语义:

视频信息结构与 RAG 挑战
═══════════════════════════════════════════════════════════════

  ┌─────────────────────────────────────────┐
  │  视频文件 (mp4/mov)                      │
  │                                          │
  │  ┌─────────────────────────────────────┐ │
  │  │  视觉帧序列 (1 fps 采样 → 3600 帧) │ │
  │  │  每帧 224×224 RGB                    │ │
  │  │  → 视觉 Embedding (SigLIP/CLIP)    │ │
  │  │  → 视觉 chunk (时序连续)            │ │
  │  └─────────────────────────────────────┘ │
  │  ┌─────────────────────────────────────┐ │
  │  │  音频流 (16kHz mono)                │ │
  │  │  → ASR 转录 (Whisper)              │ │
  │  │  → 文本 chunk (带时间戳)            │ │
  │  └─────────────────────────────────────┘ │
  │  ┌─────────────────────────────────────┐ │
  │  │  字幕 (srt/vtt)                     │ │
  │  │  → 直接索引                         │ │
  │  │  → 文本 chunk                       │ │
  │  └─────────────────────────────────────┘ │
  │  ┌─────────────────────────────────────┐ │
  │  │  元数据 (标题/章节/标签)            │ │
  │  │  → 文本 chunk                       │ │
  │  └─────────────────────────────────────┘ │
  │                                          │
  │  RAG 核心挑战:                           │
  │  ① 视觉与音频时序对齐                    │
  │  ② 关键帧识别(避免冗余)                 │
  │  ③ 多模态融合检索                         │
  └─────────────────────────────────────────┘

9.2 关键帧提取:避免帧级 Embedding 的维度爆炸

一段 1 小时的视频,1 fps 采样有 3600 帧,每帧 Embedding 后是 3600 个 chunk——存储与检索成本极高。工程上的解决方案是"关键帧提取"——用场景检测算法只保留"内容变化点"的帧。

常见关键帧提取策略:

策略 1:场景切换检测(Scene Detection)。基于颜色直方图或深度特征,检测视频中的"场景切换点",只保留切换前后的帧。一段 1 小时讲座视频可能只有 50-100 个关键帧。

策略 2:镜头稳定点检测。基于光流变化,检测镜头"稳定"的时间点(不抖动、不运动),保留稳定点帧。

策略 3:基于 VL 模型的语义关键帧。用 VL 模型(如 Qwen2-VL)评估每帧的"信息密度",保留高信息密度帧("包含 PPT 切换"、"包含人物动作变化")。

策略 4:结合 ASR 的语义切片。以 ASR 转录的"句子边界"为锚点,在每个句子区间内取 1-3 关键帧,把视频与音频的语义时间对齐。

9.3 视频 RAG 的检索范式

视频检索有三种典型范式:

范式 1:文本驱动(Text-to-Video)。用户用自然语言 Query,系统返回相关视频片段。这是 VideoRAG 系统的核心范式。代表方案:VideoCLIP、InternVideo、LanguageBind。

范式 2:视频问答(VideoQA)。给定视频与 Query,系统返回答案文字。这更接近 VQA(Video Question Answering)任务,代表方案:Video-LLaMA、Video-ChatGPT、Qwen2-VL。

范式 3:长视频摘要(Long Video Summarization)。对超长视频(1 小时+)生成结构化摘要,存入 RAG。这需要更强的长上下文建模能力,代表方案:LongVA、MovieChat。

VideoRAG 检索流程
═══════════════════════════════════════════════════════════════

  离线索引
  ───────
  视频文件 ──► 关键帧提取(场景检测)
            ──► ASR 转录(Whisper)
            ──► 关键帧 Embedding(SigLIP)
            ──► ASR 文本 Embedding(BGE-M3)
            ──► 时序对齐(帧-句绑定)
            ──► 融合索引存储
                       │
                       ▼
  在线检索
  ───────
  用户 Query ──► Query Embedding
                     │
                     ├── 视觉向量检索 ──► 关键帧候选
                     ├── 文本向量检索 ──► ASR 候选
                     └── 元数据检索   ──► 章节候选
                              │
                              ▼
                        RRF 融合排序
                              │
                              ▼
                       Top-K 时序片段
                       (含 帧+音频+字幕)
                              │
                              ▼
                       VL 模型生成答案

9.4 音频 RAG:从 ASR 到音频 Embedding

音频 RAG(Audio-RAG)是视频 RAG 的"子集",专门处理纯音频场景:会议录音、播客、客服通话、有声书等。其核心流程:

步骤 1:ASR 转录。用 Whisper / Paraformer 等 ASR 模型把音频转录为带时间戳的文本。这是音频 RAG 的基础。

步骤 2:说话人分离。对会议录音、客服通话等多说话人场景,用说话人 diarization 模型分离不同说话人("Speaker A: ... Speaker B: ...")。

步骤 3:音频 Embedding(可选)。除了文本 Embedding,还可以直接对音频做 Embedding——用 CLAP(Contrastive Language-Audio Pretraining)或 AudioCLIP 模型,把音频和文本映射到同一向量空间。这能检索到"语气"、"情绪"等非语义信息。

步骤 4:时序 chunk 切分。按语义停顿、说话人切换、话题转换等节点切分音频 chunk,每个 chunk 包含:时间区间、说话人、转录文本、音频 Embedding(可选)。

9.5 时序对齐:视频 RAG 的核心技术难题

视频 RAG 最大的技术挑战是"时序对齐"——把视觉帧、音频、字幕三种异构信息在同一时间轴上对齐。这一对齐的精度直接决定 RAG 系统的检索质量。

工程上常用三种对齐方案:

方案 1:基于 ASR 时间戳。用 ASR 转录时输出的"开始/结束时间",把字幕文本与音频时间戳绑定;再用说话人 diarization 关联到不同视频帧。

方案 2:基于多模态 VL 模型。用 Qwen2-VL / Video-LLaVA 等多模态大模型,对视频帧序列与文本描述做联合 Embedding,模型内部学习时序对齐。

方案 3:基于章节标签。对结构化视频(讲座、课程),用人工或自动标注的章节标签作为"对齐锚点",把视觉、音频、字幕都按章节切分。

9.6 工程实现:VideoRAG 系统架构

一个生产级 VideoRAG 系统的完整架构:

VideoRAG 生产架构
═══════════════════════════════════════════════════════════════

  离线处理流水线
  ────────────
  视频源
     │
     ├─► FFmpeg 抽帧 (1fps) ──► 关键帧检测(PySceneDetect)
     │                              │
     │                              ▼
     │                        关键帧 N 张
     │                              │
     │                              ▼
     │                        SigLIP Embedding
     │
     ├─► FFmpeg 抽音 ──► Whisper ASR ──► 时间戳文本
     │                              │
     │                              ▼
     │                        BGE-M3 Embedding
     │
     └─► 章节检测 / 元数据 ──► 元数据 Embedding

  三个向量库(视觉/音频/元数据)
     │
     ▼
  在线检索
  ────────
  Query ──► Query Embedding
                  │
                  ├── 视觉 ANN ──► 候选帧
                  ├── 文本 ANN ──► 候选句
                  └── 元数据 ANN ──► 候选章节
                              │
                              ▼
                        RRF 融合
                              │
                              ▼
                     Top-K 时序片段
                              │
                              ▼
                  Qwen2-VL 多模态生成
                              │
                              ▼
                          答案 + 视频剪辑链接

核心观点:视频与音频 RAG 是多模态 RAG 的"深水区"——它不仅需要处理视觉和文本,还要处理时序对齐、说话人分离、关键帧识别等复杂工程问题。架构师应当从"统一时序索引"切入:把视频的视觉、音频、字幕统一按时间轴切片,每个切片是一个 RAG chunk。这种时序 chunk + 多模态 Embedding + RRF 融合是 2026 年视频 RAG 的标准范式。

十、多模态融合检索:跨模态空间与 RRF 融合

当 RAG 系统需要同时检索文本、图像、表格、视频、音频时,多模态融合检索成为架构师必须面对的核心问题。这一问题的本质是"如何把不同模态的检索结果在统一语义空间中排序"。本章从架构层面剖析多模态融合检索的三大路径:统一向量空间、桥接层模型、检索结果 RRF 融合。

10.1 多模态融合的三层架构

多模态融合检索有三种实现层次,从浅到深依次为:

多模态融合检索的三层架构
═══════════════════════════════════════════════════════════════

  ┌────────────────────────────────────────────────┐
  │  Layer 1: 检索结果融合 (Result-level Fusion)  │  简单
  │                                                │
  │  各模态独立检索 → RRF/加权融合                 │
  │  优点: 模块化 / 易实现                         │
  │  缺点: 模态间语义不对齐                       │
  ├────────────────────────────────────────────────┤
  │  Layer 2: 桥接层融合 (Bridge-level Fusion)   │  中等
  │                                                │
  │  桥接模型统一映射 → 共同向量空间               │
  │  优点: 语义对齐好                              │
  │  缺点: 桥接模型训练难                          │
  ├────────────────────────────────────────────────┤
  │  Layer 3: 统一向量空间 (Joint Embedding)      │  复杂
  │                                                │
  │  端到端多模态 Embedding → 单一向量库            │
  │  优点: 最优语义                                │
  │  缺点: 训练成本极高 / 难扩展                   │
  └────────────────────────────────────────────────┘

10.2 路径 1:统一向量空间(CLIP / ImageBind)

统一向量空间是最理想的方案——所有模态在同一个 Embedding 空间中,跨模态检索就像同模态检索一样自然。代表方案:

CLIP:把文本和图像映射到同一空间,跨模态检索变成"点积计算"。

ImageBind:Meta 发布的全模态 Embedding 模型,把图像、文本、音频、视频、深度图、热成像、IMU 等 6+ 模态统一到一个向量空间。理论上可以用任何模态检索任何模态。

LanguageBind:类似 ImageBind,把视频、音频、图像、深度、红外、语言六模态对齐到语言 Embedding 空间。

统一向量空间的优点是"理论优雅",缺点是训练成本极高、扩展性差。每增加一个模态,需要重新训练整个模型;专业领域(医学影像、工业图纸)的精度受限于通用训练数据。

10.3 路径 2:桥接层模型(Bridge Model)

桥接层模型是"轻量级统一空间"方案——保留各模态的原始 Embedding 空间不变,用一个小型桥接模型把它们映射到共同空间。

典型架构:

桥接层模型架构
═══════════════════════════════════════════════════════════════

  文本空间 (BGE-M3)       图像空间 (SigLIP)
       │                       │
       ▼                       ▼
  text_emb [1024]        image_emb [1152]
       │                       │
       └───────┬───────────────┘
               │
               ▼
         桥接层模型
         (2 层 MLP / Attention)
               │
               ▼
       共同空间向量 [512]
               │
               ▼
         跨模态相似度计算
         (点积 / 余弦)

桥接层模型的训练数据是"跨模态对齐对"——同一语义的文本与图像对。训练时冻结原始 Encoder,只训练桥接层。这种方案的优势是训练快、扩展性好,劣势是桥接层引入了额外信息损失。

工程实践:

案例 1:BGE-VL 用了类似思路——基于 BGE-M3 文本 Encoder + SigLIP 图像 Encoder + 桥接层,把图文映射到 BGE-M3 的文本空间,复用 BGE 的多语言能力。

案例 2:Jina CLIP v2 用桥接架构支持 89 种语言 + 长上下文,把多语言能力注入 CLIP。

10.4 路径 3:检索结果 RRF 融合

RRF(Reciprocal Rank Fusion)是工程上最常用的多模态融合方案。保留各模态独立检索,仅对结果做加权融合。优点是模块化、易实现、可扩展。

RRF 融合算法
═══════════════════════════════════════════════════════════════

  伪代码:
  def rrf_fusion(results_list, k=60):
      """
      results_list: 每个元素的格式: [(doc_id, score), ...]
      k: RRF 参数(通常 60)
      """
      fused_scores = {}
      for results in results_list:
          for rank, (doc_id, _) in enumerate(results):
              if doc_id not in fused_scores:
                  fused_scores[doc_id] = 0
              fused_scores[doc_id] += 1.0 / (k + rank + 1)
      return sorted(fused_scores.items(),
                    key=lambda x: x[1], reverse=True)

  示例:
  ─────
  文本检索结果:  [A, B, C, D, E]
  图像检索结果:  [B, C, F, G, A]
  表格检索结果:  [D, A, H, I, J]

  RRF 分数计算(k=60):
  A: 1/61 + 1/65 + 1/62 = 0.0462
  B: 1/62 + 1/61 + 0     = 0.0323
  C: 1/63 + 1/62 + 0     = 0.0319
  D: 1/64 + 0     + 1/61 = 0.0319
  ...

  融合排序: A > B > C > D > E > F > G > H > I > J

RRF 的关键优势是对各模态检索器的"分数尺度"不敏感。文本检索可能用余弦相似度(0-1),图像检索可能用点积(-1 到 1),表格检索可能用 BM25 分数(0-100)。RRF 用"排名倒数"代替"原始分数",把不同尺度的结果拉到同一比较空间。

10.5 多模态融合的工程实践

企业级多模态 RAG 系统的融合架构通常分三层:

多模态融合检索系统架构
═══════════════════════════════════════════════════════════════

  Layer 1: 多路召回 (Recall)
  ──────────────────────────
  Query ─┬─► 文本 Embedding ──► 文本 ANN ──► Top-100 文本
         │
         ├─► 图像 Embedding ──► 图像 ANN ──► Top-100 图像
         │
         ├─► 表格 Embedding ──► 表格 ANN ──► Top-100 表格
         │
         └─► 视频 Embedding ──► 视频 ANN ──► Top-100 视频

  Layer 2: 多路精排 (Re-rank)
  ──────────────────────────
  文本候选 ──► BGE-Reranker ──► 文本精排 Top-20
  图像候选 ──► ColPali Rerank ──► 图像精排 Top-20
  表格候选 ──► 表格 Reranker ──► 表格精排 Top-20
  视频候选 ──► 视频 Reranker ──► 视频精排 Top-20

  Layer 3: RRF 融合排序
  ──────────────────────────
  四个精排结果 ──► RRF ──► 融合 Top-10
                       │
                       ▼
                  LLM 生成

这种"多路召回 + 多路精排 + RRF 融合"的三层架构兼顾了召回率(多路不遗漏)与精度(精排去噪),是当前生产级多模态 RAG 的标准范式。

10.6 模态权重自适应

不同 Query 对不同模态的偏好不同。例如"对比两家公司的营收"偏好表格,"看一张风景照"偏好图像,"看一段培训视频"偏好视频。架构师应当建立模态权重自适应机制:

方法 1:基于 Query 分类。用一个分类器预测 Query 的模态偏好(文本/图像/表格/视频),动态调整各模态的 RRF 权重。

方法 2:基于 Reranker 的端到端学习。训练一个 Cross-modal Reranker,输入是 (Query, 多模态候选),输出是排序分数。这种端到端模型能自动学习模态偏好。

方法 3:基于 LLM 的意图理解。用 LLM 分析 Query 意图,显式指定"本次查询主要关注表格/图像",动态调整权重。

核心观点:多模态融合检索不是"统一向量空间"这一个解——工程上 RRF 融合是更稳健、更模块化的选择。架构师应当建立"多路召回 + 多路精排 + RRF 融合"的三层架构,让每个模态独立优化、灵活扩展。模态权重自适应是进阶优化方向,但不应过早投入——先用 RRF 跑通 80% 场景,再用自适应优化剩余 20%。

多模态融合检索的"三层架构"(多路召回 + 多路精排 + RRF 融合)是 2026 年的工程标准。这一架构兼顾了召回率与精度,是模块化与精度的平衡。

flowchart TB A[/Query/] --> B[/多路召回/] B --> B1[/文本 ANN/] B --> B2[/图像 ANN/] B --> B3[/表格 ANN/] B --> B4[/视频 ANN/] B1 --> C[/多路精排/] B2 --> C B3 --> C B4 --> C C --> D[/RRF 融合/] D --> E[/Top-K 排序/] E --> F[/LLM 生成/] style D fill:#fff5cc

多模态融合的本质是"模块化召回 + 协同融合",避免单一模态的局限性。

视频 RAG 的核心挑战是"时序对齐"——把视觉帧、音频、字幕在统一时间轴上关联。这一挑战的解决程度直接决定 RAG 系统的检索质量。

flowchart TB A[/视频源/] --> B[/FFmpeg 抽帧/] A --> C[/FFmpeg 抽音/] A --> D[/元数据/] B --> E[/关键帧检测/] C --> F[/Whisper ASR/] D --> G[/章节标签/] E --> H[/视觉 Embedding/] F --> I[/文本 Embedding/] G --> J[/元数据 Embedding/] H --> K[/时序对齐/] I --> K J --> K K --> L[/统一时序索引/] style K fill:#fff5cc

视频 RAG 的"统一时序索引"是连接多种模态的核心枢纽。

关键帧提取是视频 RAG 的"成本控制阀门"——不做关键帧检测就直接 Embedding 所有帧,存储与算力成本会爆炸。

flowchart LR A[/原始视频 3600 帧/] --> B[/场景检测/] B --> C[/关键帧 50-100/] C --> D[/Embedding/] D --> E[/存储成本 1/40/] style B fill:#fff5cc

关键帧提取是"用算法换成本"的典型工程实践。

十一、Microsoft GraphRAG 架构:社区检测与全局问题

2024 年 7 月,微软开源 GraphRAG 项目,在 RAG 社区引发强烈反响。它用知识图谱 + 社区检测 + 层级摘要的范式,精准解决了"全局性问题"这个传统 RAG 的老大难。本章从架构层面深入剖析 GraphRAG 的核心思想、模块拆解与工程取舍。

11.1 GraphRAG 的核心抽象:从"段落"到"图谱"

传统 RAG 的核心抽象是"段落 chunk"——文档被切成 500-1000 token 的 chunk,每个 chunk 独立 Embedding。GraphRAG 的核心抽象是"实体-关系图"——文档被解析为"实体(Entity)+ 关系(Relationship)"的图谱,实体和关系都被 Embedding 并索引。

这种抽象的价值在于:把"局部段落"升级为"全局结构"。当用户问"公司高管之间的汇报关系"时,传统 RAG 需要在多个 chunk 中拼接信息;GraphRAG 直接在图谱上做图查询,天然支持全局关系推理。

传统 RAG 抽象 vs GraphRAG 抽象
═══════════════════════════════════════════════════════════════

  传统 RAG 抽象:                   GraphRAG 抽象:
  ─────────────                    ─────────────
  文档                              文档
     │                                 │
     ▼ 分块                            ▼ LLM 抽取
  chunks                              实体 + 关系
     │                                 │
     ▼ Embedding                        ▼ 构建图谱
  文本向量                            节点 + 边
     │                                 │
     ▼ ANN 检索                        ▼ Embedding
  Top-K 文本                          节点向量 + 边向量
     │                                 │
     ▼ LLM 生成                        ▼ 图查询/向量检索
  答案                                 答案

  核心差异:                            核心优势:
  · 信息以 chunk 为单元               · 信息以实体/关系为单元
  · 检索是相似度匹配                   · 检索是图遍历 + 相似度
  · 难以处理全局关系                   · 天然支持关系推理

11.2 GraphRAG 的两阶段流程

GraphRAG 的处理流程分为两个主要阶段:

阶段 1:索引阶段(Indexing)。把原始文档转化为知识图谱 + 社区层级摘要。这是离线流程,对每个文档执行一次。

阶段 2:查询阶段(Querying)。基于索引阶段的图谱与摘要回答用户问题。这是在线流程,每次查询执行。

GraphRAG 完整处理流程
═══════════════════════════════════════════════════════════════

  索引阶段 (离线)
  ──────────────
  文档集合
     │
     ▼
  ┌──────────────────────┐
  │ ① 文本分块           │  500-1000 token/chunk
  └──────┬───────────────┘
         │
         ▼
  ┌──────────────────────┐
  │ ② LLM 实体/关系抽取  │  GPT-4 / Qwen-Long
  │    "找出所有实体和     │  Prompt: 实体类型 + 关系类型
  │     它们之间的关系"   │  输出: (entity, type, desc)
  └──────┬───────────────┘         (entity1, rel, entity2)
         │
         ▼
  ┌──────────────────────┐
  │ ③ 构建知识图谱        │  NetworkX / Neo4j
  │    节点 = 实体        │  节点带类型、描述、Embedding
  │    边 = 关系          │  边带类型、权重、Embedding
  └──────┬───────────────┘
         │
         ▼
  ┌──────────────────────┐
  │ ④ 社区检测            │  Leiden / Louvain 算法
  │    把图谱分成社区      │  层级化: L0, L1, L2
  └──────┬───────────────┘
         │
         ▼
  ┌──────────────────────┐
  │ ⑤ 社区摘要            │  LLM 为每个社区生成摘要
  │    LLM 总结社区内容   │  摘要: 200-500 字
  └──────┬───────────────┘
         │
         ▼
  ┌──────────────────────┐
  │ ⑥ Embedding 索引      │  节点/边/社区摘要均 Embedding
  └──────┬───────────────┘
         │
         ▼
  图谱 + 社区摘要 + 向量索引

  查询阶段 (在线)
  ──────────────
  用户 Query
     │
     ▼
  ┌──────────────────────┐
  │ ① Query 分类         │  Local / Global 两种
  │    "这是局部问题      │
  │     还是全局问题?"    │
  └──────┬───────────────┘
         │
    ┌────┴────┐
    ▼         ▼
  Local     Global
  局部查询   全局查询
    │         │
    ▼         ▼
  实体检索   社区摘要检索
  + 邻居遍历  + Map-Reduce
    │         │
    └────┬────┘
         ▼
       LLM 答案

11.3 Leiden 算法:社区检测的工程实现

Leiden 算法是 GraphRAG 用于社区检测的核心算法。它在 Louvain 算法基础上做了改进,能发现层级化社区结构——既能识别大社区(如"公司高管圈"),也能识别大社区内的小社区(如"技术高管圈")。

Leiden 算法的核心思想:

Leiden 算法伪代码
═══════════════════════════════════════════════════════════════

  def leiden(graph, levels=3):
      """
      层级化社区检测
      graph: 知识图谱
      levels: 社区层级数
      """
      communities = graph  # 初始: 每个节点一个社区
      hierarchy = []

      for level in range(levels):
          # 阶段 1: 局部移动
          # 把每个节点移到能让模块度提升最大的社区
          improved = True
          while improved:
              improved = False
              for node in graph.nodes:
                  best_community = node.community
                  best_gain = 0
                  for neighbor in node.neighbors:
                      if neighbor.community != node.community:
                          gain = modularity_gain(node, neighbor.community)
                          if gain > best_gain:
                              best_community = neighbor.community
                              best_gain = gain
                  if best_gain > 0:
                      move_node(node, best_community)
                      improved = True

          # 阶段 2: 社区细化
          # 把不连通的社区拆开

          # 阶段 3: 社区聚合
          # 把社区当作新节点, 构建下一层图谱

          hierarchy.append(current_communities)

      return hierarchy

Leiden 算法输出的"层级社区"是 GraphRAG 全局查询的基础。每一层社区都对应一个"摘要"——一个 LLM 生成的、能代表该社区所有节点和边的高质量文本段落。查询时,根据 Query 类型检索对应层的社区摘要。

11.4 Local vs Global 查询:两种推理模式

GraphRAG 把用户 Query 分为两类,分别用不同流程:

Local 查询(局部问题)。问题指向具体实体,如"张三是哪个部门的?"、"X 产品的研发负责人是谁?"。Local 查询的流程:实体识别 → 实体 Embedding 检索 → 邻居节点遍历 → LLM 生成。

Global 查询(全局问题)。问题指向全局模式,如"公司的核心技术布局是什么?"、"近一年的主要风险有哪些?"。Global 查询的流程:社区摘要 Embedding 检索 → Top-K 社区摘要 → Map-Reduce 汇总 → LLM 生成。

Global 查询的 Map-Reduce 模式:先把每个社区摘要作为"独立证据",让 LLM 对每个摘要单独提取关键信息(Map),再把所有关键信息汇总,让 LLM 生成最终答案(Reduce)。这种模式能有效处理"答案信息分散在数十个社区"的问题。

11.5 工程实现的关键挑战

GraphRAG 在企业落地面临四个工程挑战:

挑战 1:LLM 抽取成本。实体/关系抽取需要调用 LLM(如 GPT-4),每个 chunk 大约 5-10K token。1 万页文档可能消耗 1 亿+ token,成本数千美元。解决方案:用小模型(如 Qwen2-7B)替代 GPT-4 + 异步批处理 + 缓存

挑战 2:抽取质量与一致性。LLM 抽取实体时,"苹果"可能被识别为"苹果公司"或"苹果水果",不同 chunk 之间实体不一致。解决方案:实体对齐(Entity Resolution) + 标准化命名

挑战 3:图谱更新。文档新增/更新时,图谱需要增量更新——这比传统 RAG 的"加 chunk"复杂得多。解决方案:增量索引 + 版本控制 + 图谱合并

挑战 4:可扩展性。当文档量达到 100 万+页时,图谱可能有 1000 万+节点、1 亿+边,图算法(Leiden)的执行时间变长。解决方案:分布式图计算 + 增量社区检测 + 摘要缓存

11.6 GraphRAG 适用场景与不适用场景

GraphRAG 不是"万能 RAG"。架构师必须判断业务是否适合:

适合 GraphRAG 不适合 GraphRAG
全局性问题("整体趋势是什么")事实型查询("X 是多少")
关系密集型文档(人物关系、组织架构)纯事实文档(规章、手册)
实体丰富的领域(法律、医疗、商业)实体稀少的领域(编程、几何)
多文档交叉问题单文档独立问题
需要"为什么" / "如何"的解释性查询需要"多少" / "何时"的数值查询

核心观点:GraphRAG 是"全局性问题"的标准解,但它不是"更好"的 RAG,而是"不同"的 RAG。架构师应当把 GraphRAG 与传统 RAG组合使用——事实型查询走传统 RAG,全局型查询走 GraphRAG。两者并存,形成"双引擎"架构,这才是 2026 年企业级 RAG 的最佳实践。

十二、LightRAG / HippoRAG:增量更新与 PPR 引导

GraphRAG 之后,学术界与工业界进一步探索了"轻量级图谱 RAG"的多种路径。LightRAG(港大 2024)和 HippoRAG(OSU 2024)是两个代表性方案,分别从"增量更新"和"PPR 引导检索"两个维度优化 GraphRAG 的痛点。本章深入剖析这两条演进路径。

12.1 LightRAG:双层检索与增量更新

LightRAG 由香港大学黄超团队在 2024 年 10 月提出,核心改进是"双层检索"和"增量更新"。它把 GraphRAG 的"全局图谱"分解为"低层实体级图谱 + 高层主题级图谱",检索时双层并行。

LightRAG 双层图谱架构
═══════════════════════════════════════════════════════════════

  ┌─────────────────────────────────────────────┐
  │           LightRAG 双层图谱                 │
  ├─────────────────────────────────────────────┤
  │  L1: 实体-关系层 (Entity-Relation)          │
  │                                              │
  │  节点: 具体实体(人/物/概念)                  │
  │  边: 实体间具体关系                          │
  │  检索粒度: 细粒度                            │
  │  适合: "X 是什么" "X 和 Y 关系"            │
  │                                              │
  │  ─────────────────────────────────────────  │
  │                                              │
  │  L2: 主题-关键词层 (Topic-Keyword)           │
  │                                              │
  │  节点: 抽象主题 / 关键词簇                    │
  │ 边: 主题间关联 / 关键词共现                   │
  │ 检索粒度: 粗粒度                            │
  │ 适合: "整体趋势" "核心主题"                │
  │                                              │
  └─────────────────────────────────────────────┘

  双层并行检索:
  Query ─┬─► L1 实体检索 ──► 实体级证据
         │
         └─► L2 主题检索 ──► 主题级证据
                       │
                       ▼
                证据融合 + LLM 生成

LightRAG 的双层架构对 GraphRAG 三大痛点的改进:

改进 1:检索更精准。双层并行检索能同时覆盖"具体实体"和"抽象主题",避免 GraphRAG 单层社区检测的"粒度单一"问题。

改进 2:增量更新更友好。新文档到来时,只需在两层图谱上局部更新(新增节点、边、主题),无需重跑全量 Leiden 算法。这是 LightRAG 名字中"Light"的由来。

改进 3:成本更低。LightRAG 不需要 Leiden 社区检测和层级摘要生成,仅维护双层图谱和向量索引,整体索引成本约为 GraphRAG 的 30-50%。

12.2 LightRAG 的增量更新机制

LightRAG 的核心创新之一是"增量更新"——支持新文档动态加入图谱而无需全量重建。具体流程:

LightRAG 增量更新流程
═══════════════════════════════════════════════════════════════

  现有图谱 G(V, E)
       │
       ▼
  新文档 d 到达
       │
       ▼
  ① 文档分块 chunks
       │
       ▼
  ② LLM 抽取新实体/关系
       │
       ▼
  ③ 实体对齐 (与现有实体合并)
       │
       ├─► 已存在实体: 更新描述/关系
       │
       └─► 新实体: 添加到 V
       │
       ▼
  ④ 主题聚类 (新增文档的主题归入现有主题簇)
       │
       ▼
  ⑤ 向量索引增量更新
       │
       ▼
  ⑥ 图谱 G'(V', E') 完成增量

  时间复杂度:
  ──────────
  全量重建:  O(|V| + |E|)
  增量更新:  O(新 chunk 数的实体抽取)

  收益: 文档量增长 10 倍, 重建成本不会增加 10 倍

这种增量更新能力对动态知识库(新闻、舆情、内部 wiki)尤其重要——传统 GraphRAG 在文档频繁更新时维护成本极高,LightRAG 把成本压到"可接受"范围。

12.3 HippoRAG:受神经科学启发的 PPR 检索

HippoRAG 由俄亥俄州立大学(OSU)的 Yejin Choi 团队在 2024 年 5 月提出。它的灵感来自海马体记忆理论——人类大脑的海马体负责把新记忆与已有记忆关联,形成可检索的记忆网络。HippoRAG 把这一机制数字化:

核心抽象。文档 → 知识图谱(OpenIE 抽取的实体和关系)。Query 到来时,从 Query 中识别关键实体,在图谱上做Personalized PageRank(PPR),让 Query 实体作为"种子节点"沿图边扩散激活,最终得到与 Query 最相关的节点。

与传统图检索的区别。传统图检索是"一跳/两跳邻居查询"——只看到直接相连的节点。PPR 是"全图激活扩散"——通过随机游走把激活值传播到整个图谱,捕获多跳关联。

HippoRAG PPR 检索机制
═══════════════════════════════════════════════════════════════

  Query: "X 的导师写过什么书?"
       │
       ▼
  实体识别: X
       │
       ▼
  在图谱中定位 X 节点
       │
       ▼
  Personalized PageRank
  (以 X 为种子节点, α=0.15 阻尼)
       │
       ▼
  激活值传播:
       │
  X (激活 1.0)
    │
    ├──► 导师是 Y (激活 0.7)
    │       │
    │       └──► Y 写过书 Z (激活 0.4)
    │               │
    │               └──► Z 出版社 P (激活 0.2)
    │
    └──► X 就读学校 S (激活 0.3)
            │
            └──► S 教授 W (激活 0.1)
       │
       ▼
  激活值 Top-K 节点: Z, Y, S, P
       │
       ▼
  关联到原始文档
       │
       ▼
  LLM 生成答案

PPR 检索相比传统图查询有三大优势:

优势 1:自然支持多跳。PPR 通过随机游走自然捕获多跳关联,不需要显式指定跳数。

优势 2:考虑激活衰减。距离种子节点越远,激活值越低。这模拟了人类记忆的"近因效应"——离 Query 实体近的记忆更清晰。

优势 3:可解释性强。PPR 的激活路径天然是"推理链",能直接展示"为什么这个文档被检索到"。

12.4 HippoRAG 的工程实现

HippoRAG 的工程实现包括三个核心模块:

HippoRAG 架构模块
═══════════════════════════════════════════════════════════════

  ┌──────────────────────────────────────┐
  │  ① OpenIE 抽取                       │
  │     Stanford CoreNLP / LLM           │
  │     抽取: (主体, 谓词, 客体) 三元组    │
  │     输出: 知识图谱                    │
  └──────────┬───────────────────────────┘
             │
             ▼
  ┌──────────────────────────────────────┐
  │  ② LLM 实体链接                      │
  │     把 Query 中的实体链接到图谱节点    │
  │     用 Embedding 相似度匹配           │
  └──────────┬───────────────────────────┘
             │
             ▼
  ┌──────────────────────────────────────┐
  │  ③ Personalized PageRank             │
  │     NetworkX / igraph 实现           │
  │     α=0.15 (重启概率)                │
  │     迭代 100 次或收敛                │
  │     输出: 节点激活值排序              │
  └──────────┬───────────────────────────┘
             │
             ▼
  ┌──────────────────────────────────────┐
  │  ④ 文档关联 + LLM 答案                │
  │     把高激活节点关联回原始文档         │
  │     Top-K 文档送入 LLM               │
  └──────────────────────────────────────┘

12.5 LightRAG vs HippoRAG:架构对比与选型

LightRAG 和 HippoRAG 都是 GraphRAG 的优化方案,但优化方向不同:

维度 LightRAG HippoRAG
优化目标增量更新 / 成本降低多跳检索 / 神经科学启发
核心创新双层图谱(实体层 + 主题层)PPR 激活扩散检索
索引成本低(无需 Leiden)中(需要 OpenIE)
检索算法向量检索 + 邻居遍历Personalized PageRank
多跳支持弱(需手动配置跳数)强(随机游走自然多跳)
增量更新强(设计目标)中(需重建 PPR 索引)
可解释性中(双层证据)强(激活路径可追溯)
适用场景动态知识库 / 成本敏感多跳问题 / 学术研究

12.6 知识图谱增强的演进趋势

从 GraphRAG → LightRAG → HippoRAG,知识图谱增强 RAG 呈现三个明显趋势:

趋势 1:从"全量图谱"到"分层图谱"。单一全量图谱难维护,演进为"实体层 + 主题层"或"局部图谱 + 全局图谱"的层级化设计。

趋势 2:从"批处理"到"增量更新"。全量重建成本高,演进为增量更新机制(新增文档局部修改图谱)。

趋势 3:从"相似度检索"到"图算法检索"。传统向量检索不能利用图结构,演进为 PPR、子图匹配等图算法检索。

这三条趋势共同指向"更智能的图谱 RAG"——既能处理全局问题,又能保持低成本更新,还能利用图结构做深度推理。

核心观点:知识图谱增强 RAG 正在从"概念验证"走向"工程落地"。GraphRAG 是奠基者但成本高,LightRAG 与 HippoRAG 分别从"增量更新"与"多跳检索"两个维度优化。架构师应当根据业务特征选择:动态知识库选 LightRAG,多跳问题选 HippoRAG,规模不大且全局问题为主选 GraphRAG。三者可以并存——GraphRAG 做基线,LightRAG 做增量层,HippoRAG 做多跳增强。

LightRAG 与 HippoRAG 分别从"增量更新"和"PPR 检索"两个维度优化 GraphRAG。这一演进表明,知识图谱增强 RAG 正在从"概念验证"走向"工程落地"。

flowchart TB A[/GraphRAG 优化路径/] --> B[/LightRAG 增量更新/] A --> C[/HippoRAG 多跳检索/] B --> D[/双层图谱/] B --> E[/实体层 + 主题层/] C --> F[/OpenIE 抽取/] C --> G[/PPR 激活扩散/] D --> H[/适用:动态知识库/] F --> I[/适用:多跳问题/] style B fill:#e5f5ff style C fill:#fff5e5

两种优化路径针对不同业务特征,架构师应当按"动态性"与"多跳性"两维度选型。

GraphRAG 的核心创新是"图谱 + 社区 + 摘要"的层级化处理。这一架构把传统 RAG 的"段落"抽象升级为"实体-关系"图谱,天然支持全局性问题。

flowchart TB A[/文档集合/] --> B[/分块/] B --> C[/LLM 实体关系抽取/] C --> D[/知识图谱/] D --> E[/Leiden 社区检测/] E --> F[/层级社区 L0 L1 L2/] F --> G[/LLM 社区摘要/] G --> H[/Embedding 索引/] H --> I[/索引完成/] I --> J[/Query: 局部/] I --> K[/Query: 全局/] J --> L[/实体检索 + 邻居遍历/] K --> M[/社区摘要 + Map-Reduce/] style E fill:#fff5cc style G fill:#fff5cc

GraphRAG 的双流程(Local / Global)覆盖了"实体查询"和"全局聚合"两类问题。

知识图谱增强 RAG 的演进反映了"问题驱动"的范式跃迁——从 GraphRAG 的概念验证,到 LightRAG 的工程优化,到 HippoRAG 的多跳增强。

flowchart TB A[/知识图谱增强 RAG/] --> B[/GraphRAG 奠基/] A --> C[/LightRAG 增量/] A --> D[/HippoRAG 多跳/] B --> E[/社区检测 + 摘要/] C --> F[/双层图谱 + 增量/] D --> G[/PPR 激活扩散/] style A fill:#fff5cc

三种方案各有侧重,架构师应按"动态性"与"多跳性"两维度选型。

十三、KAG 框架:领域知识增强生成

2024 年 10 月,阿里巴巴蚂蚁集团开源了 KAG(Knowledge-Augmented Generation)框架,把"知识图谱 + 形式化推理 + 垂直领域"结合在一起,成为专业领域 RAG的代表性方案。KAG 在 OpenKG、蚂蚁业务场景(金融、医疗、政务)上的实践为垂直领域 RAG 提供了一套完整的方法论。本章从架构层面深入剖析 KAG 的核心思想、模块设计与企业落地路径。

13.1 KAG 的核心抽象:开放信息抽取 + 形式化知识

KAG 与 GraphRAG 的核心差异在于"知识表示的严格性"。GraphRAG 用 LLM 自由抽取实体和关系,关系是自然语言描述(如"工作于"、"合作过")。KAG 在此基础上引入了Schema 约束形式化推理

GraphRAG vs KAG 知识表示对比
═══════════════════════════════════════════════════════════════

  GraphRAG 知识表示:
  ─────────────────
  节点: {实体, 类型, 描述(自然语言)}
  边: {源实体, 目标实体, 关系(自然语言)}
  示例:  {name: "张三", type: "Person", desc: "..."}
        {name: "A公司", type: "Company", desc: "..."}
        {src: "张三", tgt: "A公司", rel: "工作于"}

  特点: 灵活 / 自然语言描述 / 难推理

  KAG 知识表示:
  ─────────────
  节点: {实体, 严格类型, 严格属性(Schema 定义)}
  边: {源实体, 目标实体, 关系(本体约束)}
  示例:  {name: "张三", type: "Person", attrs: {age:30, role:"工程师"}}
        {name: "A公司", type: "Company", attrs: {industry:"科技"}}
        {src: "张三", tgt: "A公司", rel: "EMPLOYED_BY"}

  特点: 严格 / 类型化 / 可形式化推理

  形式化推理示例:
  ─────────────
  IF X EMPLOYED_BY Y AND Y INDUSTRY = "科技"
  THEN X 可能在科技行业

  GraphRAG 无法做这种推理,KAG 可以

13.2 KAG 的四层架构

KAG 框架采用四层架构设计,每一层都对应明确的工程职责:

KAG 四层架构
═══════════════════════════════════════════════════════════════

  ┌─────────────────────────────────────────────────────┐
  │  Layer 1: Schema 层 (本体定义)                       │
  │                                                      │
  │  · 领域 Schema 定义 (实体类型、关系类型、属性约束)    │
  │  · OpenKG / UMLS / SNOMED 等行业本体导入             │
  │  · 用户可自定义扩展                                  │
  │  · 类比: 数据库的 DDL                                │
  ├─────────────────────────────────────────────────────┤
  │  Layer 2: 抽取层 (开放信息抽取)                      │
  │                                                      │
  │  · LLM + Schema 约束的实体/关系抽取                  │
  │  · 实体对齐(同义合并)、属性归一化                    │
  │  · 置信度评分                                        │
  │  · 类比: 数据库的 ETL                                │
  ├─────────────────────────────────────────────────────┤
  │  Layer 3: 知识层 (图谱存储)                          │
  │                                                      │
  │  · 严格类型的图谱(节点、边、属性)                    │
  │  · 向量化 Embedding(节点、边、子图)                  │
  │  · 多种图谱后端(Neo4j, TuGraph, OceanBase)          │
  │  · 类比: 数据库的存储引擎                            │
  ├─────────────────────────────────────────────────────┤
  │  Layer 4: 推理层 (混合推理)                          │
  │                                                      │
  │  · 向量检索(图谱节点 Embedding)                      │
  │  · 逻辑推理(SPARQL / Cypher / GQL)                  │
  │  · LLM 推理(自然语言答案生成)                       │
  │  · 类比: 数据库的查询引擎                            │
  └─────────────────────────────────────────────────────┘

13.3 Schema 层:领域本体的引入

KAG 的核心创新是"Schema-first"——先定义领域本体(ontology),再进行信息抽取。这一思路与传统 GraphRAG 的"Schema-less"形成鲜明对比。

Schema 的核心组件:

实体类型(Entity Types)。如金融领域定义"公司"、"股票"、"分析师"、"财报"、"行业"等实体类型。

关系类型(Relation Types)。如"公司-发布-财报"、"分析师-研究-股票"、"公司-属于-行业"等关系类型,且关系有方向、基数(1:1 / 1:N / N:N)约束。

属性约束(Property Constraints)。如"公司"实体有"成立时间"、"注册资本"、"主营业务"等必填/选填属性,且属性有数据类型(字符串/数字/日期)。

Schema 带来了三大好处:

好处 1:抽取质量提升。LLM 在 Schema 约束下做信息抽取,输出严格符合定义的结构化数据,避免"自由抽取"的混乱。

好处 2:推理能力。严格的类型和关系让图谱支持形式化推理(如 RDFS / OWL 推理),而不只是相似度检索。

好处 3:领域可解释性。Schema 本身就是领域知识的"骨架",业务专家可以审核和修改,符合企业合规需求。

13.4 形式化推理:从图谱到答案

KAG 的推理层支持三种模式:

模式 1:向量检索。Query Embedding → 图谱节点 Embedding ANN 检索 → Top-K 节点 → LLM 生成答案。这是 GraphRAG 风格。

模式 2:逻辑查询。把 Query 转译为 SPARQL / Cypher / GQL 查询 → 图谱执行 → 结果送 LLM 生成答案。这种模式适合"结构化查询"("列出 2024 年营收超过 100 亿的公司")。

模式 3:混合推理。先用向量检索召回候选节点,再用逻辑查询精确过滤,最后 LLM 生成。这种模式兼顾了语义匹配与精确推理。

KAG 混合推理流程
═══════════════════════════════════════════════════════════════

  Query: "列出 2024 年营收超过 100 亿且在科技行业的公司"
       │
       ▼
  ① Query 解析 (LLM)
       │  识别:
       │  - 实体类型: 公司
       │  - 过滤条件: 营收 > 100亿 AND 行业 = 科技
       │  - 时间: 2024 年
       ▼
  ┌────────────────────────────────────┐
  │  ② 混合检索                        │
  │                                    │
  │  向量检索 (语义):                   │
  │    "公司" 节点 Embedding → Top-100 │
  │                                    │
  │  逻辑过滤 (精确):                   │
  │    营收 > 100亿 AND 行业 = 科技     │
  │                                    │
  │  → 候选: 23 家公司                  │
  └──────────────┬─────────────────────┘
                 │
                 ▼
  ③ LLM 答案生成
       │
       ▼
  答案: "A公司(120亿)、B公司(150亿)、C公司(180亿)..."

13.5 垂直领域适配:金融/医疗/政务案例

KAG 在蚂蚁集团的多个垂直领域落地,每个领域都有针对性的 Schema 与推理设计:

领域 实体类型 关系类型 典型推理
金融公司/股票/财报/分析师发布/研究/投资/控股财务比对 / 风险传导
医疗疾病/药物/症状/检查治疗/诊断/禁忌用药推理 / 鉴别诊断
政务政策/法规/部门/事项发布/管辖/适用政策匹配 / 法规冲突检测
电商商品/品牌/类目/属性属于/相似/搭配商品推荐 / 类目导航
法律法条/案例/当事人/判决引用/适用/判决类案检索 / 法条推理

以金融领域为例,KAG 通过导入"XBRL 财报本体"+"上交所/深交所公司本体"+"行业分类本体(GICS)"等开源 Schema,能在 1-2 周内完成一个金融场景的领域适配,远快于从零构建图谱。

13.6 KAG 与 GraphRAG 的差异化定位

KAG 不是"取代"GraphRAG,而是"专业领域 RAG 的进阶版"。两者的关系:

GraphRAG 定位:通用领域 / 探索性项目 / 快速验证全局性问题可行性。

KAG 定位:垂直领域 / 工业化项目 / 需要严格推理与可解释性。

架构师选型时,应当用"业务复杂度 × 合规要求"两维矩阵判断:

KAG vs GraphRAG 选型决策
═══════════════════════════════════════════════════════════════

                  业务复杂度低        业务复杂度高
                  ────────────        ────────────
  合规要求高      传统 RAG           KAG
                 (内部知识库)       (金融/医疗/法律)
                      │                  │
                      ▼                  ▼
                 不需要图谱         严格 Schema + 推理
                 简单 Embedding     形式化知识 + 业务本体

                  业务复杂度低        业务复杂度高
                  ────────────        ────────────
  合规要求低      传统 RAG           GraphRAG / LightRAG
                 (FAQ 问答)         (研究/分析)
                      │                  │
                      ▼                  ▼
                 简单召回            灵活图谱 + 探索
                 不需要形式化        自由抽取 + 社区

13.7 KAG 工程落地的关键挑战

KAG 在企业落地也面临挑战:

挑战 1:Schema 定义成本。领域本体定义需要业务专家 + 知识工程师联合工作,1-2 周起步。中小企业可能难以承担。

挑战 2:LLM 抽取的"严格性"。即使有 Schema 约束,LLM 仍可能输出"勉强符合"但实际不符的实体/关系。需要后处理校验层。

挑战 3:图谱运维。图谱的"增删改查"比传统数据库复杂,需要专门的图谱运维工具链。

挑战 4:性能。严格的图查询(SPARQL / Cypher)在亿级图谱上响应时间长,需要图数据库优化(索引、缓存、并行)。

核心观点:KAG 框架代表了"专业领域 RAG 工业化"的方向。Schema-first 的设计哲学让 RAG 从"通用技术玩具"走向"严肃业务系统"。对架构师而言,KAG 是垂直领域深度 RAG 的首选,但要权衡 Schema 定义的初始成本与长期收益。在金融、医疗、法律、政务等"准确性即生命"的领域,KAG 的形式化推理是 GraphRAG 无法替代的护城河。

KAG 的"Schema-first"哲学把 RAG 从"通用技术玩具"推向"专业业务系统"。这一范式在金融、医疗、法律等"准确性即生命"的领域有不可替代的价值。

flowchart TB A[/KAG 四层架构/] --> B[/Schema 层/] A --> C[/抽取层/] A --> D[/知识层/] A --> E[/推理层/] B --> F[/领域本体定义/] C --> G[/LLM + Schema 抽取/] D --> H[/图谱 + Embedding/] E --> I[/向量 + 逻辑 + LLM 推理/] style B fill:#fff5cc style E fill:#e5ffe5

KAG 的四层架构让"专业领域 RAG"有了清晰的方法论支撑。

垂直领域 RAG 的"Schema-first"哲学与通用 RAG 的"Schema-less"形成鲜明对比。这一差异决定了 KAG 在专业领域的不可替代性。

flowchart TB A[/RAG 范式对比/] --> B[/通用 RAG Schema-less/] A --> C[/垂直 RAG Schema-first/] B --> D[/灵活/但难推理/] C --> E[/严格/可形式化/] D --> F[/适用:通用场景/] E --> G[/适用:专业领域/] style C fill:#fff5cc

Schema-first 带来的"形式化推理"是垂直领域 RAG 的核心优势。

十四、Self-Ask / ReAct 检索链:推理与检索解耦

2022-2023 年,Self-Ask 与 ReAct 的出现标志着 RAG 从"单步检索"走向"多步推理式检索"。这两种范式把"思考(Reasoning)"与"动作(Acting,包括检索)"显式解耦,让 LLM 能像人类一样"边思考边查资料"。本章从架构层面深入剖析 Self-Ask 与 ReAct 的核心思想、实现机制与差异。

14.1 范式跃迁:从"检索-生成"到"推理-检索-生成"

传统 RAG 流程是"retrieve-then-read":先一次性检索 Top-K 文档,然后送 LLM 生成。这种"单步检索"在多跳问题上失效(见第二章)。Self-Ask 与 ReAct 引入"推理-检索交替"的范式:

传统 RAG vs Self-Ask / ReAct 范式对比
═══════════════════════════════════════════════════════════════

  传统 RAG (retrieve-then-read):
  ──────────────────────────────
  Query ──► 一次性检索 ──► Top-K 文档 ──► LLM 生成 ──► 答案
            (单步)

  Self-Ask (推理-检索交替):
  ──────────────────────────────
  Query ──► 推理(我需要知道 X?) ──► 检索 X ──► 推理(基于 X,我还需要 Y?) ──► 检索 Y ──► ... ──► 推理(够了,综合答案) ──► 答案
            (多步,显式问句)

  ReAct (Thought-Action-Observation 循环):
  ──────────────────────────────
  Query ──► Thought(下一步动作) ──► Action(Search X) ──► Observation(检索结果) ──► Thought(下一步动作) ──► ... ──► Thought(可以回答了) ──► Action(Finish) ──► 答案
            (多步,显式思维链)

14.2 Self-Ask:显式问句驱动的多跳检索

Self-Ask 由谷歌研究院在 2022 年提出。它的核心思想是:让 LLM 在推理过程中显式生成"我需要问的问题",触发检索动作。这一设计让多跳问题的每一步都显式可追溯。

Self-Ask 的 Prompt 模板:

Self-Ask Prompt 模板
═══════════════════════════════════════════════════════════════

  问: {用户 Query}

  让我们一步一步思考,中间可能需要问一些子问题:

  问: X 是什么? (Follow up needed)
  子问: X 是什么?
  答: X 是 Y。

  问: 接下来,Z 是什么? (Follow up needed)
  子问: Z 是什么?
  答: Z 是 W。

  问: 回到原问题,综合 Y 和 W,答案是什么?
  答: 综合以上,答案是 ...

Self-Ask 的关键机制是"Follow up needed"信号——LLM 在每一步推理后判断"我是否需要更多子信息"。如果需要,就生成子问句触发检索;如果不需要,就基于已有信息生成答案。

Self-Ask 的工程实现:

Self-Ask 检索循环伪代码
═══════════════════════════════════════════════════════════════

  def self_ask(query, max_steps=5):
      context = []
      question = query
      for step in range(max_steps):
          # 推理: LLM 评估是否需要 follow up
          response = llm(
              f"问: {question}\n"
              f"已知信息: {context}\n"
              f"是否需要 follow up? 如果是,生成子问。"
          )
          if "Follow up needed" not in response:
              # 不需要 follow up,返回最终答案
              return parse_final_answer(response)
          # 提取子问句
          sub_question = parse_sub_question(response)
          # 检索子问句
          sub_answer = retrieve_and_answer(sub_question)
          # 累积到 context
          context.append((sub_question, sub_answer))
          # 下一轮:基于新信息继续推理
          question = query  # 始终围绕原问题
      return llm(f"基于所有信息回答: {query}")

14.3 ReAct:Thought-Action-Observation 三元组

ReAct(Reasoning + Acting)由 Princeton & Google 在 2022 年底提出,发表在 ICLR 2023。它把"思考"与"动作"形式化为三个槽位:

ReAct Thought-Action-Observation 范式
═══════════════════════════════════════════════════════════════

  Thought:  推理/规划("我需要知道 X 才能回答原问题")
  Action:   执行动作("Search[X]" / "Lookup[X]" / "Finish[answer]")
  Observation:  动作执行结果("搜索结果: X = Y")

  完整执行轨迹示例:
  ─────────────────

  Q: 苹果公司现任 CEO 的妻子写过什么小说?

  Thought 1: 我需要先找到苹果公司现任 CEO 是谁。
  Action 1:  Search[苹果公司现任 CEO]
  Obs 1:    蒂姆·库克 (Tim Cook) 自 2011 年起担任 CEO。

  Thought 2: 现在我需要知道蒂姆·库克的妻子是谁。
  Action 2:  Search[蒂姆·库克 妻子]
  Obs 2:    蒂姆·库克是公开的同性恋,没有传统意义上的妻子。

  Thought 3: 这个问题的前提是错的。我应该礼貌地指出。
  Action 3:  Finish[蒂姆·库克没有传统意义上的妻子,问题前提不成立。]

ReAct 的核心优势是"可解释性"——Thought-Action-Observation 三元组天然形成可追溯的推理链,用户和开发者都能看到 LLM "是如何思考的"。这与 Self-Ask 的"子问句"风格相比,ReAct 提供了更细粒度的过程可见性。

14.4 ReAct 的工程实现

ReAct 的工程实现通常使用 LangChain / LlamaIndex 的 Agent 框架:

ReAct Agent 架构
═══════════════════════════════════════════════════════════════

  ┌──────────────────────────────────┐
  │  ReAct Agent (核心循环)          │
  │                                   │
  │  1. 接收 Query                    │
  │  2. 调用 LLM 生成 Thought+Action │
  │  3. 解析 Action 类型              │
  │     ├─ Search → 调用检索器       │
  │     ├─ Lookup → 调用数据库       │
  │     ├─ Calculate → 调用计算器    │
  │     └─ Finish → 终止循环         │
  │  4. Observation 反馈给 LLM       │
  │  5. 重复 2-4 直到 Finish         │
  └────────────┬─────────────────────┘
               │
   ┌───────────┼───────────┐
   ▼           ▼           ▼
  检索器     数据库       计算器
  (向量/BM25) (SQL/KV)  (Python/Code)

一个标准 ReAct Agent 的核心循环代码:

# ReAct 核心循环 (LangChain 风格)
def react_agent(query, tools, max_iters=10):
    scratchpad = ""  # 累积 Thought/Action/Observation
    for i in range(max_iters):
        # 1. LLM 生成 Thought + Action
        response = llm(
            REACT_PROMPT.format(
                query=query,
                tools=tool_descriptions,
                scratchpad=scratchpad
            )
        )
        thought = parse_thought(response)
        action, action_input = parse_action(response)
        # 2. 执行 Action
        if action == "Finish":
            return action_input  # 返回最终答案
        elif action in tools:
            observation = tools[action].run(action_input)
        else:
            observation = "Invalid action"
        # 3. 累积到 scratchpad
        scratchpad += f"Thought: {thought}\n"
        scratchpad += f"Action: {action}[{action_input}]\n"
        scratchpad += f"Observation: {observation}\n"
    return "Max iterations reached"

14.5 Self-Ask vs ReAct:差异与选型

Self-Ask 与 ReAct 在哲学上很接近,但工程实现有差异:

维度 Self-Ask ReAct
核心抽象子问句 (Sub-question)Thought-Action-Observation
动作类型仅"问子问题"多种 (Search/Lookup/Calculate/...)
可解释性中(子问句链)强(思考+动作完整可见)
工程复杂度低(自实现)中(需 Agent 框架)
扩展性弱(仅检索)强(可加任意工具)
Token 消耗较高(Thought 占用 token)
多跳问题表现
适用场景纯检索类多跳问题检索+计算+操作的复杂问题

14.6 工程实践的常见问题

Self-Ask / ReAct 在生产落地中常遇到五个问题:

问题 1:无限循环。LLM 可能在某一步陷入循环,反复问类似问题。解决方案:max_iters 上限 + 循环检测(已检索子问句去重)

问题 2:检索漂移(见第二章)。每步检索的 Query 都基于上一步的中间结果,漂移会累积。解决方案:原始 Query 锚定 + 中间结果摘要

问题 3:Token 爆炸。ReAct 的 scratchpad 会累积所有历史,10 步后 prompt 可能超过 5K token。解决方案:scratchpad 摘要压缩 + 关键证据保留

问题 4:工具调用失败。检索器可能返回空结果或无关文档。解决方案:空结果重试 + 工具失败重定向

问题 5:成本高。ReAct 每步都调用 LLM,10 步 = 10 次 LLM 调用,token 消耗 5-10 倍于传统 RAG。解决方案:用小模型做"判断步" + 大模型做"综合步"

14.7 Self-Ask / ReAct 的演进:IRCoT 与 ReWOO

在 Self-Ask 和 ReAct 之后,学术界进一步优化:

IRCoT(Interleaving Retrieval with CoT)。把 CoT(思维链)与检索交错进行,但 CoT 不显式生成子问句,而是用 CoT 的中间推理步骤作为 Query。这一设计减少了 token 消耗,同时保留了多步检索能力。

ReWOO(Reasoning WithOut Observation)。ReAct 的改进版,把"推理"与"检索"解耦为两个独立阶段——先规划所有检索动作(不执行),再批量执行。优势是减少 LLM 调用次数(从 N 步降到 1 步),适合高并发场景。

RA-DIT(Retrieval-Augmented Dual Instruction Tuning)。Meta 提出的方法,把检索能力通过指令微调注入到 LLM 本身,让 LLM "内化"检索决策,减少对外部 Agent 框架的依赖。

核心观点:Self-Ask 和 ReAct 是"推理-检索解耦"范式的奠基者,但工程上有 token 消耗高、循环风险、检索漂移等问题。架构师应当把 Self-Ask / ReAct 视为"多跳 RAG 的开箱即用方案"——快速验证可行性,再根据业务特征演进到 IRCoT、ReWOO、Plan-and-Execute 等更成熟的方案。盲目追求"多步 Agent"是过度工程化,从单跳开始,按需演进才是 2026 年 RAG 的务实路径。

Self-Ask 与 ReAct 的核心思想是"推理-检索解耦"——让 LLM 显式生成 Thought/Action/Observation 循环,把"思考"与"动作"分开。这一范式在多跳问题上显著优于 retrieve-then-read。

flowchart LR A[/Query/] --> B[/Thought 1/] B --> C[/Action Search X/] C --> D[/Observation 1/] D --> E[/Thought 2/] E --> F[/Action Search Y/] F --> G[/Observation 2/] G --> H[/Thought N: 答案/] H --> I[/Action Finish/] I --> J[/最终答案/] style B fill:#e5f5ff style E fill:#e5f5ff style H fill:#fff5cc

Thought-Action-Observation 三元组天然形成可追溯的推理链,是 ReAct 范式的精髓。

Self-Ask 与 ReAct 代表"推理-检索解耦"的两种实现风格。Self-Ask 显式生成子问句,ReAct 用 Thought-Action-Observation 三元组。两者在工程实现与可解释性上各有侧重。

flowchart TB A[/推理-检索解耦/] --> B[/Self-Ask 子问句/] A --> C[/ReAct T-A-O 循环/] B --> D[/工程简单/] C --> E[/可解释性强/] style A fill:#fff5cc

两种范式代表"实现简洁性 vs 可解释性"的不同权衡。

十五、Plan-and-Execute RAG:检索计划生成

Self-Ask / ReAct 范式的"边走边看"虽然灵活,但缺乏全局规划。Plan-and-Execute(2023 年由 LangChain 提出)把"决策"和"执行"解耦为两阶段,先用一个 LLM 生成完整的检索计划,再逐步执行。这种"两步走"范式在长链路问题上显著更稳定。本章深入剖析 Plan-and-Execute 的核心思想、架构设计与工程实践。

15.1 Plan-and-Execute 的核心抽象

Plan-and-Execute 的核心思想是把多步推理解耦为"规划"和"执行"两个独立阶段:

Plan-and-Execute 两阶段架构
═══════════════════════════════════════════════════════════════

  阶段 1: 规划 (Planner)
  ───────────────────
  输入: 用户 Query
  输出: 步骤列表 (Plan)
       │
       │  LLM (Planner) 生成:
       │  Step 1: 检索 "X 的概念"
       │  Step 2: 检索 "X 的关键参数"
       │  Step 3: 计算 "X 的最终结果"
       │  Step 4: 综合所有信息生成答案
       │
       ▼
  阶段 2: 执行 (Executor)
  ───────────────────
  输入: 步骤列表
  输出: 每步结果 → 最终答案
       │
       │  按步骤执行:
       │  执行 Step 1 → 结果 A
       │  执行 Step 2 → 结果 B (基于 A)
       │  执行 Step 3 → 结果 C (基于 A,B)
       │  执行 Step 4 → 最终答案
       │
       ▼
  最终答案

  与 ReAct 的本质区别:
  ───────────────────
  ReAct: 每步都让 LLM 重新规划 → "边想边做"
  Plan-and-Execute: 先一次性规划完 → "先想后做"

15.2 为什么需要"先规划后执行"?

ReAct 的"边想边做"在工程上有三个痛点:

痛点 1:决策漂移。LLM 在每一步都可能改变方向,导致整体路径不一致。ReAct 的执行轨迹经常是"绕圈子"——前 3 步检索到的信息到第 4 步被推翻。

痛点 2:长链路不稳定。超过 5 跳后,ReAct 的成功率显著下降。LLM 在长链路上容易"忘记"原始目标。

痛点 3:Token 浪费。每步都让 LLM 重新"思考一遍",10 步 = 10 次完整思考,token 消耗巨大。

Plan-and-Execute 通过"先一次性规划完"解决这三大痛点:

解决 1:路径稳定。Plan 在执行前就确定了,Executor 只负责执行,不重新规划。这避免了"边走边改"的混乱。

解决 2:长链路友好。Planner 看到的是"全图",能规划出"先查 A,再查 B,最后综合 C"的全局最优路径。

解决 3:Token 优化。Planner 一次生成完整 Plan,Executor 在每步只需执行(少量 token 决策),整体 token 消耗降低 30-50%。

15.3 Planner 的实现:Plan 生成 Prompt

Planner 的核心是"如何让 LLM 生成合理的 Plan"。典型 Prompt 设计:

Planner Prompt 模板
═══════════════════════════════════════════════════════════════

  你是一个任务规划专家。
  用户问题: {用户 Query}

  可用工具:
  1. search[query] - 搜索相关信息
  2. lookup[key] - 查找具体数据
  3. calculate[expression] - 数学计算
  4. finish[answer] - 完成并输出答案

  请将用户问题分解为 3-7 步可执行的计划:
  每步包含 tool 和 input。

  输出格式 (JSON):
  {
    "plan": [
      {"step": 1, "tool": "search", "input": "X 的概念"},
      {"step": 2, "tool": "search", "input": "X 的关键参数"},
      {"step": 3, "tool": "calculate", "input": "X * Y"},
      {"step": 4, "tool": "finish", "input": "综合答案"}
    ]
  }

15.4 Executor 的实现:ReAct 风格逐步执行

Executor 接收 Plan 后,按步骤执行。每一步可以是简单的工具调用,也可以是 ReAct 风格的"小循环":

Plan-and-Execute Executor 流程
═══════════════════════════════════════════════════════════════

  Plan = [
    {step: 1, tool: "search", input: "X 的概念"},
    {step: 2, tool: "search", input: "X 的关键参数"},
    {step: 3, tool: "calculate", input: "X * Y"},
    {step: 4, tool: "finish", input: "综合答案"}
  ]

  执行流程:
  ─────────
  current_step = 0
  results = {}

  while current_step < len(Plan):
      step = Plan[current_step]
      # 执行当前步骤
      if step.tool == "search":
          result = search_engine.search(step.input)
      elif step.tool == "calculate":
          result = calculator.calculate(step.input)
      elif step.tool == "finish":
          return step.input  # 最终答案
      # 累积结果
      results[current_step] = result
      # Re-plan? (可选: 处理 Plan 与现实不一致)
      if should_replan(results):
          Plan = planner.replan(Plan, results)
          current_step = 0  # 重新开始
      else:
          current_step += 1

  return results

15.5 Replan 机制:处理计划与现实的不一致

Plan-and-Execute 的一个进阶设计是"Replan"——当某步执行结果与 Plan 假设不符时,重新规划剩余步骤。例如:

原 Plan:检索"X 的最新数据" → 计算 → 答案。但实际检索发现"X 的最新数据是 2024 年的,而用户问的是 2025 年"——这时需要 Replan,把 Plan 改为"检索 2025 年的新数据"。

Replan 触发条件与处理
═══════════════════════════════════════════════════════════════

  触发条件:
  ─────────
  ① 当前步骤结果与 Plan 假设不一致
     "我以为 X 是 Y,实际是 Z"
  ② 后续步骤的 input 依赖错误的中间结果
     "Plan 假设 A,实际 A 不存在"
  ③ 用户反馈当前路径不靠谱
     "这一步的答案不对"

  处理流程:
  ─────────
  触发 Replan ──► 调用 Planner (传入新信息)
              ──► 生成新 Plan (或修订 Plan)
              ──► 继续执行

  工程实现:
  ─────────
  维护一个"状态对象" {original_query, plan,
                       completed_steps, current_results}
  Replan 时把状态对象作为 Planner 的输入

Replan 机制让 Plan-and-Execute 在"Plan 不完全准确"时也能自适应,是其相比 ReAct 的核心优势之一。

15.6 Plan-and-Execute 的进阶设计

工业级 Plan-and-Execute 系统的常见进阶设计:

设计 1:层次化 Plan。把 Plan 组织为树形结构——主干 Plan + 子 Plan。例如"分析财报"主干 Plan 是"加载财报 → 提取数据 → 生成分析",每个子 Plan 自己又是一个 Plan-and-Execute 子任务。

设计 2:并行 Plan。当 Plan 中某些步骤无依赖关系时,并行执行。例如"对比 A 和 B 的营收"可以并行检索"2024 年 A 营收"和"2024 年 B 营收",再合并结果。

设计 3:Plan 缓存。对常见 Query 类型缓存 Plan,避免每次重新规划。例如"对比两家公司"类型的 Plan 模板可以缓存。

设计 4:人类反馈。在 Plan 生成后、执行前,允许人类审核和修改 Plan。这一设计在严肃业务场景(金融分析、医疗诊断)尤其重要。

15.7 Plan-and-Execute 的局限与替代方案

Plan-and-Execute 也有局限:

局限 1:Plan 错误传播。如果 Planner 生成的 Plan 第一步就错了,后续步骤都会受影响。虽然有 Replan 机制,但 Replan 本身需要 LLM 调用,有额外成本。

局限 2:难以处理"未知问题"。Planner 只能基于已有知识规划,对"未知领域"("探索 X 是什么")的 Plan 质量差。

局限 3:执行步骤固定。Plan 一旦生成,执行器倾向于"按部就班",灵活性不如 ReAct。

针对这些局限,业界演化出两个改进方向:

方向 1:Plan-and-Execute + ReAct 混合。Plan 做粗粒度规划,ReAct 做细粒度执行。例如 Plan 说"检索 X",ReAct 在检索时自主决定"用什么 Query 检索"。

方向 2:Multi-Agent 协作。下一章将深入讨论。把 Planner、Executor、Critic 设计为独立 Agent 协作,每个 Agent 负责自己擅长的环节。

核心观点:Plan-and-Execute 是"先想后做"哲学在 RAG 中的实现,它解决了 ReAct 的"边走边绕"问题。架构师应当把 Plan-and-Execute 视为长链路 RAG 的标准范式,对 3+ 跳的复杂问题优先采用。但要注意 Plan 错误传播问题,结合 Replan 机制和人类反馈环,让系统在"规划"与"自适应"之间取得平衡。

十六、DeepResearch 系统架构:OpenAI / Anthropic / Gemini Deep Research

2025 年 2 月,OpenAI 推出 Deep Research 模式,紧接着 Anthropic 推出 Research 功能,Google 也发布了 Gemini Deep Research。三家头部 AI 公司的"深度研究"产品在用户层面表现惊艳,背后是新一代 Agentic RAG 系统的工程化落地。本章从架构层面深入剖析三大 DeepResearch 系统的设计哲学、模块拆解与技术取舍。

16.1 DeepResearch 范式的核心特征

DeepResearch 不同于传统 RAG 问答,它面向"深度研究类问题"——"调研 X 市场"、"对比 Y 和 Z"、"分析 W 行业近五年趋势"。这类问题有四个共性:

特征 1:长链路推理。通常需要 5-20 步推理,包含检索、阅读、对比、归纳、综合多个动作。

特征 2:多源信息融合。需要从 web、PDF、数据库、API 等多种来源获取信息,不能依赖单一知识库。

特征 3:质量要求高。用户期待"研究报告级别"的输出,包含引用、数据、可视化、结构化分析。

特征 4:耗时容忍。用户愿意等待 5-30 分钟换取高质量答案,与实时问答的 SLA 完全不同。

16.2 OpenAI Deep Research 架构剖析

OpenAI Deep Research 基于 o3 / o4-mini 模型,专为深度研究任务设计。其架构核心:

OpenAI Deep Research 内部架构(推测)
═══════════════════════════════════════════════════════════════

  ┌─────────────────────────────────────┐
  │  任务理解层 (Task Understanding)     │
  │  · Query 解析                       │
  │  · 任务类型分类                     │
  │  · 隐含需求提取                     │
  └──────────────┬──────────────────────┘
                 │
                 ▼
  ┌─────────────────────────────────────┐
  │  研究规划层 (Research Planning)      │
  │  · 子任务分解 (5-15 个)             │
  │  · 研究路径规划                     │
  │  · 信息源优先级                     │
  └──────────────┬──────────────────────┘
                 │
                 ▼
  ┌─────────────────────────────────────┐
  │  信息检索层 (Information Retrieval) │
  │  · Web 搜索 (Bing)                  │
  │  · 文档阅读 (多模态)                │
  │  · 数据抽取 (表格/图表)             │
  │  · API 调用 (结构化数据)            │
  └──────────────┬──────────────────────┘
                 │
                 ▼
  ┌─────────────────────────────────────┐
  │  推理综合层 (Reasoning & Synthesis)  │
  │  · 跨源信息融合                    │
  │  · 证据链构建                      │
  │  · 多视角分析                      │
  │  · 矛盾检测与调和                  │
  └──────────────┬──────────────────────┘
                 │
                 ▼
  ┌─────────────────────────────────────┐
  │  报告生成层 (Report Generation)      │
  │  · 结构化大纲                      │
  │  · 多章节撰写                      │
  │  · 引用标注                        │
  │  · 可视化建议                      │
  └──────────────┬──────────────────────┘
                 │
                 ▼
  最终研究报告

OpenAI Deep Research 的核心特点是o3 模型的强推理能力 + 工具调用 Agent 框架。o3 具备原生工具调用(web search、file search、code execution)和多步推理能力,能在 5-30 分钟内完成传统需要人类研究员数小时的工作。

16.3 Anthropic Claude Research 架构剖析

Anthropic 的 Research 模式基于 Claude 3.7 Sonnet + Computer Use 能力。其架构与 OpenAI 类似,但有几个显著差异:

差异 1:研究流程更透明。Claude Research 把"思考过程"显式展示给用户,每一步的推理都可见,符合 Anthropic 一贯的"可解释性优先"哲学。

差异 2:长上下文建模。Claude 200K token 的上下文窗口让 Claude Research 能"读完整份文档"再做分析,而不是仅靠检索片段。这对长文档研究(法规、论文)特别有利。

差异 3:研究质量控制。Claude Research 强调"质量而非速度"——单次研究可能耗时 10-20 分钟,但输出质量更高,包含更多交叉验证。

16.4 Google Gemini Deep Research 架构剖析

Google 的 Gemini Deep Research 基于 Gemini 2.5 Pro + 谷歌搜索生态。其架构特色:

特色 1:原生多模态。Gemini Deep Research 能直接处理图像、视频、音频等多媒体,生成"图文并茂"的研究报告。

特色 2:Google 生态整合。原生集成 Google Search、Gmail、Docs、Sheets 等生态数据,能研究用户的个人化数据("分析我过去一年的邮件主题")。

特色 3:1M token 上下文。Gemini 的超长上下文窗口让其能"一次性读完"大型研究材料,减少了"分块检索"的信息损失。

16.5 三大系统的架构对比

从架构层面,三大 DeepResearch 系统的差异:

维度 OpenAI Deep Research Anthropic Research Gemini Deep Research
底座模型o3 / o4-miniClaude 3.7 SonnetGemini 2.5 Pro
推理深度极强 (o3 推理)强 (Sonnet 3.7)强 (Gemini 2.5)
上下文窗口200K200K1M-2M
工具生态Bing + 自有Web + Computer UseGoogle 全家桶
多模态强 (原生)
个性化强 (Google 数据)
可解释性强 (显式思维链)
输出风格结构化报告详细分析多媒体报告
响应时间5-15 分钟10-20 分钟5-10 分钟

16.6 DeepResearch 的核心工程挑战

DeepResearch 系统的工程实现面临五大挑战:

挑战 1:长链路稳定性。5-20 步推理中,任何一步失败都可能导致整个研究失败。必须设计Checkpoint + 重试 + Replan 机制。

挑战 2:上下文管理。长链路推理累积大量中间结果,Token 消耗呈线性增长。必须设计上下文压缩 + 关键证据保留机制。

挑战 3:质量控制。多步推理容易产生"幻觉积累"——前一步的错误在后续步骤被放大。必须设计事实校验 + 引用追溯 + 自相矛盾检测机制。

挑战 4:成本控制。单次研究消耗 100K-1M token,成本 1-10 美元。需要模型路由(小模型做粗筛 + 大模型做综合)+ 缓存机制。

挑战 5:用户交互。深度研究耗时 5-30 分钟,期间用户需要看到进度,否则会"以为卡死"。必须设计实时进度展示 + 阶段性结果预览 + 中途干预机制。

16.7 自建 DeepResearch 系统的工程路径

对希望自建 DeepResearch 系统的架构师,推荐的工程路径:

自建 DeepResearch 系统的技术栈
═══════════════════════════════════════════════════════════════

  基础层 (Foundation):
  ─────────────────
  · LLM: GPT-4 / Claude / Qwen-Max / DeepSeek-R1
  · Agent 框架: LangGraph / AutoGen / CrewAI
  · 工具调用: Function Calling / Tool Use

  数据层 (Data):
  ────────────
  · 向量库: Qdrant / Milvus / Weaviate
  · 图谱库: Neo4j / TuGraph (可选, 全局问题)
  · 文档存储: S3 / OSS / MinIO
  · 缓存: Redis (Plan / 检索结果)

  能力层 (Capabilities):
  ───────────────────
  · Web 搜索: SerpAPI / Tavily / Bing API
  · PDF 解析: MinerU / Marker
  · 公式识别: LaTeX-OCR
  · 表格理解: Table-as-Context
  · 多模态: Qwen-VL / GPT-4V

  应用层 (Application):
  ───────────────────
  · Web UI: 流式进度 + 阶段性展示
  · API: 异步任务 + Webhook 通知
  · 监控: 成本 / 时延 / 质量 / 失败率

自建 DeepResearch 系统的最小可行版本(MVP)可以先用 LangGraph + Claude/GPT-4 + Tavily 搜索快速搭建,先验证业务价值,再根据反馈迭代优化。直接照搬 OpenAI/Anthropic 的"全功能"是过度工程化。

核心观点:DeepResearch 类系统代表了 RAG 的"终极形态"——多源检索 + 多步推理 + 多模态理解 + 报告级输出。它的工程门槛很高,但价值也最大。对架构师而言,DeepResearch 不是"必选项",而是"高级选项"——在通用 RAG 满足 80% 需求后,针对深度研究类问题再投入。从单跳 RAG → Plan-and-Execute → Multi-Agent → DeepResearch是清晰的演进路径,每一步都建立在前一步的基础上,避免过度工程化。

三大 DeepResearch 系统的架构虽然细节不同,但核心模式高度一致:任务理解 → 研究规划 → 多源检索 → 推理综合 → 报告生成。这种范式代表了 RAG 的"终极形态"。

flowchart TB A[/DeepResearch 系统/] --> B[/OpenAI/] A --> C[/Anthropic/] A --> D[/Gemini/] B --> E[/o3 + 工具调用/] C --> F[/Claude 3.7 + Computer Use/] D --> G[/Gemini 2.5 + 1M 上下文/] E --> H[/5-15 分钟/] F --> I[/10-20 分钟/] G --> J[/5-10 分钟/] style A fill:#fff5cc

三大系统的差异在于"底座模型 + 工具生态 + 输出风格",但范式一致。

Plan-and-Execute 的"先规划后执行"哲学解决了 ReAct "边走边绕"的问题。Planner 一次性生成完整 Plan,Executor 按步骤执行,让长链路推理更稳定。

flowchart TB A[/Query/] --> B[/Planner/] B --> C[/Plan: 步骤1-5/] C --> D[/Executor Step 1/] D --> E[/Executor Step 2/] E --> F[/Executor Step N/] F --> G[/Replan 检查/] G -->|需要| B G -->|不需要| H[/综合答案/] style B fill:#fff5cc style G fill:#e5f5ff

Replan 机制是 Plan-and-Execute 相比 ReAct 的核心优势——它让系统在 Plan 不准确时能自适应。

Plan-and-Execute 与 ReAct 的核心区别是"规划时机"——前者一次性规划完整路径,后者边走边看。两种范式各有适用场景,架构师应根据问题复杂度选择。

flowchart LR A[/多步推理范式/] --> B[/ReAct 边走边看/] A --> C[/Plan-and-Execute 一次规划/] A --> D[/Multi-Agent 专业分工/] B --> E[/灵活/不稳定/] C --> F[/稳定/可预测/] D --> G[/强大/复杂/] style A fill:#fff5cc

三种范式代表"灵活性 vs 稳定性 vs 能力"的不同权衡。

十七、Multi-Agent 协作 RAG:检索 / 评估 / 生成 Agent

当 RAG 任务复杂度突破"单 Agent 能处理"的上限,Multi-Agent 协作就成为必然选择。2024 年起,CrewAI、AutoGen、LangGraph 等 Multi-Agent 框架相继成熟,让"多个专业 Agent 协作完成复杂 RAG 任务"从理论走向工程实践。本章从架构层面深入剖析 Multi-Agent RAG 的核心思想、协作机制与设计模式。

17.1 为什么需要 Multi-Agent RAG?

单 Agent(Self-Ask / ReAct / Plan-and-Execute)在面对"超复杂 RAG 任务"时会出现三个瓶颈:

瓶颈 1:能力溢出。一个 Agent 同时负责"规划 + 检索 + 评估 + 生成 + 反思",prompt 越来越长,能力开始"溢出"——超过 LLM 上下文窗口,能力互相干扰。

瓶颈 2:角色冲突。"既要检索又要评估"的 Agent 在设计时存在角色冲突——检索要求"召回全",评估要求"召回准",两者目标不同,挤在同一个 Agent 里会妥协。

瓶颈 3:可扩展性差。单 Agent 系统难以"加新能力"——每加一种新检索源、新评估方法,都需要修改 Agent 的 prompt 和工具列表。

Multi-Agent RAG 通过"专业化分工 + 协作编排"解决这三大瓶颈。

17.2 Multi-Agent RAG 的核心架构

一个典型的 Multi-Agent RAG 系统由三类核心 Agent 组成:

Multi-Agent RAG 核心架构
═══════════════════════════════════════════════════════════════

  ┌──────────────────────────────────────────────┐
  │  Orchestrator (编排 Agent)                    │
  │  · 任务分解                                   │
  │  · Agent 调度                                 │
  │  · 结果汇总                                   │
  └──────────┬───────────────────────────────────┘
             │
   ┌─────────┼─────────┬─────────────┐
   ▼         ▼         ▼             ▼
┌──────┐ ┌──────┐ ┌──────┐    ┌──────────┐
│检索  │ │评估  │ │生成  │ ...│  反思     │
│Agent │ │Agent │ │Agent │    │  Agent   │
│      │ │      │ │      │    │          │
│工具: │ │工具: │ │工具: │    │ 工具:    │
│向量库│ │Rerank│ │LLM   │    │ 自我评估 │
│Web   │ │FactCC│ │Prompt│    │ 错误检测 │
│DB    │ │规则  │ │      │    │          │
└──┬───┘ └──┬───┘ └──┬───┘    └────┬─────┘
   │        │        │             │
   └────────┴────────┴─────────────┘
             │
             ▼
         最终答案

17.3 三大核心 Agent 的职责拆解

检索 Agent(Retriever Agent)。职责是"找出相关信息"。它的工具集包括:向量库检索、BM25 检索、Web 搜索、数据库查询、API 调用。检索 Agent 的设计原则是"召回优先"——宁多勿漏,评估由下游 Agent 完成。

评估 Agent(Evaluator Agent)。职责是"评估检索到的信息质量"。它的工具集包括:Reranker、FactCC 事实性检测、规则检查、引用追溯。评估 Agent 输出"信息分级标签"(完全可信 / 部分可信 / 不可信)和"关键证据摘要"。

生成 Agent(Generator Agent)。职责是"基于可信证据生成答案"。它的工具集主要是 LLM 本身 + 提示模板。生成 Agent 只接受评估 Agent 标记为"可信"的证据,避免被不可信信息污染。

三个 Agent 的协作流程:

Multi-Agent 协作流程(Linear 模式)
═══════════════════════════════════════════════════════════════

  1. Orchestrator 接收 Query
       │
       ▼
  2. Orchestrator 分解任务 → 检索任务
       │
       ▼
  3. 检索 Agent 执行
       │   · 调用向量库/Web/DB
       │   · 返回候选证据集合
       │
       ▼
  4. Orchestrator 传递结果 → 评估任务
       │
       ▼
  5. 评估 Agent 执行
       │   · 对每条证据打分
       │   · 标记可信/不可信
       │   · 提取关键证据摘要
       │
       ▼
  6. Orchestrator 传递结果 → 生成任务
       │
       ▼
  7. 生成 Agent 执行
       │   · 基于可信证据生成答案
       │   · 标注引用
       │
       ▼
  8. Orchestrator 汇总 → 最终答案

  优势:
  · 各 Agent 专业化,prompt 简洁
  · 评估与生成分离,降低幻觉
  · 可独立扩展(加新检索源不影响其他 Agent)
  劣势:
  · 串行流程,延迟较高
  · Orchestrator 单点

17.4 协作模式:Linear / Hierarchical / Peer-to-Peer

Multi-Agent 协作有三种模式:

Linear 模式(线性)。Agent 按固定顺序串行执行。简单稳定,但灵活性差。

Hierarchical 模式(层级)。存在 Manager Agent,统一调度 Worker Agents。类似传统"管理者-执行者"结构,适合任务可分解的场景。

Peer-to-Peer 模式(点对点)。Agent 之间对等通信,自主决定下一步调用哪个 Agent。灵活但难调试。

三种协作模式对比
═══════════════════════════════════════════════════════════════

  Linear 模式:
  ───────────
  Agent1 → Agent2 → Agent3 → Agent4
  适用: 流程固定的 RAG 任务
  优点: 简单、可预测
  缺点: 缺乏灵活性

  Hierarchical 模式:
  ──────────────────
        Manager
       /  |  \
      ↓   ↓   ↓
    A1   A2   A3
  适用: 任务可分解的复杂研究
  优点: 集中调度,流程清晰
  缺点: Manager 成为瓶颈

  Peer-to-Peer 模式:
  ──────────────────
    A1 ←→ A2
     ↕     ↕
    A3 ←→ A4
  适用: 探索性、协作性任务
  优点: 最灵活,可涌现新行为
  缺点: 难调试、可能死循环

17.5 CrewAI 与 AutoGen:主流 Multi-Agent 框架

当前主流的 Multi-Agent 框架:

框架 哲学 核心抽象 适用场景
CrewAI角色化协作Role / Task / Crew业务流程类 Agent
AutoGen对话驱动Conversable Agent对话式 / 编程式 Agent
LangGraph图编排Node / Edge / State复杂流程 / 状态机
LlamaIndex AgentsRAG 优先QueryEngine AgentRAG 场景的 Multi-Agent
OpenAI Swarm轻量编排Handoff / Routine简单协作

17.6 CrewAI 的角色化协作范式

CrewAI 把 Multi-Agent 协作抽象为"角色(Role)+ 任务(Task)+ 团队(Crew)"三个概念:

CrewAI 协作范式伪代码
═══════════════════════════════════════════════════════════════

  from crewai import Agent, Task, Crew

  # 1. 定义 Agent (角色)
  retriever = Agent(
      role="检索专家",
      goal="找到与 Query 相关的所有信息",
      backstory="你是一个专业的检索专家,擅长从多个数据源召回信息",
      tools=[vector_search, web_search, db_query]
  )

  evaluator = Agent(
      role="评估专家",
      goal="评估检索到的信息质量",
      backstory="你是一个严格的事实核查员,对信息质量零容忍",
      tools=[fact_check, rerank, citation_check]
  )

  generator = Agent(
      role="生成专家",
      goal="基于可信信息生成高质量答案",
      backstory="你是一个专业的研究员,擅长综合信息形成报告",
      tools=[]  # 只需 LLM
  )

  # 2. 定义任务
  task1 = Task(
      description="检索 {query} 相关的信息",
      agent=retriever,
      expected_output="候选证据列表"
  )

  task2 = Task(
      description="评估候选证据的可信度",
      agent=evaluator,
      expected_output="可信证据列表(带引用)"
  )

  task3 = Task(
      description="基于可信证据生成最终答案",
      agent=generator,
      expected_output="最终答案 + 引用"
  )

  # 3. 组建团队并执行
  crew = Crew(
      agents=[retriever, evaluator, generator],
      tasks=[task1, task2, task3],
      process=Process.sequential  # 顺序执行
  )

  result = crew.kickoff(inputs={"query": "用户问题"})

17.7 Multi-Agent RAG 的工程挑战

Multi-Agent RAG 在生产落地中面临五大挑战:

挑战 1:Token 消耗爆炸。多个 Agent 各自调用 LLM,token 消耗是单 Agent 的 3-5 倍。解决方案:用小模型做"中间 Agent"+ 大模型做"最终 Agent"

挑战 2:调试复杂。Multi-Agent 系统的执行轨迹是"图"而非"链",传统日志调试方法失效。解决方案:LangSmith / Phoenix / Helicone 等可观测工具 + Tracing

挑战 3:循环风险。Peer-to-Peer 模式下 Agent 可能互相调用形成循环。解决方案:max_iters 上限 + 调用图静态分析

挑战 4:错误传播。上游 Agent 的错误会被下游 Agent 继承并放大。解决方案:每步独立校验 + 错误隔离

挑战 5:成本控制。Multi-Agent 系统的"小问题也用大团队"是常见浪费。解决方案:Router Agent 根据问题复杂度动态选择 Agent 数量

17.8 何时应该上 Multi-Agent?

Multi-Agent 不是"越早越好",架构师应当用"复杂度阈值"判断:

Multi-Agent 上线判断矩阵
═══════════════════════════════════════════════════════════════

  问题复杂度       推荐方案          理由
  ──────────      ─────────        ─────
  单跳 / 简单      直接 RAG          杀鸡用牛刀
  2-3 跳 / 中等    Self-Ask/ReAct    性价比最高
  4-7 跳 / 复杂    Plan-and-Execute  稳定可控
  8+ 跳 / 超复杂   Multi-Agent       专业分工
  探索性 / 研究级  DeepResearch 系统  多 Agent + 多源

  其他考虑:
  · 团队规模: 小团队建议先单 Agent 跑通
  · 业务价值: ROI 不够时不上 Multi-Agent
  · 维护能力: Multi-Agent 调试复杂,需要可观测基础设施

核心观点:Multi-Agent RAG 是 RAG 系统的"复杂化演进",它用"专业化分工"解决单 Agent 的能力溢出问题,但代价是 token 消耗、调试复杂度、循环风险显著上升。架构师应当从单 Agent 起步,按需演进到 Multi-Agent。Multi-Agent 不是"更好",而是"更复杂"——对 80% 的业务场景,单 Agent + Plan-and-Execute 已经足够;只有深度研究、超复杂推理、跨系统协作等场景才需要 Multi-Agent。复杂度匹配业务,是架构师的最高准则。

Multi-Agent RAG 的核心是"专业化分工 + 协作编排"。检索 Agent、评估 Agent、生成 Agent 各自负责擅长的工作,避免单 Agent 的能力溢出。

flowchart TB A[/Orchestrator/] --> B[/检索 Agent/] A --> C[/评估 Agent/] A --> D[/生成 Agent/] B --> E[/向量库 Web DB/] C --> F[/Rerank FactCC/] D --> G[/LLM 生成/] E --> H[/候选证据/] H --> C F --> I[/可信证据/] I --> D G --> J[/最终答案/] style A fill:#fff5cc style B fill:#e5f5ff style C fill:#fff5e5 style D fill:#e5ffe5

Multi-Agent 协作流程体现了"专业化分工"的优势——每种 Agent 只做自己最擅长的事。

Multi-Agent 协作有三种模式:Linear 串行、Hierarchical 层级、Peer-to-Peer 点对点。架构师应根据"任务可分解性 + 流程确定性"两维度选型。

flowchart TB A[/Multi-Agent 协作模式/] --> B[/Linear 串行/] A --> C[/Hierarchical 层级/] A --> D[/Peer-to-Peer 点对点/] B --> E[/简单稳定/] C --> F[/集中调度/] D --> G[/灵活涌现/] style A fill:#fff5cc

三种模式在"灵活性 vs 稳定性"上各有侧重,不存在"最好"。

十八、RAG 评估体系 2.0:RAGAS / TruLens / DeepEval 多维评估

在第四章我们剖析了传统 RAGAS 评估体系的失真问题。本章进一步深入"评估体系 2.0"的具体实现——如何构建多维度、细粒度、人机融合的工业级 RAG 评估体系。我们将对比 RAGAS、TruLens、DeepEval 三大主流框架,并给出生产级评估流水线的完整架构。

18.1 评估体系 2.0 的核心原则

从传统 RAGAS 的"四个指标"演进到评估体系 2.0,核心是"五个转变":

传统 RAGAS → 评估体系 2.0 的五个转变
═══════════════════════════════════════════════════════════════

  转变 1: 单维度 → 多维度
  ──────────────────────
  传统: 4 个全局指标
  2.0:  分层多维(检索/生成/端到端/过程/人类)

  转变 2: 粗粒度 → 细粒度
  ──────────────────────
  传统: 问题级单一分数
  2.0:  方面级 + 步骤级 + token 级

  转变 3: 静态评估 → 动态评估
  ──────────────────────
  传统: 离线跑测试集
  2.0:  生产环境持续评估 + A/B Testing

  转变 4: 机器自动 → 人机融合
  ──────────────────────
  传统: 纯 LLM-as-a-Judge
  2.0:  LLM 初筛 + 人类精校 + 众包评估

  转变 5: 单一指标 → 业务对齐
  ──────────────────────
  传统: Faithfulness 0.9
  2.0:  用户满意度 + 业务 KPI(转化率/解决率)

18.2 RAGAS 2.0:细粒度增强版

RAGAS 在 2024-2025 年快速迭代,引入了多个细粒度指标:

指标 维度 评估方法 适用场景
Context Relevance检索LLM 判断 chunk 与 query 相关基础相关性
Context Recall (with multi-hop)检索多跳 ground truth 评估多跳问题
Context Entity Recall检索评估 chunk 包含的实体覆盖率实体密集型
Noise Robustness检索注入噪声后检索质量鲁棒性
Faithfulness (with breakdown)生成幻觉类型细分忠实度
Answer Correctness生成答案与 ground truth 比对准确性
Answer Similarity生成语义相似度形式正确性
Aspect Critique生成多角度(简洁/完整/可读)综合质量
Task Completion端到端用户任务目标达成度业务对齐
Tool Call Accuracy过程Agent 工具调用正确性Agentic RAG
Argument Correctness过程推理步骤正确性多步推理

18.3 TruLens:可解释评估框架

TruLens(由 TruEra 开源)的核心理念是"评估反馈循环"——把评估嵌入到 RAG 系统的每次运行中,实时反馈质量问题。

TruLens 评估反馈循环
═══════════════════════════════════════════════════════════════

  RAG 系统
     │
     ▼
  每次运行被 TruLens 记录
     │
     ├─► 输入: Query
     ├─► 检索结果: 5 个 chunks
     ├─► 检索评估: Context Relevance 0.85
     ├─► 生成评估: Faithfulness 0.92
     ├─► 端到端: Answer Correctness 0.88
     │
     ▼
  记录到 TruLens Dashboard
     │
     ▼
  反馈给开发者:
  · 哪些 Query 表现差
  · 哪些文档来源质量低
  · 哪些检索模式效率低
     │
     ▼
  持续优化

TruLens 的核心功能是 "feedback functions"——把评估指标作为函数嵌入 RAG 系统,每次运行时自动打分,结果可视化。开发者可以一眼看到"哪些 Query 长期表现差",针对性优化。

18.4 DeepEval:LLM 单元测试框架

DeepEval 把 RAG 评估抽象为"LLM 单元测试"——使用类似 pytest 的接口,让 LLM 应用测试和传统软件测试一样自然。

DeepEval 单元测试风格
═══════════════════════════════════════════════════════════════

  from deepeval import evaluate
  from deepeval.metrics import (
      ContextualPrecisionMetric,
      ContextualRecallMetric,
      FaithfulnessMetric,
      AnswerRelevancyMetric
  )
  from deepeval.test_case import LLMTestCase

  def test_rag_pipeline():
      # 准备测试用例
      test_case = LLMTestCase(
          input="X 公司的毛利率是多少?",
          actual_output=rag_system.query("X 公司的毛利率是多少?"),
          expected_output="X 公司 2024 年毛利率为 40%",
          retrieval_context=[...]  # 检索到的 chunks
      )
      # 运行评估
      evaluate(
          test_cases=[test_case],
          metrics=[
              ContextualPrecisionMetric(threshold=0.8),
              ContextualRecallMetric(threshold=0.7),
              FaithfulnessMetric(threshold=0.9),
              AnswerRelevancyMetric(threshold=0.8)
          ]
      )

  # 像 pytest 一样运行: pytest test_rag.py

DeepEval 的优势是"测试驱动开发"友好——开发者可以像写单元测试一样写 RAG 评估,CI/CD 集成自然,特别适合 DevOps 团队。

18.5 三大框架对比与选型

RAGAS、TruLens、DeepEval 三大框架的定位差异:

维度 RAGAS TruLens DeepEval
核心理念指标丰富可解释反馈LLM 单元测试
主要用户研究者 / 算法工程师产品 / 运营DevOps / 测试工程师
指标数量15+10+20+
可视化基础强(Dashboard)基础
CI/CD 集成强(pytest 风格)
持续评估强(实时)中(批量)
学习曲线低(熟悉 pytest)
开源

18.6 LLM-as-a-Judge 工业化

三大框架的共同基础是 LLM-as-a-Judge——用 LLM 做自动评估。要把 LLM-as-a-Judge 工业化,需要解决三个问题:

问题 1:评判标准的形式化。把人类判断标准转译为 LLM 可执行的评分规则。常用做法是"Rubric Prompt"——给 LLM 一个详细的评分标准,每个分数档有明确的描述。

LLM-as-a-Judge Rubric Prompt 示例
═══════════════════════════════════════════════════════════════

  请评估以下 RAG 答案的忠实度(0-5 分):

  Query: {query}
  Context: {retrieved_chunks}
  Answer: {generated_answer}

  评分标准:
  5 = 所有事实都从 Context 找到,无任何编造
  4 = 主要事实来自 Context,1 个小细节有合理推断
  3 = 大部分事实来自 Context,有 1 处明显编造
  2 = 有一半事实来自 Context,多处编造
  1 = 多数事实无据可查,严重编造
  0 = 完全没有忠实于 Context

  请逐句分析 Answer 中每个事实的来源,然后给出最终分数。
  输出格式: {"score": X, "reason": "..."}

问题 2:评判者一致性。同一个 Query 让多个 LLM 评判,结果应高度一致。工程上常用"多 LLM 投票"——用 3-5 个不同的 LLM 评判,取平均或投票。

问题 3:评判者偏差。LLM-as-a-Judge 有已知偏差:位置偏差(偏好前文)、自我偏好(偏好自己生成的答案)、冗长偏好(偏好长答案)。解决方案:多 LLM + 位置打乱 + 长度归一化

18.7 A/B Testing 框架

所有 RAG 改进必须经过 A/B Testing。生产级 A/B Testing 框架的关键设计:

RAG A/B Testing 框架
═══════════════════════════════════════════════════════════════

  实验设计:
  ─────────
  · 对照组 (Control):  旧版 RAG
  · 实验组 (Variant): 新版 RAG
  · 流量分配: 通常 90/10 或 80/20 (实验组小流量验证)
  · 关键指标: 用户满意度 / 任务完成率 / 点赞率
  · 护栏指标: P99 延迟 / 失败率 / 成本

  实验执行:
  ─────────
  · 同一 Query 随机路由到 Control 或 Variant
  · 记录所有指标
  · 显著性检验(通常需要 1000+ 样本)

  决策:
  ─────────
  · 提升 ≥ 2% 且显著: 推广
  · 持平: 观察
  · 下降: 回滚

  常见陷阱:
  ─────────
  · 样本量不足: 1-2 周小流量试运行
  · 流量不均: 用 hash(Query) 稳定路由
  · 短期偏差: 至少观察 2 个完整业务周期

18.8 生产级评估流水线

完整的企业级 RAG 评估流水线:

生产级 RAG 评估流水线
═══════════════════════════════════════════════════════════════

  ┌────────────────────────────────────────┐
  │  Layer 1: 在线自动评估                 │
  │  · LLM-as-a-Judge (生产 100% 流量)     │
  │  · 实时打分 + 异常告警                 │
  │  · 记录到评估库                        │
  └─────────────────┬──────────────────────┘
                    │
                    ▼
  ┌────────────────────────────────────────┐
  │  Layer 2: 离线批量评估                 │
  │  · 定期跑测试集 (RAGAS / DeepEval)     │
  │  · A/B Testing                         │
  │  · TruLens Dashboard 持续监控          │
  └─────────────────┬──────────────────────┘
                    │
                    ▼
  ┌────────────────────────────────────────┐
  │  Layer 3: 人类精校                      │
  │  · 高风险 query 人工标注               │
  │  · 众包评估 (Amazon MTurk)             │
  │  · 专家评审 (业务专家 / 领域专家)       │
  └─────────────────┬──────────────────────┘
                    │
                    ▼
  ┌────────────────────────────────────────┐
  │  Layer 4: 业务对齐                      │
  │  · 业务 KPI 联动 (转化率 / 留存率)      │
  │  · 用户调研 + NPS                      │
  │  · A/B Testing 持续迭代                │
  └────────────────────────────────────────┘

核心观点:评估体系 2.0 的核心是"多维度 + 细粒度 + 人机融合 + 业务对齐"。架构师应当把评估视为 RAG 系统的一等公民,从设计阶段就内建评估能力。LLM-as-a-Judge + A/B Testing + 人类精校是三大支柱。RAGAS、TruLens、DeepEval 各有定位——指标丰富选 RAGAS,可解释反馈选 TruLens,DevOps 友好选 DeepEval。指标服务于决策,业务对齐才是终极标准。

十九、生产级可观测:三层监控与漂移检测

当 RAG 系统从 PoC 进入生产,"可观测性"成为系统稳定运行的关键支柱。本章从架构层面深入剖析生产级 RAG 可观测系统的三大支柱:检索质量监控、生成质量监控、端到端质量监控,以及漂移检测、Tracing 系统等关键工程实践。

19.1 可观测性的三大支柱

RAG 可观测性的三大支柱对应系统的三层质量:

RAG 可观测性三大支柱
═══════════════════════════════════════════════════════════════

  ┌────────────────────────────────────┐
  │  ① 检索质量监控                    │
  │  · Context Relevance / Recall     │
  │  · 检索延迟 / QPS                  │
  │  · 向量库健康度                    │
  │  · 检索源覆盖率                    │
  ├────────────────────────────────────┤
  │  ② 生成质量监控                    │
  │  · Faithfulness / Answer Relevancy│
  │  · 幻觉率 / 引用准确率            │
  │  · Token 消耗 / LLM 延迟          │
  │  · LLM API 错误率                 │
  ├────────────────────────────────────┤
  │  ③ 端到端质量监控                  │
  │  · 用户满意度 (点赞 / 点踩)       │
  │  · 任务完成率                      │
  │  · P50/P95/P99 延迟               │
  │  · 业务 KPI 转化率                │
  └────────────────────────────────────┘

  三大支柱的关系:
  ─────────────
  ① 是因(检索质量差 → 答案质量差)
  ② 是果(生成质量反映检索质量)
  ③ 是根(用户满意才是终极标准)

19.2 检索质量监控

检索质量监控的核心是"持续观察检索表现",包括:

指标 1:Context Relevance。检索到的 chunk 与 Query 的相关性。监控方法:对生产 Query 抽样 5-10%,用 LLM-as-a-Judge 评估检索结果的平均相关性。目标:>0.85。

指标 2:检索延迟。从 Query 到 Top-K 检索完成的时间。监控方法:直方图监控 P50 / P95 / P99。目标:P95 < 500ms。

指标 3:空召回率。检索结果为空(Top-K=0)或低于阈值(如 Top-1 similarity < 0.5)的比例。目标:<5%。空召回率高说明用户 Query 与文档语义鸿沟大。

指标 4:检索源覆盖率。不同检索源(向量/BM25/Web/API)被命中的比例。监控方法:记录每次检索命中的源。异常的单一源依赖(如 95% 都来自向量库)需要关注。

19.3 生成质量监控

生成质量监控关注 LLM 输出的健康度:

指标 1:Faithfulness(幻觉率)。答案中的事实有多少能从 context 找到。监控方法:LLM-as-a-Judge 抽样评估。目标:>0.90。幻觉率超过 15% 必须告警。

指标 2:Token 消耗。每次查询的 Prompt Token + Completion Token。监控方法:直方图 + 异常告警。Token 消耗突增可能是 Query 变长或检索结果爆炸。

指标 3:LLM 错误率。LLM API 调用失败(timeout / rate limit / content filter)的比例。目标:<1%。错误率突增需要切换备用 LLM。

指标 4:Answer Relevancy。答案与 Query 的语义相关性。监控方法:Embedding 余弦相似度。目标:>0.80。

19.4 端到端质量监控

端到端质量反映"用户实际体验",是最重要的指标:

指标 1:用户满意度(点赞率)。用户对答案的"点赞 / 点踩"比例。目标:>70%。这是最直接的"用户反馈",但样本量积累慢。

指标 2:任务完成率。用户基于答案是否解决了原始问题。监控方法:用户后续行为分析("未追问"、"未人工接管")。目标:>60%。

指标 3:P95 / P99 延迟。从用户 Query 到答案完整返回的时间。目标:P95 < 3s(实时问答)/ P95 < 30s(深度研究)。

指标 4:业务 KPI。客服场景的"一次解决率"、电商场景的"转化率提升"、教育场景的"学习效果"。这些指标反映 RAG 的实际业务价值

19.5 漂移检测:从"看起来正常"到"实际已经坏掉"

漂移检测(Drift Detection)是生产级 RAG 系统的关键能力——它能在系统"看起来正常"但"实际已经退化"时及时告警。常见漂移类型:

RAG 系统的四大漂移类型
═══════════════════════════════════════════════════════════════

  ① 数据漂移 (Data Drift)
  ───────────────────────
  表现: 用户 Query 分布变化
  例子: 新业务上线,用户开始问新型问题
  检测: 周期性统计 Query Embedding 分布
  告警: 分布 KL 散度 > 阈值

  ② 概念漂移 (Concept Drift)
  ─────────────────────────
  表现: 同一 Query 的"正确"答案变了
  例子: "苹果"从水果变为公司
  检测: 同一 Query 的检索结果 Embedding 漂移
  告警: 长期 Embedding 中心偏移 > 阈值

  ③ 模型漂移 (Model Drift)
  ─────────────────────────
  表现: LLM 行为变化(API 升级 / 换模型)
  例子: GPT-4 升级到 GPT-4o,生成风格变化
  检测: 评估集持续跑分,监控分数变化
  告警: Faithfulness / Answer Relevancy 持续下降

  ④ 性能漂移 (Performance Drift)
  ──────────────────────────────
  表现: 检索/生成延迟增加
  例子: 向量库数据量翻倍,检索变慢
  检测: P95 / P99 延迟持续监控
  告警: P95 延迟超过 SLA 阈值

19.6 Tracing 系统:从 Query 到答案的完整路径

Tracing 系统是 RAG 可观测性的"基础设施"——它记录每次 Query 的完整执行路径,支持事后分析和故障排查。

RAG Tracing 系统的关键 Span
═══════════════════════════════════════════════════════════════

  Trace: query_abc123 (总耗时 2.3s)
  │
  ├─ Span: query_understanding (50ms)
  │    └─ 解析出 实体: ["X 公司", "2024 年"]
  │
  ├─ Span: retrieval (300ms)
  │    ├─ Span: vector_search (100ms)
  │    │    └─ 检索 100 候选,Top-10
  │    ├─ Span: bm25_search (80ms)
  │    │    └─ 检索 50 候选,Top-10
  │    └─ Span: rrf_fusion (20ms)
  │         └─ RRF 融合 → 15 个最终 chunk
  │
  ├─ Span: rerank (200ms)
  │    └─ BGE-Reranker → 精排 Top-5
  │
  ├─ Span: llm_generation (1500ms)
  │    ├─ Span: prompt_building (10ms)
  │    ├─ Span: llm_api_call (1480ms)
  │    │    ├─ Prompt Tokens: 2500
  │    │    └─ Completion Tokens: 200
  │    └─ Span: post_processing (10ms)
  │
  └─ Span: response (50ms)
       └─ 流式返回 + 引用标注

  关键字段:
  ────────
  · trace_id: 全局唯一 ID
  · parent_id: 父子 Span 关系
  · duration: 耗时
  · tokens: Token 消耗
  · error: 错误信息(如有)
  · metadata: 任意自定义字段

主流的 RAG Tracing 工具:LangSmith(LangChain 官方)、Phoenix(Arize AI 开源)、Helicone(LLM 专用)、Langfuse(开源,自部署友好)。这些工具都支持 OpenTelemetry 标准,能与 Grafana、Datadog 等监控平台集成。

19.7 告警与故障应对

可观测系统的"最后一公里"是告警与故障应对:

RAG 系统告警分级
═══════════════════════════════════════════════════════════════

  P0 严重故障 (立即响应):
  ─────────────────────
  · LLM API 完全不可用
  · 检索系统完全宕机
  · 错误率 > 50%
  应对: 切换备用 LLM / 启用缓存兜底

  P1 性能下降 (30 分钟响应):
  ─────────────────────────
  · P95 延迟 > SLA 阈值 2 倍
  · 错误率 10-50%
  · 幻觉率 > 20%
  应对: 限流 + 排查根因

  P2 质量下滑 (1 天响应):
  ─────────────────────
  · Faithfulness 持续下降
  · 空召回率突增
  · 用户点赞率持续下降
  应对: 数据分析 + 模型重训

  P3 漂移预警 (持续关注):
  ─────────────────────
  · 数据分布漂移
  · 模型分数持续波动
  · 新增未覆盖 Query 类型
  应对: 周期性 review + 知识库扩充

19.8 可观测性建设路径

对企业级 RAG 系统,可观测性建设应当分阶段推进:

阶段 1:基础日志。记录每次 Query 的输入、输出、关键步骤耗时、错误信息。这一阶段的目标是"出问题时能查"。

阶段 2:指标监控。基于日志计算关键指标(Faithfulness、P95 延迟、错误率),接入 Prometheus / Grafana。这一阶段的目标是"出问题前能预警"。

阶段 3:Tracing 体系。引入 OpenTelemetry 标准的 Tracing,记录完整执行路径。这一阶段的目标是"出问题能定位"。

阶段 4:漂移检测。建立数据/概念/模型/性能四类漂移的自动检测机制。这一阶段的目标是"主动发现问题"。

核心观点:生产级 RAG 系统的可观测性不是"锦上添花",而是"生命线"。架构师必须在系统设计阶段就内建可观测能力,遵循"Metrics / Logs / Traces"三大支柱。漂移检测是从"被动响应"到"主动预防"的关键升级。LangSmith、Phoenix、Langfuse 等工具已成熟,集成成本不高。没有可观测性的 RAG 系统是"黑盒"——出问题只能靠猜,出问题前没有预警,这是生产环境不可接受的。

可观测性建设的"Metrics / Logs / Traces"三大支柱是 RAG 系统的"基础设施"。漂移检测是从"被动响应"到"主动预防"的关键能力。

flowchart TB A[/RAG 可观测性/] --> B[/检索质量监控/] A --> C[/生成质量监控/] A --> D[/端到端质量监控/] A --> E[/漂移检测/] B --> F[/Context Relevance 延迟/] C --> G[/Faithfulness Token/] D --> H[/用户满意度 P95/] E --> I[/数据/概念/模型/性能/] I --> J[/主动告警/] style E fill:#fff5cc

漂移检测让 RAG 系统从"出问题再修"走向"出问题前预警"。

评估体系 2.0 的"多维度 + 细粒度 + 人机融合"原则把 RAG 评估从"指标打分"升级为"质量体系"。这一转变反映了"用业务对齐的指标驱动决策"的方法论升级。

flowchart TB A[/评估体系 2.0/] --> B[/RAGAS 细粒度/] A --> C[/TruLens 可解释/] A --> D[/DeepEval 单元测试/] A --> E[/A/B Testing/] B --> F[/15+ 指标/] C --> G[/feedback functions/] D --> H[/pytest 风格/] E --> I[/生产环境持续/] F --> J[/持续评估流水线/] G --> J H --> J I --> J style A fill:#fff5cc

三大评估框架各有定位,架构师应当按"团队背景 + 业务特征"选型。

LLM-as-a-Judge 是评估体系 2.0 的"基础设施"——用 LLM 做大规模自动评估,配合人类精校,把评估从"奢侈品"变成"日用品"。

flowchart TB A[/LLM-as-a-Judge 工业化/] --> B[/Rubric Prompt/] A --> C[/多 LLM 投票/] A --> D[/偏差校正/] B --> E[/评分规则形式化/] C --> F[/一致性提升/] D --> G[/位置/长度/自我偏好/] style A fill:#fff5cc

LLM-as-a-Judge 让"全量评估"成为可能,是 RAG 评估的规模化基础。

二十、架构演进图谱:从传统 RAG 到自适应 RAG

经过 19 章的深度剖析,我们站在 RAG 架构的最前沿回望:从 2020 年的 Naive RAG 到 2026 年的自适应 RAG,五代演进清晰可见。本章作为整篇文章的"终章",将用架构师视角梳理 RAG 的演进图谱,展望未来 5 年的技术趋势,并给出企业级 RAG 架构选型的决策框架。

20.1 RAG 五代演进全景图

RAG 架构经过 5 年的演化,已经形成清晰的五代演进谱系:

RAG 五代演进全景图
═══════════════════════════════════════════════════════════════

  2020    Naive RAG
  ────    ─────────
          · 一次性 Embedding 检索
          · Top-K 召回 + 一次性生成
          · 问题: 检索偏, 上下文断裂
                 │
                 ▼
  2021-22 Advanced RAG
  ────    ───────────
          · 混合检索(BM25 + 向量)
          · Query 改写 / HyDE
          · Reranker 精排
          · 文档分块优化
          · 问题: 多跳失败, 全局性问题
                 │
                 ▼
  2023    Modular RAG
  ────    ───────────
          · 模块化设计(检索/评估/生成解耦)
          · Self-RAG / CRAG / FLARE
          · 多路召回 + 精排
          · 问题: 评估失真, 不可解释
                 │
                 ▼
  2024    GraphRAG & Multi-Modal RAG
  ────    ─────────────────────────
          · GraphRAG(知识图谱 + 社区检测)
          · ColPali(视觉文档直读)
          · Multi-Modal(文/图/表/视频)
          · Plan-and-Execute
          · 问题: 成本高, 工程复杂
                 │
                 ▼
  2025-26 Agentic RAG
  ────    ───────────
          · Multi-Agent 协作
          · DeepResearch 系统
          · 自适应路由
          · 推理-检索-评估闭环
          · 问题: 复杂度, 可控性
                 │
                 ▼
  未来    Adaptive RAG (2027+)
  ────    ──────────────────
          · 系统自主决定检索策略
          · 自我反思 + 持续学习
          · 多模态原生统一
          · 与 Agent 框架深度融合

20.2 五代 RAG 的能力对比

用六个关键维度对比五代 RAG 的能力:

维度 Naive Advanced Modular Graph/MM Agentic
检索精度
多跳能力
全局性问题
多模态
可解释性
工程复杂度
成本
适用场景FAQ通用问答企业 RAG专业领域深度研究

20.3 自适应 RAG:下一代范式

2027 年及以后,RAG 将演进到"自适应 RAG(Adaptive RAG)"——系统能自主决定"用哪种检索策略"、"调用哪些工具"、"投入多少推理算力",无需人工预设流程。

自适应 RAG 的核心特征:

特征 1:动态路由。一个 Router Agent 评估 Query 复杂度与类型,自动选择执行路径——简单问题走单跳 RAG,多跳问题走 Plan-and-Execute,全局问题走 GraphRAG,深度研究走 Multi-Agent。

特征 2:自我反思。系统在生成答案前自我评估"信息是否充分",不足时主动发起额外检索。生成答案后自我检测"是否有幻觉",有疑问时重新生成。

特征 3:持续学习。系统从用户反馈中学习——点赞的点(哪些信息有用)、点踩的点(哪些信息不可靠)反馈给检索器和生成器,实现"自我进化"。

特征 4:成本自适应。系统根据 Query 价值动态调整算力投入——高价值问题(如"重大决策")投入更多推理,低价值问题(如"闲聊")快速响应。

自适应 RAG 架构
═══════════════════════════════════════════════════════════════

              用户 Query
                  │
                  ▼
        ┌──────────────────┐
        │ Router Agent     │  评估 Query 复杂度
        │ (自适应路由)      │  决定执行路径
        └────────┬─────────┘
                 │
   ┌─────────────┼─────────────┬─────────────┐
   ▼             ▼             ▼             ▼
 单跳 RAG    Plan-Execute   GraphRAG     Multi-Agent
 (简单)     (多跳)         (全局)       (深度研究)
   │             │             │             │
   └─────────────┴─────────────┴─────────────┘
                          │
                          ▼
                  ┌──────────────────┐
                  │ Reflector Agent  │  自我反思
                  │ (质量评估)        │  信息是否充分
                  └────────┬─────────┘  答案是否可靠
                          │
                          ▼
                  ┌──────────────────┐
                  │ Final Answer     │
                  │ + Confidence     │
                  │ + References     │
                  └──────────────────┘

20.4 未来 5 年的技术趋势

展望 2026-2031 年,RAG 领域将出现以下关键技术趋势:

趋势 1:长上下文 vs RAG 的边界模糊。随着 Gemini 2M / Claude 1M / GPT-5 等超长上下文模型的成熟,"是否还需要 RAG"的争论会持续。但架构师共识是:长上下文与 RAG 互补——长上下文适合"读完整文档",RAG 适合"精确定位 + 大规模知识库"。未来 5 年,两者会融合为"长上下文 + 检索增强"的混合范式。

趋势 2:原生多模态统一检索。从"文本+图像"扩展到"文本+图像+视频+音频+3D+传感器"的全模态统一检索。代表方向是 ImageBind / LanguageBind 等全模态 Embedding 模型的成熟。

趋势 3:RAG 与 Agent 框架深度融合。未来 RAG 不再是"独立系统",而是 Agent 的"工具集"——Agent 根据需要自主调用 RAG 检索,同时 RAG 也可调用 Agent 的其他能力(计算、API、代码执行)。

趋势 4:自建模型与开放模型的分层。企业会形成"小模型做粗筛 + 大模型做综合"的模型分层架构。Embedding 用 BGE-M3(小、快),评估用 BGE-Reranker(小、精),综合用 GPT-4/Claude(大、强)。

趋势 5:RAG 工业化标准成熟。类似 SQL 是数据库的标准接口,RAG 也会形成"事实标准"——MCP(Model Context Protocol)、OpenAI 的 Assistant API 等正在尝试统一 RAG 接口。

趋势 6:评估体系工业化。LLM-as-a-Judge + 持续评估 + A/B Testing + 漂移检测成为 RAG 系统的"标配",评估成本从"奢侈品"变成"基础设施"。

20.5 企业级 RAG 架构选型决策框架

作为整篇文章的收尾,给架构师一个完整的选型决策框架:

企业级 RAG 架构选型决策框架
═══════════════════════════════════════════════════════════════

  Step 1: 评估业务复杂度
  ──────────────────────
  · Query 类型分布(事实型/多跳/全局/多模态)
  · 文档类型(纯文本/含图表/扫描件/视频)
  · 用户规模与并发量
  · 业务对延迟的容忍度

  Step 2: 评估非功能需求
  ──────────────────────
  · 答案准确性要求
  · 可解释性需求
  · 合规与审计需求
  · 成本预算

  Step 3: 选择基础架构
  ──────────────────────
  · 简单 FAQ: Naive/Advanced RAG
  · 企业知识库: Advanced/Modular RAG
  · 专业领域: Modular + GraphRAG
  · 深度研究: Agentic RAG

  Step 4: 选择增强能力
  ──────────────────────
  · 多跳问题多: Plan-and-Execute
  · 全局问题多: GraphRAG / LightRAG
  · 多模态多: ColPali / 多模态 Embedding
  · 复杂研究: Multi-Agent

  Step 5: 建设可观测性
  ──────────────────────
  · 三大支柱: 检索/生成/端到端
  · Tracing 系统
  · 漂移检测
  · A/B Testing

  Step 6: 持续迭代
  ──────────────────────
  · 数据驱动: 监控指标 → 发现问题 → 优化
  · 用户反馈: 点赞/点踩 → 模型微调
  · 业务对齐: KPI 联动 → 价值验证

20.6 架构师的"五个不要"

在 RAG 架构的演进中,架构师应当坚守"五个不要"原则:

不要 1:不要为了"先进"而先进。Multi-Agent、GraphRAG、DeepResearch 不是"更先进",而是"更复杂"。复杂匹配业务才是对的,盲目追新是过度工程化。

不要 2:不要忽视可观测性。生产级 RAG 没有可观测性是"黑盒"——出问题只能猜,出问题前无法预警。可观测性是入场券,不是锦上添花。

不要 3:不要脱离业务谈技术。RAG 的最终价值是"解决业务问题",不是"用上最酷的技术"。技术服务于业务,业务驱动技术选型。

不要 4:不要追求"完美系统"。RAG 系统没有"完美"——总有边界、有限制、失败模式。架构师的工作是"在约束下找到最优",不是"消除所有限制"。

不要 5:不要把 RAG 当成"银弹"。RAG 不是万能的——有些问题适合 Fine-tuning、有些适合长上下文、有些需要传统数据库查询。RAG 是工具箱里的一个工具,不是唯一工具。

20.7 终章:探索架构之美

回到「探索架构之美」的品牌主题。RAG 架构的前沿演进给我们什么启示?

第一,架构的演进是问题驱动的。Naive RAG 的局限推动了 Advanced RAG,Advanced 的多跳失效推动了 Modular,Modular 的全局性失效推动了 GraphRAG,GraphRAG 的成本问题推动了 LightRAG/HippoRAG,复杂问题推动了 Agentic RAG。每一次跃迁都是"用更好的架构解决更复杂的问题"。

第二,架构的本质是权衡。每一种 RAG 范式都有其优势与代价——ColPali 精度高但存储贵,GraphRAG 全局性好但成本高,Multi-Agent 能力强但复杂度高。没有最好的架构,只有最匹配的架构

第三,架构是系统思维。RAG 不只是"检索 + 生成",它是数据工程、机器学习、分布式系统、用户体验、运维监控的综合艺术。架构师的核心能力不是"会用某种技术",而是"在约束下设计可演进的系统"。

第四,架构服务于人。RAG 系统的最终用户是"用 RAG 解决问题的人"——客服、企业员工、研究员、医生、律师。技术为人服务,不是人为技术服务。架构师应当始终问自己:"这个设计让用户生活更好了吗?"

最后,架构之美在于演进。RAG 架构不是"一成不变的金科玉律",而是"持续演进的活系统"。从 2020 年到 2026 年,RAG 已经走过五代演进;未来 5 年还会有更多变化。架构师的工作是"看清演进方向、把握当下选择、为未来留出空间"。

终章寄语:多模态 RAG 与 Agentic RAG 的前沿演进,本质是"如何让 AI 更好地理解、检索、生成、推理"。作为架构师,我们站在这个激动人心的时代,既要拥抱新范式,也要警惕过度工程化。从传统 RAG 到 Agentic RAG,从单一模态到多模态,从单 Agent 到 Multi-Agent——每一步演进都是问题驱动的,每一种架构都是权衡的结果。探索架构之美,不在于"用了多酷的技术",而在于"用合适的技术解决了合适的问题"。这是 15 年架构师经验的总结,也是送给所有走在 RAG 演进之路上的同行者的寄语。

RAG 五代演进的本质是"问题驱动的范式跃迁"。每代 RAG 都试图突破前代的某个具体边界,架构师选型时应当"匹配业务复杂度与范式能力"。

flowchart TB A[/2020 Naive/] --> B[/2022 Advanced/] B --> C[/2023 Modular/] C --> D[/2024 Graph MM/] D --> E[/2025 Agentic/] E --> F[/2026+ Adaptive/] A --> A1[/一次性检索/] B --> B1[/混合检索+Rerank/] C --> C1[/模块化解耦/] D --> D1[/图谱+多模态/] E --> E1[/Multi-Agent/] F --> F1[/自适应路由/] style F fill:#fff5cc

从 Naive 到 Adaptive,每一步都是"问题驱动 + 架构权衡"的产物。

自适应 RAG 是 RAG 演进的"下一站"——系统自主决定检索策略、调用工具、投入算力。这种"自演进"能力标志着 RAG 从"配置式系统"走向"智能系统"。

flowchart TB A[/自适应 RAG/] --> B[/Router Agent/] A --> C[/Reflector Agent/] A --> D[/持续学习/] A --> E[/成本自适应/] B --> F[/动态路径选择/] C --> G[/自我评估/] D --> H[/用户反馈学习/] E --> I[/按价值分配算力/] style A fill:#fff5cc

自适应 RAG 代表着 RAG 与 Agent 框架深度融合的终极形态。