山东大学项目实训六
从朴素到智能:检索增强生成(RAG)技术全景演进
一篇关于 RAG 技术从诞生到 2026 年最新进展的深度综述
目录
- 引言:大模型时代的"知识困境"
- RAG 的诞生:一个朴素而天才的想法
- RAG 基础架构:三段式流水线
- 第一阶段:Naive RAG
- 第二阶段:Advanced RAG
- 第三阶段:Modular RAG
- 嵌入模型的演进
- 分块策略的艺术与科学
- 检索技术的深度进化
- 重排序:检索质量的最后一道防线
- Graph RAG:当知识图谱遇见检索增强
- Agentic RAG:智能体驱动的检索增强
- 多模态 RAG:跨越文本的边界
- Self-RAG 与 CRAG:让模型学会反思
- 评估体系:如何衡量 RAG 质量
- 生产落地:从原型到系统的鸿沟
- 2024-2026 年前沿探索
- 未来展望与开放问题
- 总结
- 参考资料
1. 引言:大模型时代的"知识困境"
2022 年末,ChatGPT 横空出世,将大语言模型(LLM)推向了公众视野的中心。人们惊叹于它流畅的对话能力、广博的知识储备和令人印象深刻的推理水平。但很快,三个致命缺陷浮出水面:
幻觉(Hallucination)——LLM 会自信满满地编造不存在的事实。你问它某篇论文的结论,它给你一段读起来头头是道但完全虚构的内容。这不是模型的"恶意",而是自回归生成的本质:模型只是在概率上最大化下一个 token 的合理性,而非在"说真话"。
知识截止(Knowledge Cutoff)——模型的训练数据有明确的时间边界。问它今天发生了什么,它只能抱歉地告诉你它的知识截止于某年某月。在瞬息万变的商业和科技世界中,这意味着模型天然地"过时"。
知识溯源(Attribution)——即使模型答对了,你也不知道它从哪里学到的这个知识。在需要严格溯源的场景(医疗、法律、金融),这种"黑箱知识"几乎不可接受。
面对这三大困境,业界探索了多种解决方案:
-
微调(Fine-tuning):将新知识注入模型权重。问题在于成本高、周期长,且容易导致灾难性遗忘——学了新知识,忘了旧本事。更关键的是,微调本质上是在"记忆"而非"检索",它无法让模型真正理解和运用动态变化的事实。
-
提示词工程(Prompt Engineering):把知识直接写进 prompt。对于少量知识有效,但受限于上下文窗口长度,且每次调用都要重复携带知识,成本高昂。
-
检索增强生成(Retrieval-Augmented Generation, RAG):在推理时动态检索相关文档,将检索结果作为上下文注入生成过程。这既能突破知识截止的限制,又能提供溯源依据,还能大幅降低幻觉。
第三条路——RAG——自 2020 年由 Lewis 等人在 Facebook AI Research(现 Meta AI)首次提出以来,经历了从"能用"到"好用"再到"智能"的快速演进。本文将带您全面回顾 RAG 技术的发展历程,从最原始的朴素架构,到 2026 年最前沿的 Agentic RAG 和多模态检索增强。
2. RAG 的诞生:一个朴素而天才的想法
2.1 学术起源
2020 年 5 月,Patrick Lewis 等人发表了论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》。这篇不到 15 页的论文,开创了一个全新的范式。
论文的核心思想出奇地简单:将预训练的检索器与预训练的序列到序列生成器端到端地联合训练。检索器负责从大规模文本语料库中找到相关文档,生成器负责基于这些文档生成最终回答。
这个想法的巧妙之处在于它融合了两个世界的精华:
- 检索系统的精确性和可更新性——文档库可以随时扩展和更新,不需要重新训练模型
- 生成模型的流畅性和泛化能力——Seq2Seq 模型(当时主要基于 BART)能够自然地整合检索到的信息,生成人类可读的流畅回答
2.2 原始架构
Lewis 等人提出了两种 RAG 变体:
RAG-Sequence:检索器为整个生成序列找到一组文档,生成器在生成每个 token 时,使用相同的文档集合。数学上,它定义为:
p R A G − S e q u e n c e ( y ∣ x ) ≈ ∑ z ∈ top-k ( p ( ⋅ ∣ x ) ) p η ( z ∣ x ) ∏ i p θ ( y i ∣ x , z , y 1 : i − 1 ) p_{RAG-Sequence}(y|x) \approx \sum_{z \in \text{top-k}(p(\cdot|x))} p_\eta(z|x) \prod_i p_\theta(y_i|x, z, y_{1:i-1}) pRAG−Sequence(y∣x)≈z∈top-k(p(⋅∣x))∑pη(z∣x)i∏pθ(yi∣x,z,y1:i−1)
其中 x x x 是输入查询, y y y 是目标输出, z z z 是检索到的文档, p η p_\eta pη 是检索器, p θ p_\theta pθ 是生成器。
RAG-Token:检索器为每个目标 token 选择不同的文档集合。这允许模型在生成不同部分时参考不同的知识源:
p R A G − T o k e n ( y ∣ x ) ≈ ∏ i ∑ z ∈ top-k ( p ( ⋅ ∣ x ) ) p η ( z ∣ x ) p θ ( y i ∣ x , z , y 1 : i − 1 ) p_{RAG-Token}(y|x) \approx \prod_i \sum_{z \in \text{top-k}(p(\cdot|x))} p_\eta(z|x) p_\theta(y_i|x, z, y_{1:i-1}) pRAG−Token(y∣x)≈i∏z∈top-k(p(⋅∣x))∑pη(z∣x)pθ(yi∣x,z,y1:i−1)
检索器使用了 Dense Passage Retrieval (DPR),这是一种基于双编码器的密集检索方法:使用 BERT 分别对查询和文档进行编码,通过向量内积计算相似度。文档索引使用 FAISS 构建,支持高效的近似最近邻搜索。
生成器则使用了当时最强的 Seq2Seq 模型——BART-large,拥有 4 亿参数。
2.3 为什么这个想法如此重要
回顾 2020 年的技术背景,我们才能理解 RAG 的革命性:
当时的主流范式是"预训练+微调"。BERT 问世两年,GPT-2 引发了对大规模生成的担忧但也展示了潜能,T5 统一了 NLP 任务的文本到文本框架。但这些模型都有一个根本局限:它们的全部知识都压缩在模型参数中。
参数是固定的。知识是固定的。更新知识意味着重新训练或微调。对于一个有 4 亿参数的模型来说,这已经足够昂贵;而对于未来数千亿参数的模型而言,这几乎不可行。
RAG 提供了一个截然不同的方案:将知识外化。模型参数负责语言理解和生成能力,而事实性知识则存储在外部文档库中。两者通过检索机制连接——模型"学会"了在需要时"查阅资料"。
这就像人类考试:闭卷考试(纯 LLM)依赖记忆,容易遗忘和出错;开卷考试(RAG)允许查阅资料,更准确,还带引用来源。
2.4 从学术到工业的跨越
2022 年末 ChatGPT 发布后,RAG 迅速从学术概念转变为工业实践。原因很简单:
- LLM 幻觉问题被广泛认知:ChatGPT 的强大让人们看到了 LLM 的可能,但它的"编造"问题也让企业用户望而却步
- 企业数据的私有性:企业拥有大量专有文档,不可能全部用于微调
- 知识更新的实时需求:金融、新闻、电商等场景需要实时或准实时的知识更新
2023 年初,LangChain 和 LlamaIndex 等 LLM 应用框架将 RAG 封装为几行代码即可实现的模式,使得任何开发者都能快速搭建"与文档对话"的应用。这一时期被称为 RAG 的"野蛮生长"期——大量 MVP 快速涌现,但生产可用性参差不齐。
3. RAG 基础架构:三段式流水线
在深入演进历程之前,我们先建立 RAG 基础架构的共识。任何 RAG 系统,无论多么复杂,都可以抽象为三个核心阶段:
3.1 索引阶段(Indexing)
这是离线阶段,目标是将知识库转化为可供高效检索的索引。
文档加载:从各种来源提取原始文本——PDF、Word、HTML、Markdown、数据库记录、API 响应等。每种格式都有其解析挑战:PDF 可能包含扫描图片、复杂表格和多栏布局;HTML 可能混杂导航栏、广告和无关脚本。
文本清洗:去除噪声、统一格式、处理特殊字符。这一步看似简单,实则对最终效果影响巨大。多余的空白字符、乱码、格式标记都可能干扰嵌入模型的理解。
文档分块(Chunking):将长文档切分为适当大小的片段。这是 RAG 中最被低估但影响深远的步骤。分块过大,检索精度下降,生成器无法聚焦;分块过小,上下文碎片化,关键信息丢失。我们将在第 8 章深入讨论分块策略。
向量化(Embedding):使用嵌入模型将每个文本块转换为固定维度的向量表示。这些向量捕捉了文本的语义信息,语义相近的文本在向量空间中彼此靠近。
索引存储:将向量及其对应的原始文本存入向量数据库(Vector DB),构建高效的近似最近邻搜索索引。
3.2 检索阶段(Retrieval)
这是在线阶段的第一个环节,目标是为用户查询找到最相关的文档片段。
查询处理:对用户原始查询进行预处理和增强。可能包括查询重写、查询分解、关键词提取等。
查询向量化:使用与文档嵌入相同的模型将查询转换为向量。
相似度搜索:在向量数据库中搜索与查询向量最相似的 top-k 个文档块。常用相似度度量包括余弦相似度、欧氏距离和点积。
后处理:对检索结果进行过滤、去重和重排序,提升最终送入生成器的文档质量。
3.3 生成阶段(Generation)
上下文组装:将检索到的文档片段与原始查询、系统提示词、对话历史等组合为完整的 prompt。这需要考虑 token 限制、信息优先级和文档排序。
LLM 推理:大模型基于组装的上下文生成回答。高质量模型能够忠实地引用所提供的文档,并在文档信息不足时明确表示不确定性。
后处理:对生成的回答进行格式化、引用标注、安全过滤等处理。
4. 第一阶段:Naive RAG
Naive RAG 是 RAG 技术的最初形态,也是大多数开发者在 2023 年初首次接触 RAG 时的实现方式。它严格遵循上述三段式流水线,几乎不做任何优化。
4.1 典型实现
一个典型的 Naive RAG 系统包含:
- 固定大小分块:例如,每 500 个 token 一个块,重叠 50 个 token
- 单一嵌入模型:如 OpenAI 的 text-embedding-ada-002
- 仅向量检索:使用余弦相似度进行 top-k 检索
- 简单 prompt 模板:将检索到的文档直接拼接在 prompt 中
- 无反馈循环:检索出什么就用什么,不做质量判断
用 LangChain 实现不超过 30 行代码:
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 1. 加载文档
loader = TextLoader("knowledge.txt")
documents = loader.load()
# 2. 分块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
# 3. 向量化并存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. 创建 RAG 链
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=vectorstore.as_retriever(k=4)
)
# 5. 查询
answer = qa.run("什么是 RAG?")
4.2 Naive RAG 的典型失败模式
Naive RAG 快速搭建、效果初现,但在实际使用中暴露出大量问题。以下是最常见的失败模式:
4.2.1 检索失败:找不到该找的
用户问"公司去年的营收是多少?",系统检索回了一堆关于"营收"的通用讨论,但没有包含具体数字的财务报告段落。
根因分析:
- 问题与文档的表述差异太大:用户用"营收",文档里是"主营业务收入"
- 嵌入模型无法捕捉精确的数字匹配需求
- 文档分块把关键的上下文切断了:数字在一个块,年份在另一个块
4.2.2 上下文污染:找到的不该找
用户问"苹果公司最新产品",系统检索回关于"苹果(水果)的营养价值"的文档。
根因分析:
- 嵌入模型缺乏对查询意图的深层理解,无法区分一词多义
- 知识库混入了不相关或低质量的文档,"苹果"这个词在水果相关文档中频繁出现
- 向量检索天然偏向高频语义匹配,而"苹果公司"和"苹果(水果)"在语义空间中并不够远
4.2.3 检索冗余:找回来一堆相似的
检索返回的 top-5 个文档块几乎完全相同,因为文档中有重复或高度相似的段落。这浪费了宝贵的上下文窗口空间,却没有提供增量信息。
根因分析:
- 知识库中存在大量重复内容
- 没有对检索结果进行多样性过滤
4.2.4 Lost in the Middle
这是 RAG 系统中最顽固的问题之一。研究表明,LLM 倾向于关注 prompt 的开头和结尾,而忽略中间部分的信息。当检索返回多个文档且关键信息落在中间位置时,生成质量显著下降。
Liu 等人在 2023 年的研究发现:对于多文档 QA 任务,当答案位于文档序列的中间位置时,GPT-3.5-Turbo 和 Claude 的性能都出现了明显下降——这一发现后来被 Liu 等人正式命名为"Lost in the Middle"现象。
4.2.5 无法处理复杂查询
Naive RAG 对于需要多步推理、多源对比或聚合计算的查询几乎无能为力。
用户问:“比较 A 公司和 B 公司去年的净利润,哪家更高?”
Naive RAG 的一次检索可能只找到了 A 公司的数据,或者虽然同时找到了两家公司的数据,但分在不同文档块中,LLM 无法有效地拼合信息。
根因分析:
- 单轮检索缺乏对复杂查询的结构化理解
- 没有多步检索或多轮问答的机制
4.2.6 生成幻觉依旧存在
即使检索到了相关文档,LLM 仍然可能"自由发挥",忽略检索结果,自行编造内容。这在文档信息与模型预训练知识冲突时尤为明显——模型有时倾向于相信自己"记忆"中的内容。
4.3 为什么 Naive RAG 仍然值得理解
尽管 Naive RAG 有如此多的不足,它建立的核心范式——“检索→上下文增强→生成”——至今依然是所有 RAG 变体的基础。理解 Naive RAG 的失败模式,是理解后续所有改进动机的关键。每一种失败模式,都催生了后续的一项或多项技术革新。
5. 第二阶段:Advanced RAG
面对 Naive RAG 的种种不足,研究者和工程师们在 2023 年到 2024 年初进行了大量改进。这些改进主要在检索质量上做文章,形成了 Advanced RAG 的技术图谱。
5.1 查询增强
查询增强(Query Enhancement)是在检索前对用户查询进行改造,以提高检索命中率的一系列技术。
5.1.1 查询重写(Query Rewriting)
用户查询往往是不精确、不完整的。查询重写使用 LLM 将用户原始查询优化为更利于检索的形式。
实现方式:使用 LLM 对原始查询进行改写,生成多个候选查询版本,分别检索后合并结果。
原始查询:"最近有什么新东西?"
重写后:"2024年最新产品发布和功能更新"
更进阶的方法是 Query2Doc——让 LLM 先生成一个伪文档来"填充"查询的语义空间,然后基于伪文档生成的向量去检索。这种方法桥接了查询和文档之间的语义差距。
5.1.2 多查询检索(Multi-Query Retrieval)
从不同角度生成多个查询变体,分别检索后合并去重。这在处理歧义查询时特别有效。
原始查询:"苹果的增长"
生成变体:
1. "Apple公司营收增长情况"
2. "苹果公司市值增长分析"
3. "苹果产品销量增长趋势"
5.1.3 HyDE(Hypothetical Document Embeddings)
Gao 等人提出的 HyDE 方法采用了一种反直觉但有效的策略:先让 LLM 根据查询生成一个假设文档(即使这个文档包含不准确的信息),然后使用这个假设文档的向量去检索真实的相似文档。研究显示,这种方法在多种基准测试中优于直接使用查询向量检索,尤其是当查询很短或缺乏足够语义信息时。
其核心洞见是:假设文档将短查询"膨胀"为具有丰富语义信息的完整文档表示,使得它在向量空间中更接近真实的相似文档。即使假设文档中的细节并不准确,只要它的主题、风格和词汇与相关真实文档足够接近,就能显著提升检索召回率。
5.1.4 Step-Back Prompting
当面对需要深层推理的问题时,Step-Back Prompting 先生成一个更高层级的"后退问题",检索更广泛的相关背景,然后结合具体细节给出回答。
原始问题:"GPT-4 的注意力机制与 GPT-3 有何不同?"
后退问题:"Transformer 注意力机制的演变历史"
5.2 检索融合
5.2.1 混合检索(Hybrid Search)
纯向量检索善于捕捉语义相似性,但对精确关键词匹配不敏感;传统的关键词检索(如 BM25)善于精确匹配,但无法理解同义词和语义变体。
混合检索结合两者优势:同时进行向量检索和 BM25 检索,通过加权融合(如 Reciprocal Rank Fusion, RRF)合并结果。
RRF 的计算公式为:
R R F ( d ) = ∑ r ∈ R 1 k + r a n k r ( d ) RRF(d) = \sum_{r \in R} \frac{1}{k + rank_r(d)} RRF(d)=r∈R∑k+rankr(d)1
其中 R R R 是所有参与融合的排序结果集, r a n k r ( d ) rank_r(d) rankr(d) 是文档 d d d 在结果集 r r r 中的排名, k k k 是一个常数(通常取 60),用于平滑排名差异的影响。
RRF 的优势在于:
- 无需对相关性分数进行校准——不同检索器的分数分布差异巨大,直接比较无意义
- 对排名位置敏感但对具体分数不敏感
- 计算简单,无需训练
实践中,混合检索往往能比纯向量检索提升 10%-20% 的召回率。
5.2.2 多路召回
不同于混合检索的两路融合,多路召回同时从多个索引和多种检索策略获取文档:
- 不同粒度索引:摘要索引、段落索引、句子索引
- 不同嵌入模型:通用嵌入、领域专用嵌入、多语言嵌入
- 不同检索算法:稀疏检索、密集检索、基于知识图谱的检索
各路结果经过去重和融合后,形成最终的候选集。
5.2.3 父子索引(Parent-Child Indexing)
一个关键的实践突破是父子索引(也称为"小索引大返回"策略)。核心思想非常简单但有效:
- 索引阶段:将文档切分为小粒度块(子块,如 200 token),对其生成向量并建立索引
- 检索阶段:在子块索引上进行检索,找到最相关的子块
- 返回阶段:返回子块所属的更大范围上下文(父块,如 1000 token),或返回整个原始文档
这种方法同时兼顾了检索精度(小块使向量表示更聚焦)和上下文完整度(大块确保信息不丢失)。在实现上,每个子块存储一个指向父块的指针,检索后通过指针回溯即可。
5.3 上下文优化
5.3.1 重排序(Re-ranking)
检索返回的 top-k 文档是粗筛结果。重排序使用更精密(也更昂贵)的模型对这 k 个候选进行精细排序。
基于交叉编码器的重排序是最常见的方式:将查询和每个文档拼接后送入一个 Transformer 模型,直接输出相关性分数。与双编码器(分别编码查询和文档)相比,交叉编码器能捕捉查询和文档之间的细粒度交互,准确率显著更高。代价是计算成本——对每个查询-文档对都需要一次完整的前向传播,因此只能在粗筛后的候选集上使用。
Cohere Rerank、BGE-Reranker、Cross-Encoder 等模型专门为此任务训练,能有效区分"相关"和"高度相关"的文档,将真正最有价值的信息排在前面。
5.3.2 上下文压缩
不是所有的文档内容都对回答有用。上下文压缩技术先检索完整文档,再用 LLM 从中提取与查询相关的片段,丢弃无关内容。这样既减少了上下文占用,又提高了回答精度。
LangChain 的 ContextualCompressionRetriever 就实现了这一模式。
5.3.3 文档排序策略
研究发现,检索文档在 prompt 中的排列顺序显著影响生成质量。"Lost in the Middle"现象提示我们,关键文档应该放在 prompt 的开头或结尾附近。
一种有效策略是:将最相关的文档放在开头(引起模型重视),次相关的放在结尾(避免被遗忘),中等相关的放在中间。或者采用迭代策略——先用最相关的文档生成草稿,再逐步引入更多文档进行修正。
5.4 自查询检索(Self-Query Retrieval)
当用户查询包含元数据约束时,纯语义检索可能不够。“2024 年第一季度关于 RAG 的论文”——这个查询既需要语义理解(关于 RAG 的论文),又需要结构化过滤(2024 年第一季度)。
Self-Query Retrieval 使用 LLM 从查询中提取语义内容和结构化过滤条件,然后分别处理:语义部分进行向量检索,结构化部分应用元数据过滤。最后取两者的交集返回。
# LLM 提取的结果
{
"query": "RAG 论文",
"filter": {
"date": {"$gte": "2024-01-01", "$lt": "2024-04-01"}
}
}
6. 第三阶段:Modular RAG
2024 年初,随着研究的深入和实践经验的积累,RAG 社区开始认识到:没有一种通用的 RAG 架构适用于所有场景。不同的任务、不同的数据、不同的质量要求,需要不同的检索策略和生成策略。
Modular RAG 应运而生。
6.1 核心理念
Modular RAG 将 RAG 系统视为由可替换模块组成的流水线,每个模块都可以根据具体需求进行选择和配置。它不是"一种架构",而是"一套架构模式"。
核心模块包括:
| 模块 | 功能 | 可选实现 |
|---|---|---|
| 查询处理器 | 增强和转换用户查询 | 重写、分解、扩展、翻译 |
| 路由器 | 决定检索策略 | 语义路由、元数据路由、混合路由 |
| 检索器 | 获取相关文档 | 密集、稀疏、混合、KG-based |
| 重排序器 | 精细排序候选文档 | 交叉编码器、LLM-based、ColBERT |
| 上下文构建器 | 组装最终上下文 | 拼接、压缩、摘要、结构化 |
| 生成器 | 基于上下文生成回答 | LLM、专门微调模型 |
| 记忆模块 | 跨对话知识管理 | 短期记忆、长期记忆、用户画像 |
6.2 路由机制
路由是 Modular RAG 最关键的创新之一。它解决了一个核心问题:不是所有查询都适合用同一种检索策略。
查询路由(Query Routing):
查询:"今天天气怎么样?"
→ 路由到:时效性查询处理器 → 实时搜索 API
查询:"什么是 Transformer?"
→ 路由到:知识库检索器 → 内部文档
查询:"帮我总结这篇论文"
→ 路由到:上传文档处理器 → 本地文档检索
实践中的路由决策通常由 LLM 完成。系统向 LLM 提供可用的数据源描述和查询内容,由 LLM 决定应该使用哪些数据源、采用何种检索策略。
自适应检索(Adaptive Retrieval):更进一步,自适应检索不仅路由查询到不同数据源,还动态决定是否需要检索。对于简单的、模型已有充分知识的问题,跳过检索直接回答,减少延迟和计算开销。
6.3 迭代检索
许多复杂查询无法通过单轮检索解决。迭代检索引入多轮检索-生成的循环。
递归检索:先检索获得初步结果,基于结果生成中间回答,再基于中间回答的不足发起新的检索,如此往复,直到信息充分。
多跳检索(Multi-Hop Retrieval):将复杂问题分解为多个子问题链,每个子问题的回答成为下一个子问题的检索依据。
问题:"RAG 论文的第一作者在哪所大学工作?"
第1跳:检索"RAG 论文的作者" → "Patrick Lewis"
第2跳:检索"Patrick Lewis 所属机构" → "Meta AI (当时为 Facebook AI Research)"
最终回答:"Patrick Lewis,就职于 Meta AI"
IRCoT(Interleaving Retrieval with Chain-of-Thought)将检索步骤与思维链推理交替进行:模型每推理一步,就检索验证所需的证据,确保推理的每一步都建立在可靠的信息基础上。这种方法在 HotpotQA 和 2WikiMultihopQA 等多跳推理基准测试上取得了显著优于单轮检索的结果。
6.4 融合生成
在 Modular RAG 框架下,生成方式也不再局限于简单的 prompt 拼接:
Map-Reduce:对每个检索文档分别生成部分回答,再汇总为最终回答。适合处理大量文档且需要综合信息的情况。
Refine:用第一个文档生成初始回答,然后用后续文档依次修正和完善。保持回答的连贯性。
Map-Rerank:对每个文档生成回答并评分,选择最高分的作为最终回答。适合文档相关性差异较大的场景。
7. 嵌入模型的演进
嵌入模型是 RAG 系统的基石。它的质量直接决定了检索的上限——如果文档没有被正确索引,后续所有的检索优化都是无源之水。
7.1 第一代:静态词向量
2013 年到 2018 年,Word2Vec、GloVe 和 FastText 是文本嵌入的主流。它们为每个词学习一个固定向量,简单地将词向量平均或加权平均得到句子表示。
这些模型的根本局限在于:无法处理上下文相关的词义。"bank"在"river bank"和"bank account"中是完全不同的含义,但静态词向量只有一个表示。此外,简单的平均池化会丢失词序信息——"A 攻击了 B"和"B 攻击了 A"在这种表示下几乎相同。
虽然现代 RAG 系统已经不再使用这些方法,但它们奠定了"文本→向量→语义检索"的基本范式。
7.2 第二代:预训练语言模型
2018 年 BERT 的出现彻底改变了文本嵌入的格局。BERT 通过双向注意力机制在每个位置生成上下文感知的表示,解决了多义词的问题。
2019 年 Sentence-BERT(SBERT)的提出使 BERT 级别的嵌入真正适用于大规模语义检索。SBERT 在 BERT 基础上添加了池化层,并使用孪生网络结构和三元组损失进行微调,使得语义相似的句子在向量空间中靠近,不相似的句子远离。
2020 年的 DPR(Dense Passage Retrieval)进一步针对检索场景优化:将查询和文档分别编码,使用对比学习训练,正样本是相关的查询-文档对,负样本是同一批次中其他查询的文档(in-batch negatives)。
L ( q , d + , d 1 − , . . . , d n − ) = − log e sim ( q , d + ) e sim ( q , d + ) + ∑ i = 1 n e sim ( q , d i − ) L(q, d^+, d^-_1, ..., d^-_n) = -\log \frac{e^{\text{sim}(q, d^+)}}{e^{\text{sim}(q, d^+)} + \sum_{i=1}^n e^{\text{sim}(q, d^-_i)}} L(q,d+,d1−,...,dn−)=−logesim(q,d+)+∑i=1nesim(q,di−)esim(q,d+)
7.3 第三代:大规模对比学习
2022-2024 年是嵌入模型的爆发期。几个代表模型:
OpenAI text-embedding-ada-002(2022.12):OpenAI 发布的第一个通用嵌入 API,1536 维向量,性能大幅超越此前的开源模型。虽然模型细节未公开,但它拉开了嵌入 API 商业化的序幕。随后在 2024 年 1 月,OpenAI 发布了 text-embedding-3-small(性能相近、价格降低 5 倍)和 text-embedding-3-large(256-3072 维可调,多项基准 SOTA)。
E5 系列(2023-2024):微软提出的 EmbEddings from bidirEctional Encoder rEpresentations(E5),通过精心设计的两阶段对比预训练,在一个统一的框架下学习高质量的文本嵌入。E5 的关键创新在于数据构造方式:它使用未标注的自然语言文本,通过模板变换生成伪正样本对。例如,将"summarize: {文档}“作为查询,”{文档}"本身作为正样本。这种数据构造策略使得 E5 能够在海量无标注数据上进行训练,而无需昂贵的人工标注。
BGE 系列(2023-2024):BAAI 发布的 BAAI General Embedding(BGE)系列是目前最受欢迎的开源嵌入模型之一。BGE 的秘诀在于 RetroMAE——一种将自编码和自回归结合起来的预训练方法。具体来说,编码器看到被 mask 的输入文本,解码器基于编码器的输出重建被 mask 的 token。这种设计使得编码器学习到的表示必须包含足够的语义信息以支持重建,从而自然地获得了高质量的句向量。
BGE-M3 是该系列的里程碑,它首次支持多语言、多粒度(输入 8192 token)和多功能(密集+稀疏+ColBERT 三位一体)的统一嵌入。
Jina Embeddings(2023-2024):Jina AI 的嵌入模型系列专注于长上下文嵌入和多语言支持。Jina Embeddings v2 支持 8192 token 的输入长度,v3 更进一步扩展到更长上下文并支持任务特定的 LoRA 适配器。
Voyage AI(2024):由前斯坦福和 MIT 研究人员创立的 Voyage AI 推出了专为 RAG 优化的嵌入模型系列,在多个检索基准上持续刷新 SOTA。其优势在于对长文档和领域特定语料的出色适应能力。
7.4 第四代:LLM-based 嵌入与统一模型
2024-2026 年,嵌入模型出现了几个重要趋势:
LLM 生成嵌入:直接使用 GPT-4、Claude 等顶级 LLM 的隐藏状态作为文本嵌入。虽然推理成本显著更高(每次嵌入需要一次完整的 LLM 前向传播),但质量也在多个基准上表现出了显著优势——这些模型在预训练阶段摄入的海量知识使得它们的文本表示具有更强的语义理解能力。但这种方式目前仍主要用于重排序等需要极高精度的环节,而非全量索引。
统一嵌入与生成:GritLM 和 LLM2Vec 等工作探索了用同一个模型完成嵌入和生成两项任务的可能。传统上,嵌入模型(BERT 架构的 Encoder-only)和生成模型(GPT 架构的 Decoder-only)是两个独立的体系。GritLM 通过将指令微调和对比学习统一在一个训练框架中,成功让一个 Mistral 7B 模型同时擅长生成和语义检索,在 MTEB(Massive Text Embedding Benchmark)上取得了与专门嵌入模型相当甚至更优的结果。
这种统一的意义不仅仅是减少部署成本。它意味着同一个模型既能"理解"文本(用于检索),又能"运用"文本(用于生成),知识在两个功能之间自然流动——不再需要因嵌入模型和生成模型的知识差异而损失信息。
Matryoshka 嵌入:受俄罗斯套娃启发的 Matryoshka Representation Learning(MRL)技术,让单次嵌入可以灵活截取为不同维度。例如 2048 维的嵌入可以截取前 512 维使用——虽有小幅精度损失,但存储和计算成本降低 75%。这为 RAG 系统在成本和精度之间的动态平衡提供了新的可能性。OpenAI 的 text-embedding-3 系列原生支持这一特性。
7.5 领域特定嵌入
通用嵌入模型在大多数场景表现良好,但在高度专业化的领域(生物医药、法律、金融),性能可能断崖式下降——这些领域的术语、缩写和表述方式与通用语料差异巨大。
领域特定嵌入的训练策略包括:
- 继续预训练:使用领域语料继续训练通用模型,逐步适应领域语言模式
- 任务特定微调:基于领域内的高质量查询-文档对(通常通过用户反馈或人工标注获取)对模型进行对比学习微调
- 数据增强:使用 LLM 生成领域内的合成查询-文档对,扩充训练数据
实践中,一个经过充分微调的领域嵌入模型通常能比通用模型在该领域内提升 15%-30% 的 Recall@10。
8. 分块策略的艺术与科学
分块(Chunking)是 RAG 流水线中最"不起眼"却又影响深远的环节。它看起来像是一个工程上的小细节,但实际上承载着深刻的语义和信息论考量。
8.1 固定大小分块
最简单的方法:设定一个固定的字符数或 token 数作为块大小,再加上固定大小的重叠区域。
RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", ",", " ", ""]
)
选择合适的分块大小是一个权衡:
| 分块大小 | 优势 | 劣势 |
|---|---|---|
| 小块(100-200 token) | 检索精度高、嵌入更聚焦 | 丢失上下文、信息碎片化 |
| 中块(500-1000 token) | 上下文与精度的平衡 | 需要更多实验找到最佳值 |
| 大块(2000+ token) | 上下文完整、减少碎片化 | 降低检索精度、嵌入稀释 |
没有普适的"最佳大小"。它取决于文档类型(FAQ 可能需要小块,研究报告可能需要大块)、嵌入模型(有些模型在小块上更好)和 LLM 上下文窗口(窗口越大,越能承受大块)。
8.2 语义分块
固定大小分块的根本问题是:它不关心文本的语义结构。它可能在句子中间、段落中间,甚至在词中间切断文本。"公司去年营收为"和"100亿元"被分在两个块中,检索时单独找到任何一个都几乎无用。
句子感知分块:以句子为单位,尽量在句子边界分块。NLTK 或 spaCy 的句子分割器先找出所有句子边界,然后尽可能在这些边界处分块,即使块大小不完全均匀。
段落感知分块:以自然段落为基本单位。Markdown 文档最容易实现——以标题层级为分割依据。LaTeX 文档以章节、小节为单位。这保持了文本的自然组织结构。
基于主题的分块:使用文本分割算法(如 TextTiling)检测主题转换点,在主题发生变化处进行切割。这种方法更接近文档的自然逻辑结构。
8.3 递归分块
LangChain 的 RecursiveCharacterTextSplitter 实现了一种优雅的递归策略:
- 首先尝试用双换行符(段落分隔符)分割
- 如果某段仍然过长,尝试用单换行符分割
- 再不行,尝试用句子结束符分割
- 最后兜底,按固定字符数强制切分
这种多级策略在大多数情况下都能产生语义相对完整的分块。
8.4 基于 LLM 的智能分块
2024 年最前沿的方法之一是利用 LLM 本身来决定分块策略。思路很直接:LLM 已经理解文本的语义结构,不如让它来判断哪里应该切分。
ClusterLLM 等方法使用嵌入聚类来识别文档中的语义转换点,然后在这些转换点进行切分。嵌入模型作为"分块助手",LLM 负责最终的生成任务——两者各自发挥所长。
Proposition-Based Chunking(命题分块):Dense X Retrieval 工作中提出的一个激进想法——使用 LLM 将文档重写为自包含的原子命题(每个命题是一个独立的、完整的陈述),然后以命题为单位进行检索。这从根本上避免了下文依赖问题,但代价是预处理成本极高——每篇文档都需要经过一次 LLM 推理。
8.5 多粒度索引
既然单一粒度难以满足所有查询,为何不同时使用多个粒度?
多粒度索引策略:
- 构建摘要级索引、段落级索引、句子级索引三套并行的向量库
- 不同粒度的索引服务于不同类型的查询:概括性查询优先检索摘要,细节性查询优先检索句子
- 检索时可以先用摘要索引缩小候选范围,再在对应的细粒度索引中精确检索
Small-to-Big 检索是这一思想的具体实现:从小粒度的句子或段落开始检索,找到相关单元后,返回包含该单元的更大范围上下文(整个段落、整个章节甚至整个文档)。
8.6 结构化文档的特殊处理
PDF、HTML、Word 等结构化文档需要特殊的分块处理。特别是 PDF,它是 RAG 系统中最常见也最令人头疼的文档格式。
PDF 处理的挑战:
- 扫描版 PDF 中的文字需要 OCR 识别,准确率并非 100%
- 多栏布局需要正确的阅读顺序重建
- 表格数据需要专门提取(Camelot、Tabula、Unstructured 等工具)
- 图片中的信息(图表、截图)需要考虑多模态处理策略
- 页眉页脚和页码等噪声需要识别和过滤
表格处理:将表格转换为结构化文本(JSON、Markdown 表格或自然语言描述)后再嵌入。自然语言描述(“表格显示 2023 年 Q1 营收为 100 亿元,同比增长 15%”)通常比原始 JSON 在语义检索中效果更好。
9. 检索技术的深度进化
检索质量是 RAG 系统的生命线。正如经典的"Garbage In, Garbage Out"原则,如果检索到的文档并不包含答案,LLM 无论如何也无法诚实正确地回答。
9.1 稀疏检索:传统但不可替代
BM25(Best Matching 25)是稀疏检索的代表算法,基于 TF-IDF 思想但做了两处关键改进:
- 词频饱和:词频对相关性的贡献不是线性的。一个词出现 100 次并不比出现 10 次"相关 10 倍",因为当某个词已经足够频繁地出现时,额外的出现不再提供多少增量信息。BM25 通过非线性变换来模拟这种饱和效应。
- 文档长度归一化:长文档天然包含更多词汇,如果不做归一化就会在检索中占据不公平的优势。BM25 通过惩罚长文档来纠正这种偏差。
稀疏检索的优势在于:
- 精确匹配:对于专有名词、代码、ID、数字等无语义变体的查询,精确匹配不可替代
- 可解释性:可以直接看到哪些关键词触发了匹配
- 零样本部署:不需要训练,不需要嵌入向量索引
- 低计算成本:不需要 GPU 推理
9.2 密集检索:语义理解的飞跃
密集检索(Dense Retrieval)将查询和文档映射到同一个连续向量空间,通过向量相似度进行匹配。
技术路线:
- 双编码器:查询和文档使用独立的编码器(或同一编码器但不同的池化策略)。查询编码器产生的向量用于检索,文档编码器产生的向量预先计算好存储在向量库中。检索时只需要编码查询(一次前向传播),与所有文档向量的相似度计算可通过 ANN 索引高效完成。
- ColBERT:晚期交互模型。为查询的每个 token 和文档的每个 token 都生成向量,通过最大相似度求和计算相关性。相比双编码器稍慢但更精确,相比交叉编码器更快但稍逊于其精度。ColBERT 在精度和速度之间找到了一个关键的 sweet spot,其 ColBERTv2 版本通过蒸馏和残差压缩进一步提升了效率。
密集检索的优势是显而易见的:能处理同义词、释义和跨语言匹配,但需要训练数据和 GPU 进行嵌入。
9.3 稀疏-密集融合:混合检索的最佳实践
稀疏和密集检索各有独到之处,将它们融合能产生"1+1>2"的效果。关键在于融合策略:
线性加权融合:对稀疏分数和密集分数进行加权求和。权重可以手动设定,也可以基于验证集学习。
s c o r e ( d , q ) = α ⋅ s c o r e d e n s e ( d , q ) + ( 1 − α ) ⋅ s c o r e s p a r s e ( d , q ) score(d, q) = \alpha \cdot score_{dense}(d, q) + (1-\alpha) \cdot score_{sparse}(d, q) score(d,q)=α⋅scoredense(d,q)+(1−α)⋅scoresparse(d,q)
倒数排名融合(RRF):不依赖分数值,只考虑排名。这种方法更鲁棒,因为不同检索器的分数分布可能天差地别。
学习融合:训练一个小的打分模型,输入的稀疏分数、密集分数和其他特征,输出融合后的相关性分数。这种方法效果通常最好,但需要标注数据。
9.4 向量数据库的选择
向量数据库是 RAG 系统的基础设施。2024 年,向量数据库市场已经形成了清晰的格局:
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| Chroma | 轻量级、Python 原生、零配置 | 原型开发、小规模部署 |
| FAISS | Meta 出品、极致性能、纯索引库 | 需要最大吞吐的场景 |
| Milvus | 分布式、支持十亿级向量 | 企业级大规模部署 |
| Weaviate | GraphQL API、内置混合搜索 | 需要多模态和混合搜索 |
| Pinecone | 全托管、零运维、商业支持 | 中小团队快速上线 |
| Qdrant | Rust 编写、高性能、过滤能力强 | 需要复杂过滤逻辑的场景 |
| pgvector | PostgreSQL 扩展 | 已有 PG 基础设施的团队 |
| Elasticsearch | 统一全文+向量搜索 | 需要 ELK 技术栈的企业 |
选型的关键考量包括:
- 向量规模(万级 vs 亿级)
- QPS 要求
- 是否需要混合搜索(向量+关键词+过滤)
- 运维成本(自建 vs 托管)
- 与现有技术栈的兼容性
9.5 上下文窗口的"甜蜜负担"
2024 年,LLM 上下文窗口出现了"军备竞赛"式的增长:
- Gemini 1.5 Pro:支持 100 万 token(2024 年 2 月,随后扩展到 200 万)
- GPT-4 Turbo:128K token
- Claude 3:200K token
- Claude 4:200K token
- Gemini 2.5 Pro:100 万 token
表面上,更大的上下文窗口似乎可以简化 RAG 的设计——直接把所有文档塞进去不就好了?但深入分析后情况并非如此:
- 注意力稀释:上下文窗口越大,模型注意力越分散。研究表明,即使现代模型在处理超长上下文时,对中间部分信息的提取能力仍然显著低于开头和结尾
- "大海捞针"并非全面解决:虽然 Gemini 和 Claude 在 NIAH(Needle In A Haystack)测试中表现优异,但这测试的是"找一句完全突兀的话",而非"理解分散在多个段落中的相关但与周围文本自然衔接的信息"
- 成本与延迟:填充大量 token 到上下文窗口显著增加推理成本(与 token 数量线性或二次方相关),延迟也随之上升
- 信息密度与质量:塞入 100K token 并不意味着信息的效率提升,大量低质量内容反而会挤压关键信息的"信噪比"
因此,大上下文窗口并非 RAG 的替代品,而是对 RAG 的增强。合理的设计是:利用 RAG 精确定位相关文档,再用大上下文窗口承载更多上下文和对话历史。两者互补而非互斥。
10. 重排序:检索质量的最后一道防线
检索器通常需要在毫秒级延迟内处理百万甚至亿级的文档,因此只能使用轻量级的双编码器或 ANN 索引。重排序则不同——它只需要处理检索返回的 top-k(通常 k=50 到 200)个候选,因此可以使用计算量更大但更精确的方法。
10.1 交叉编码器重排序
交叉编码器(Cross-Encoder)将查询和文档拼接后一起送入 Transformer 编码器,利用自注意力机制捕捉查询和文档之间的细粒度语义交互。这种"全交互"模式让模型能在每一层注意力中同时看到查询的每个词和文档的每个词,理论上可以捕捉到任何级别的语义匹配信号。
典型实现:
- BGE-Reranker:BAAI 发布的系列重排序模型,BGE-Reranker-v2-m3 支持多语言
- Cohere Rerank:商业重排序 API,质量优异,为其 Command R 模型生态的一部分
- Cross-Encoder ms-marco-MiniLM:轻量级选项,基于微软 MARCO 数据集微调的 MiniLM 模型
交叉编码器的主要缺点是延迟——每个查询-文档对都需要一次完整的前向传播。对于 200 个候选,就需要 200 次前向传播,这可能在毫秒级精度退化到秒级。因此,只有检索阶段无法充分区分的"硬样本"才值得交给交叉编码器处理。
10.2 LLM-based 重排序
2024 年,一个直观但有效的趋势是使用 LLM 本身进行重排序。
方法一:逐对比较(Pairwise Comparison):将两个文档和查询一起呈现给 LLM,让它选择哪个更相关。对 top-k 个文档进行多轮比较(如冒泡排序或锦标赛排序),得出最终排序。
方法二:逐点打分(Pointwise Scoring):要求 LLM 对每个文档给出一个相关性分数(如 1-5 分)。
方法三:列表排序(Listwise Ranking):要求 LLM 直接对所有文档进行排序输出。这种方法理论上最优,但对 LLM 的输出格式要求很高,且候选数量不能太多。
RankGPT 等研究表明,使用 GPT-4 进行逐对比较重排序,其准确率超过了大多数专门训练的交叉编码器。但代价高昂——每次重排序都需要大量 LLM API 调用——因此在实践中通常只用于小规模候选集或高频值场景。
RankVicuna 和 RankZephyr 等开源尝试使用开源 LLM 进行重排序,以降低成本和延迟,但质量目前尚不及商业 LLM。
10.3 多阶段检索流水线
综合来看,最有效的检索架构通常是多阶段的:
用户查询
→ 第一阶段:粗筛(BM25 + 密集检索融合,从百万级到百级)
→ 第二阶段:精排(交叉编码器或 LLM-based,从百级到十级)
→ 第三阶段(可选):LLM 压缩(从完整文档提取相关片段)
→ 生成
每个阶段依次缩小候选集,并逐步增加每个候选的计算投入。这种漏斗式设计在精度和延迟之间找到了工程上可行的平衡点。
11. Graph RAG:当知识图谱遇见检索增强
11.1 为什么需要 Graph RAG
传统 RAG 擅长回答"在某个文档的某个段落中提到的事实",但在面对需要连接多个事实、理解实体间关系的查询时力不从心。
例如: “特斯拉的 CEO 还创立了哪些公司?” 要回答这个问题,系统需要:
- 找到"特斯拉 CEO 是 Elon Musk"
- 找到"Elon Musk 创立了 SpaceX、Neuralink、The Boring Company、xAI"
- 将这些信息对齐到"还"(即除了特斯拉以外)
在传统 RAG 中,这些信息可能分散在多个文档或同一文档的不同段落中。向量检索很可能只找到其中一部分,而 LLM 需要依赖不完整的检索结果进行推理。
Graph RAG 通过引入知识图谱的结构化表示,为 RAG 补上了"关系推理"这块拼图。
11.2 知识图谱的构建
Graph RAG 的第一步是构建知识图谱。主要有三种方式:
从文档自动提取:使用 LLM 或专门的 NER+RE(命名实体识别+关系抽取)模型,从非结构化文档中提取实体和关系。
文档:"Patrick Lewis 在 Facebook AI Research 提出了 RAG 技术"
提取结果:
实体:Patrick Lewis (PERSON), Facebook AI Research (ORG), RAG (TECHNOLOGY)
关系:(Patrick Lewis) -[employed_by]-> (Facebook AI Research)
关系:(Patrick Lewis) -[proposed]-> (RAG)
使用现有知识库:直接接入 Wikidata、DBpedia、领域知识图谱等结构化知识源。
混合构建:自动提取为主,人工校验关键实体和关系为辅。
Microsoft 的 GraphRAG 系统在这一步引入了一个重要的创新:社区检测。在构建好实体关系图后,使用 Leiden 等社区检测算法识别紧密关联的实体群(社区),为每个社区生成自然语言摘要。这种"层级化总结"使得系统在不同粒度上都能提供相关信息。
11.3 图增强检索
有了知识图谱,检索可以融合两种信号:
向量检索:在实体和关系的文本描述上建立向量索引,支持语义模糊匹配
图遍历:沿着知识图谱的边进行多跳遍历,找到相关的实体链
具体策略包括:
- 实体链接:从查询中识别实体,在知识图谱中定位,沿关系边扩展检索
- 子图检索:以查询实体为中心,提取 k 跳内的子图,将子图信息注入生成上下文
- 路径排序:对于多跳查询,枚举实体间的所有可能路径,用路径上的关系作为推理线索
11.4 Microsoft GraphRAG
2024 年 7 月,Microsoft Research 发布了 GraphRAG 项目和配套论文《From Local to Global: A GraphRAG Approach to Query-Focused Summarization》,迅速成为最受关注的 Graph RAG 实现。
Microsoft GraphRAG 的核心流程:
- Source Document → Text Chunks:将文档分块
- Text Chunks → Element Instances:使用 LLM 从每个块中提取实体、关系和声明
- Element Instances → Element Summaries:使用 LLM 对提取的元素进行去重和总结
- Element Summaries → Graph Communities:使用 Leiden 算法进行层次化社区检测
- Graph Communities → Community Summaries:为每个社区生成摘要
- Community Summaries → Global Answers:对于宏观问题,使用社区摘要进行回答
这种方法的独特之处在于它支持两类查询:
局部查询(Local Query):针对特定实体的问题,通过图遍历找到相关实体和关系,结合原始文本块进行回答。
全局查询(Global Query):对整个数据集的理解性问题(如"数据集的主要主题是什么?"),通过社区摘要进行回答。传统 RAG 难以处理这类问题,因为"整个数据集的主要主题"并不存在于某一个文档段落中——它需要跨文档的归纳和总结。
11.5 LightRAG 和其他效率优化
Microsoft GraphRAG 的一个显著缺点是成本。每个步骤都需要大量 LLM 调用——实体提取、去重、社区总结,每一步都在消耗 token。对于一个中等规模的文档集(10万文档),GraphRAG 的索引构建成本可能高达数千甚至上万美元。
LightRAG(2024.10)提出了一种更轻量级的 Graph RAG 方案:
- 使用更高效的实体提取方法(减少 LLM 调用次数)
- 引入双层检索——高层语义用关键词检索快速定位,低层细节用图遍历获取
- 支持增量更新,避免全量重新索引
nano-GraphRAG 和 graphrag-local-ollama 等项目则致力于让 Graph RAG 在本地设备上运行,使用 Ollama 等工具调用本地部署的开源模型,降低使用门槛和成本。
11.6 Graph RAG 的适用场景与局限
Graph RAG 不是传统 RAG 的替代品,而是特定场景下的增强方案。
适用场景:
- 复杂的关系推理(“X 和 Y 之间有什么联系?”)
- 宏观概括和主题分析
- 知识密集型领域的专业问答(医疗、法律、科学研究)
- 多文档跨段落的信息综合
局限性:
- 构建和维护知识图谱的成本高(计算和人工)
- 实体提取和关系抽取的准确率无法达到 100%,错误会级联传播
- 对实时性要求高的场景不友好(图构建是批量离线过程)
- 结构简单的 FAQ 和单事实查询用 Graph RAG"杀鸡用牛刀"
12. Agentic RAG:智能体驱动的检索增强
2024 年下半年到 2025 年,RAG 最令人兴奋的发展方向是 Agentic RAG。它的核心思想是将 RAG 从一个"固定的流水线"升级为"智能体可调用的工具之一"。
12.1 从工具到智能体
传统 RAG 中,检索是流程中的一个固定步骤:查询来了就检索,检索完了就生成。Agentic RAG 打破了这种固定模式,将检索能力包装为工具,由智能体根据任务需要自主决定:
- 是否需要检索?
- 检索几个数据源?
- 以什么顺序检索?
- 检索结果是否足够,还是需要调整策略重新检索?
这从根本上改变了 RAG 的定位:它不再是应用的核心逻辑,而是智能体工具箱中的一个可选工具。
12.2 ReAct:推理与行动的融合
ReAct(Reasoning + Acting)是 Agentic RAG 的基础范式。它将 LLM 的推理能力与外部工具调用能力交替进行:
Thought: 用户想知道 2024 年 RAG 领域最重要的三篇论文。我需要先找到 2024 年的 RAG 论文,然后评估它们的影响力。
Action: search_papers("RAG 2024 top papers")
Observation: [返回了 15 篇论文的列表]
Thought: 我看到了几篇高引用的论文。我需要查看它们的引用量和具体贡献来排序。
Action: get_citation_count(["论文A", "论文B", "论文C"])
Observation: [论文A: 450引用, 论文B: 320引用, 论文C: 280引用]
Thought: 现在我有了引用数据。但引用量不是唯一标准,我还需要了解每篇论文的具体贡献。
Action: summarize_paper("论文A"), summarize_paper("论文B"), summarize_paper("论文C")
Observation: [三篇论文的摘要]
Thought: 现在我有了足够的信息来回答用户的问题。
Answer: 2024 年 RAG 领域最重要的三篇论文是...
ReAct 范式的关键突破在于:它将推理和行动交织在一起,每次行动都基于前一步的推理结果,每次推理又基于最新的观察。这使得智能体能够动态调整策略、纠正错误方向、并在信息不足时主动寻求更多信息。
12.3 工具设计:不止于检索
Agentic RAG 的工具箱远远超越了简单的文档检索:
| 工具类别 | 示例 |
|---|---|
| 向量检索 | 语义搜索知识库 |
| 关键词检索 | BM25 精确匹配 |
| Web 搜索 | 实时信息获取 |
| 数据库查询 | 结构化数据查询 |
| 代码执行 | 计算和数据处理 |
| API 调用 | 获取外部服务数据 |
| 文档操作 | 读取、总结、比较文档 |
| 知识图谱 | 实体查询和关系遍历 |
智能体根据任务需要选择和使用这些工具。例如,当查询需要实时数据时,智能体可能绕过内部知识库直接搜索 Web;当查询需要计算时,智能体会生成并执行代码。
12.4 多智能体 RAG
更复杂的场景中,单个智能体不够,需要多智能体协作。
典型的多智能体 RAG 架构:
- 检索员(Retriever Agent):专门负责从不同数据源检索信息,精于构造检索查询和筛选结果
- 验证员(Verifier Agent):检查检索结果与查询的相关性和准确性,标记低质量或矛盾的信息
- 合成员(Synthesizer Agent):将多个信息片段综合为连贯、准确的回答,处理信息冲突
- 路由员(Router Agent):分析查询意图,将任务分发给合适的专业智能体
- 批判员(Critic Agent):审查生成结果的事实准确性、逻辑一致性和完整性,必要时触发重新检索
这种分工类似于人类团队的合作方式——每个人专注于自己的强项,相互校验,共同产出高质量的结果。多智能体架构的代价是更高的延迟和成本(每次内部协调都可能产生 LLM 调用),但能处理单智能体难以应对的复杂、多面任务。
12.5 记忆与状态管理
Agentic RAG 系统需要维护跨回合的记忆和状态。
短期记忆:当前对话的历史记录,传统上通过将对话历史追加到 prompt 中实现。随着上下文窗口增长,可直接在上下文中维护数十轮的对话。
长期记忆:跨会话的知识积累。可能包括:
- 用户偏好和画像(经常关心的主题、偏好的回答风格等)
- 检索经验(哪些数据源对哪些类型的查询效果好)
- 演化知识(从对话中提取并持久化的新事实)
工作记忆:当前任务的状态追踪,包括已完成的子任务、待执行的步骤、中间结果等。
记忆系统让 Agentic RAG 能够从经验中学习,逐步优化自身行为。MemGPT(后更名为 Letta)和 Mem0 等项目专门探索了这一方向,将 LLM 的上下文管理模拟为操作系统的虚拟内存管理——频繁使用的信息保持在"主存"(上下文窗口),不常用的信息被"换出"到外部存储,需要时再"换入"。
12.6 代表性框架
LangGraph:LangChain 团队推出的有状态多智能体框架。它将 RAG 流水线表示为有向图(DAG),每个节点是一个处理步骤(检索、判断、生成、校验),边表示控制流。LangGraph 的精妙之处在于它允许循环边——这意味着流程可以从生成阶段"回退"到检索阶段(如果判断信息不足),实现迭代式的自我纠正。
CrewAI:基于角色的多智能体框架,每个智能体有明确的角色定义、目标和可用的工具集。多个智能体按预定顺序协作完成任务。CrewAI 的优势在于其直观的角色抽象和易于上手的 API,适合快速搭建原型。
AutoGen:Microsoft Research 发布的多智能体对话框架,支持灵活的智能体间通信模式,包括广播、定向发送和组播。AutoGen 2.0 进一步引入了图式智能体编排,支持更复杂的协作模式。
LlamaIndex Agent:内置了丰富的 RAG 相关工具和数据连接器,使智能体能无缝访问各种数据源。其 QueryPipeline 和 AgentRunner 抽象让开发者能灵活定义从简单到复杂的 RAG 工作流。
13. 多模态 RAG:跨越文本的边界
现实世界的知识不只有文本。图表、照片、示意图、视频中都蕴含着大量信息,而传统 RAG 系统对此视而不见。
13.1 多模态文档处理
现代文档(PDF、网页、PPT)通常混合了文本和图像。有效的多模态 RAG 需要同时处理两者。
处理流程:
- 解析文档,分离文本和图像
- 对文本进行传统的分块和嵌入
- 对图像使用多模态嵌入模型生成向量描述
- 为图像生成文本摘要(使用视觉模型如 GPT-4V),同时保留原始图像
- 检索时同时匹配文本和图像,返回混合结果
- 生成时在多模态 LLM 的上下文中同时呈现相关文本和图像
13.2 多模态嵌入模型
2024 年是视觉-语言嵌入模型爆发的一年:
CLIP 及改进版本(OpenAI,2021 初始发布):通过对比学习将图像和文本映射到同一向量空间。SigLIP(Google,2023)用 Sigmoid Loss 替代 Softmax 对比损失,在大批量训练中更稳定。CLIP 系列奠定了多模态嵌入的基础——它可以"看懂"图片并将其与相关文本匹配。
UniIR(Unified Instruction-guided Multimodal Retrieval):将多种检索任务(文搜图、图搜文、文搜文、图搜图)统一在一个框架下,通过指令微调实现。UniIR 的核心创新在于证明了单一的检索模型可以胜任所有跨模态检索任务,而不需要为每种任务-模态组合部署独立模型。
ColPali:基于 PaliGemma 视觉语言模型的创新方法,直接从 PDF 页面图像生成多模态嵌入,无需 OCR 或文本提取。它的关键洞察是——为什么要先 OCR 成文本再嵌入,而不是直接从页面视觉特征中学习嵌入?ColPali 证明了直接从视觉信号中学习到的表示在很多情况下优于"OCR→文本→嵌入"的级联流水线,后者每个阶段都有信息损失。
Jina CLIP v2:支持 89 种语言的文本-图像联合嵌入,进一步降低了多模态 RAG 的语言门槛。
13.3 多模态生成
检索到的多模态内容如何被模型理解?
多模态 LLM:GPT-4V、Gemini Pro Vision、Claude 3/4 Vision、LLaVA、Qwen-VL 等模型能同时处理文本和图像输入。在 RAG 场景中,检索到的图像作为多模态 LLM 的输入之一,与相关文本一起参与答案生成。
图像在生成中的角色:
- 直接证据:图表中的数据、照片中的实物
- 辅助理解:架构图、流程图帮助理解复杂概念
- 输出渲染:生成包含图片引用的富文本回答
13.4 ColPali 与视觉原生检索
ColPali(2024.07)是多模态 RAG 的一个重要里程碑。它完全绕过了传统 PDF 处理的 OCR 和布局分析流水线,直接从 PDF 页面的视觉特征生成嵌入向量。
传统流水线的问题在于级联误差——PDF 解析(尤其是复杂布局)的准确率远非 100%,文本提取的误差会传播到嵌入和检索环节。ColPali 的端到端方案消除了这些中间步骤,尤其适合处理复杂表格、多栏布局和图文混排的文档。
其技术实现基于视觉语言模型 PaliGemma,将每个 PDF 页面渲染为图像,然后使用视觉 Transformer 编码器提取视觉特征。这些特征经过晚交互聚合后生成多向量表示,用于高效的近似检索。
实验表明,ColPali 在 ViDoRe 基准(视觉文档检索)上大幅超越了所有基于 OCR+文本嵌入的传统方法,尤其在表格数据提取和复杂布局理解的子任务上优势明显。
14. Self-RAG 与 CRAG:让模型学会反思
传统 RAG 系统的最大弱点之一是:它无条件地信任检索结果。如果检索结果不相关、不完整甚至错误,系统照单全收,然后基于错误信息生成回答。
2024 年,Self-RAG 和 CRAG 等一系列工作开始为 RAG 注入"自我反思"的能力。
14.1 Self-RAG:反思式检索增强生成
Self-RAG(Self-Reflective Retrieval-Augmented Generation)由 Asai 等人于 2024 年提出。它的核心创新是在生成过程中插入"反思标记"(Reflection Tokens),让模型在每一步都能自我评估。
Self-RAG 训练模型输出三类特殊标记:
- Retrieve 标记:决定是否需要检索更多信息,以及检索是否已经足够
- IsRel 标记:判断检索到的每个文档段落是否与当前生成需求相关
- IsSup 标记:判断生成的内容是否得到检索文档的支持(相对于与文档矛盾或无关)
- IsUse 标记:判断检索到的信息对当前生成是否有用(综合相关性和信息增益)
Self-RAG 的工作流程:
- 模型按需决定是否需要检索(
Retrieve=Yes或Retrieve=No) - 如果需要,执行检索并获取文档
- 对每个文档进行相关性评估(
IsRel=Relevant/Irrelevant) - 选择相关文档进行生成
- 在生成过程中评估每个句子的支持度(
IsSup=Fully Supported/Partially Supported/No Support) - 如果发现信息不足或矛盾,返回步骤 1 重新检索
这种反思-行动循环赋予 RAG 系统一种"自知之明"——知道什么该说,什么不该说,什么时候需要寻找更多信息。
14.2 CRAG:纠正性检索增强生成
CRAG(Corrective Retrieval-Augmented Generation)关注另一个关键问题:检索质量的不稳定性。
CRAG 引入了一个"检索评估器"模块,对检索结果进行自动质量评估,并根据评估结果动态调整后续策略:
- 高置信(Confidence High):检索结果质量良好 → 直接使用
- 低置信(Confidence Low):检索结果质量欠佳 → 改用 Web 搜索等外部知识源
- 中等置信(Confidence Medium):检索结果部分可用 → 结合外部搜索进行知识融合
CRAG 的检索评估器基于检索到的文档在查询上的预测置信度来工作。它通过检查文档与查询的语义对齐程度、文档间的信息一致性、以及文档信息的完整度来打分。
关键创新在于它将检索质量评估与行动选择解耦——不是盲目接受也不是盲目拒绝检索结果,而是根据评估信号做出有层次的处理决策。
14.3 迭代自我纠正循环
Self-RAG 和 CRAG 的结合开启了"自我纠正循环"的范式:
while 信息不够充分:
检索 → 评估 → 如果不满意 → 改进检索策略 → 重新检索
生成 → 自评 → 如果发现问题 → 修正
这一范式的深远意义在于:RAG 不再是一次性的"检索-生成"通路,而是一个持续的、自我监控的、在必要时回溯和改进的过程。这更接近人类处理复杂问题时的思维方式。
15. 评估体系:如何衡量 RAG 质量
构建 RAG 系统容易,评估 RAG 系统困难。2024-2025 年是 RAG 评估方法快速成熟的时期。
15.1 三个评估维度
RAG 系统的评估需要同时关注三个维度:
检索质量:
- Recall@K:top-K 结果中包含相关文档的比例
- MRR(Mean Reciprocal Rank):第一个相关文档的平均排名的倒数
- NDCG(Normalized Discounted Cumulative Gain):考虑排名位置的相关性加权评估
- Hit Rate:至少有一个相关文档出现在 top-K 中的查询比例
生成质量:
- 忠实度(Faithfulness):生成内容是否基于检索到的文档而非编造
- 答案相关性(Answer Relevance):回答是否直接解决了用户的查询
- 信息完整性(Completeness):是否覆盖了检索文档中所有相关信息
端到端质量:
- 事实准确性:回答中的事实陈述是否真实准确
- 帮助度(Helpfulness):回答对用户实际需求的满足程度
- 延迟:从查询到回答的总时间
- 成本:每次查询的 token 消耗和计算成本
15.2 RAGAS:RAG 专用评估框架
RAGAS(RAG Assessment)是 2024 年最受欢迎的 RAG 评估开源框架。它不需要人工标注,而是使用 LLM 自动评估 RAG 输出的多个维度。
RAGAS 的核心评估指标:
上下文精确度(Context Precision):检索结果中相关内容的比例。通过 LLM 逐条判断文档是否对回答生成有贡献。
上下文召回率(Context Recall):答案所需的信息是否在检索结果中。通过 LLM 将参考答案分解为原子陈述,判断每条陈述是否可以由检索文档支持。
忠实度(Faithfulness):将生成的回答分解为原子声明,检查每条声明是否能从检索上下文中推断出来。不可从上下文中推断的声明被视为幻觉。
答案相关性(Answer Relevancy):通过 LLM 根据回答反向生成若干可能的问题,检查这些问题与原始问题的语义相似度。如果回答是相关的,反向生成的问题应该与原始问题高度相似。
综合流程:
生成回答 → 分解为原子声明 → 逐条与检索文档比对 → 计算忠实度
检索文档 → 判断每条是否被答案引用 → 计算上下文精确度
参考答案 → 分解为原子声明 → 逐条检查是否被检索文档覆盖 → 计算上下文召回率
15.3 基于 LLM 的自动评估
随着 LLM 能力的提升,使用 LLM 作为"裁判"来评估 RAG 输出成为主流方法。
LLM-Judge:使用更强大的 LLM(如 GPT-4、Claude)来评估另一个模型生成的 RAG 回答。通过精心设计的评分维度(事实性、完整性、帮助度等)和评分标准(1-5 分制),获得结构化的评估结果。
成对比较:对于两个 RAG 配置(A 和 B)对同一组问题的回答,使用 LLM 进行盲评比较,判断哪个更好。这种方法在模型评估中积累了大量经验,2024 年被引入 RAG 评估领域。
关键挑战:
- LLM-Judge 可能带有位置偏差(偏好第一个回答)、冗长偏差(偏好更长的回答)等系统性偏见
- 评估结果较大程度依赖于评分指令的设计
- 成本问题——使用 GPT-4 评估每个回答本身就是一笔不小的开销
15.4 评估基准的演进
学术基准:
- KILT(Knowledge Intensive Language Tasks):涵盖 5 个知识密集型任务的统一基准
- RGB(RAG Benchmark Generation):中文 RAG 基准
- MultiHop-RAG:多跳推理 RAG 基准
- CRUD-RAG:测试 Create、Read、Update、Delete 四类 RAG 操作的全面基准
2025 年基准趋势:
- 从"找答案"向"做任务"演进——不仅要回答事实性问题,还要完成分析、综合、决策等复杂操作
- 从单一知识源扩展至多源异构——同时测试对文档库、数据库、Web、API 的综合检索能力
- 从静态数据到动态演化——评估系统对知识更新和矛盾信息的处理能力
15.5 生产环境中的评估策略
生产环境中的评估需要纳入更多现实考量:
在线 vs 离线评估:
- 离线评估:使用固定的测试集,可重复、可比较,但无法完全反映真实用户行为
- 在线评估:收集真实用户查询和反馈,反映实际使用效果,但收集周期长、噪音大
用户反馈信号:
- 显式信号:点赞/点踩、用户评分、用户编辑
- 隐式信号:复制内容、停留时间、追问行为、点击引用来源
- 业务指标:任务完成率、用户留存率
A/B 测试:将不同 RAG 配置部署给不同的用户群,比较关键指标。这是最可靠的评估方式,但也最耗时和成本最高。
15.6 评估即优化:Feedback Loop
最先进的 RAG 系统将评估结果反馈回系统本身,形成持续的自我优化循环:
用户查询 → RAG 回答 → 用户反馈 → 评估分析 → 优化策略 → 改进的 RAG 系统
具体实现包括:
- 基于用户标注的检索排序微调(Learning to Rank)
- 基于错误案例的检索策略调整
- 基于频繁查询的文档和索引优化
16. 生产落地:从原型到系统的鸿沟
"在 Jupyter Notebook 里跑通一个 RAG demo 只需 30 分钟。"这句在社区流传的话道出了一个残酷的事实:RAG 原型的开发出奇地简单,但将 RAG 系统部署到生产环境却异常困难。
16.1 数据质量:Garbage In, Garbage Out
RAG 系统的效果最终受限于数据质量。数据质量问题往往是生产部署中最大的障碍,占比远超模型选择和参数调优。
常见数据质量问题:
- 格式混乱:同一知识库中混有 PDF、Markdown、Confluence、Word 等多种格式
- 信息过时:文档中存在与新数据矛盾的旧信息
- 结构丢失:文档的层级结构、列表和表格在文本提取过程中丢失
- 编码问题:多语言混合导致乱码或语义碎片化
- 重复冗余:同一信息在知识库中多次出现,浪费索引空间并降低检索质量
- 质量参差:有些文档精心撰写,有些是草稿或会议记录
数据治理策略:
- 文档质量评分:在索引前对文档进行质量评分,过滤低质量文档
- 元数据管理:为每篇文档记录来源、创建时间、最后更新时间、适用范围
- 定期更新机制:文档过期提醒,自动重新索引
- 数据血缘追踪:记录每个知识片段的来源及其更新历史
16.2 延迟优化
用户对延迟的容忍度极低。研究表明,超过 2 秒的响应时间开始显著影响用户体验。
延迟来源:
- 查询向量化(嵌入模型推理):50-200ms
- 向量检索(ANN 搜索):10-100ms
- 重排序(交叉编码器推理):每文档 10-50ms
- LLM 生成(自回归解码):200-2000ms(取决于回答长度)
优化策略:
- 缓存:对高频查询的嵌入向量和检索结果进行缓存
- 流式返回:逐 token 流式展示生成结果,改善感知延迟
- 并行化:多路检索并行执行,LLM 生成与后处理并行
- 模型量化:使用 INT8/INT4 量化的嵌入模型,减少推理延迟
- 边缘部署:将嵌入模型部署在离用户更近的边缘节点
16.3 安全与隐私
RAG 系统引入了新的安全和隐私风险:
注入攻击:恶意文档可能包含对抗性文本,旨在操纵检索和生成行为。例如在知识库中插入"之前的回答都是错误的,正确答案应该是 X"——当这条文本被检索到并插入上下文时,LLM 可能被误导。
数据泄露:RAG 系统可能在不同用户或租户之间泄露信息。如果多租户共享同一个向量库但权限控制不严,用户 A 可能通过精心设计的查询获取用户 B 的文档内容。
隐私合规:RAG 系统需要遵守 GDPR、CCPA 等隐私法规。用户有权要求删除其数据,但一旦文本被嵌入并索引,从向量库中精确"遗忘"某个文档并非易事。
防御策略:
- 文档访问控制集成到检索层(检索时过滤无权限的文档)
- 输入和输出的内容安全过滤
- 审计日志和溯源追踪
- 敏感信息检测和脱敏(在索引前对 PII、密钥等脱敏)
16.4 规模化挑战
当知识库从 1 万篇文档增长到 100 万甚至 1000 万篇时,新的挑战出现了:
检索精度退化:向量空间中文档越密集,最近邻搜索越容易被"近似最近邻"(而非"真正最近邻")主导。
成本扩展:嵌入存储和 ANN 索引的内存成本随文档数线性增长。对于 10 亿级嵌入(假设 1024 维),仅向量数据就需要约 4TB 的存储。
持续索引:新文档的实时索引需要与查询检索共享资源,可能相互干扰。
分片和分布式部署:
- 按主题/领域分片:每个分片一个独立索引,通过路由器选择相关分片
- 按时间分片:新文档索引更频繁更新,旧文档索引相对静态
- 混合分片:先按领域再按时间的二级分片
16.5 演化管理
RAG 系统是一个"活"的系统:文档在更新,模型在升级,用户需求在变化。
版本管理:
- 文档版本:记录每次文档更新的历史
- 索引版本:为每次索引重建打标签,支持快速回滚
- 模型版本:记录使用的嵌入模型和生成模型版本
- 配置版本:prompt 模板、检索参数等配置的版本管理
效果监控:
- 关键指标看板:延迟、召回率、用户满意度等实时监控
- 漂移检测:监控查询分布和文档分布的变化,检测数据漂移
- 告警机制:当关键指标出现异常时及时通知
17. 2024-2026 年前沿探索
17.1 Cache-Augmented Generation(CAG)
Chan 等人在 2024 年底提出了 CAG(Cache-Augmented Generation),对 RAG 的基本假设提出了挑战。
核心观点:既然现代 LLM 的上下文窗口已经达到 100K-1M token 级别,许多场景的知识库完全可以预先编码为 KV-cache(Key-Value Cache,Transformer 推理中缓存的键值对状态),在推理时直接加载,从而省去实时检索的步骤。
CAG 的工作方式:
- 将所有相关文档预先加载到 LLM 中,计算并缓存 KV-cache
- 当用户查询到来时,直接从缓存中获取文档的上下文表示
- 结合查询进行生成
优势是消除了检索延迟和检索失败的可能,缺点是不适用于超大规模文档库和频繁更新的场景。CAG 提醒我们:RAG 不是唯一的选择,技术的边界在不断变化。
17.2 Long-Context LLM 对 RAG 的重塑
2025 年,以 Gemini 2.5 Pro(100 万 token)为代表的长上下文模型,开始重塑 RAG 系统架构:
不是替代,而是增强:
- 更宽松的分块:不再需要将文档切分得那么细,可以用更大的块
- 更多上下文:可以将更多相关文档(甚至整个章节)注入上下文
- 更深入的分析:LLM 有更多空间进行多文档对比和综合
新架构模式:
- “大海捞针过时了,现在是大海捞信息”——长上下文不再只是找一句突兀的话,而是在大量相关但分布的信息中提取和综合
- 迭代式长上下文处理——先粗略扫描全部文档,确定重点区域,再深入处理重点区域的细节
17.3 实时 RAG
传统 RAG 的索引是离线批量更新的。但在金融、新闻等场景,延迟分钟级可能就不够用了。
实时 RAG 的关键技术:
- 流式文档接入:通过 Kafka/Pulsar 等消息队列接入实时文档流
- 增量索引:新文档到达后即时嵌入和插入向量索引,无需重建全量索引
- 事件驱动 RAG:将文档更新视为事件,触发相关的缓存失效和索引更新
17.4 个性化 RAG
2025 年的另一个热点是个性化 RAG——根据用户画像和偏好调整检索和生成行为。
实现层面:
- 用户角色感知的检索:根据用户的专业背景(医生 vs 患者)检索不同层次的文档
- 交互历史引导:基于用户过去的对话和反馈调整检索优先级
- 知识水平适配:对同一个问题,给专家和初学者的回答深度和风格不同
挑战:
- 隐私与个性化的平衡——要个性化就需要了解用户,但获取用户信息涉及隐私
- 冷启动问题——新用户没有足够的行为数据用于个性化
- 长期偏好与短期需求的冲突——用户可能长期关注领域 A,但当前查询是领域 B
17.5 从 RAG 到 Agentic Memory
最前沿的探索正在将 RAG 与 LLM 记忆系统深度融合。
Letta(原 MemGPT):将 LLM 的上下文管理模拟为操作系统的虚拟内存——上下文窗口是"主存",向量数据库是"外存"。LLM 通过函数调用自主管理内存,将重要信息从对话中提取并持久化存储,在需要时检索回上下文窗口。
Mem0:专门为 AI 应用设计的内存层,自动从用户交互中提取记忆——用户偏好、重要事实、上下文信息——并以结构化的方式存储和检索。
知识演化图谱:将 RAG 中的文档关系、用户交互模式和知识更新轨迹建模为时间感知的知识图谱,使系统能理解知识的演化过程——什么知识在什么时间有效,哪些知识之间存在版本关系。
18. 未来展望与开放问题
尽管 RAG 技术在过去几年取得了令人瞩目的进展,但仍有许多根本性挑战未被解决。
18.1 未解决的开放问题
深层次语义理解:当前的密集检索仍主要基于表层语义相似度,缺乏对逻辑蕴含、因果关系的深层理解。例如,"导致 GDP 下降的因素"和"经济萎缩的原因"是语义相关的,但当前模型对"GDP 下降"和"经济萎缩"之间因果关系的理解仍然有限。
复杂推理的检索:对于需要多步推理、数学计算、逻辑推导的查询,单靠检索相关文档远远不够。如何将检索与结构化推理(Chain-of-Thought、Tree-of-Thoughts、Program-of-Thoughts)深度结合,是一个活跃的研究方向。
知识冲突的解决:
- 检索文档与模型参数知识冲突:模型应该相信谁?
- 多篇检索文档之间的冲突:如何判断哪个来源更可信?
- 新旧知识的冲突:旧文档和新文档矛盾,如何选择?
当前的方法(如基于来源可信度加权、基于时间的衰减、让 LLM 自行判断)都有明显局限。一个根本性的解决方案可能需要模型具备更明确的"认知不确定性估计"能力——不仅知道一个事实,还知道这个事实的置信度。
多语言和多文化 RAG:大多数 RAG 研究和工具以英语为中心。非英语语言的嵌入模型质量、文档解析工具、评估基准都落后于英语。文化背景差异——同一个问题在不同文化中可能意味着不同的东西——更是一个被严重忽视的维度。
数据版权与 RAG:RAG 系统检索并在回答中复述文档内容,引发了版权问题。RAG 引用的是"事实"还是"表达"?"事实不受版权保护"是普遍原则,但 LLM 生成的回答往往在引用事实的同时也复制了部分表达。这个领域的法律先例几乎为零。
18.2 技术趋势预测
端到端可微分 RAG:当前的 RAG 系统将检索和生成作为两个分离的模块(通常是两个独立模型)。未来的方向之一是让检索和生成作为一个统一的端到端可训练系统——检索器理解生成器的需求,生成器知道哪些信息可以通过检索外部化。
自动化 RAG 优化:AutoRAG 和 DSPy 等框架开始自动搜索最优的 RAG 配置(分块策略、检索算法、prompt 模板等)。随着 AI 工程化(AI Engineering)的成熟,RAG 系统将越来越"自动调优",减少对人工经验的依赖。
边缘 RAG:将 RAG 部署到个人设备(手机、PC)。这要求嵌入模型和生成模型都能在消费级硬件上运行。Apple Intelligence 和微软 Copilot+ PC 的概念已经预示了本地化 RAG 的未来——个人知识库驻留在用户设备上,隐私得到保护,延迟降到最低。
RAG for Code:软件开发场景是最适合 RAG 的垂直领域之一。代码库就是天然的结构化知识库,代码检索需要同时理解语义(“处理用户登录”)和精确符号(函数名、类名)。GitHub Copilot 的代码库感知能力和 Cursor 的代码库索引已经在实践这一方向。
实时多模态 RAG:结合摄像头、麦克风等传感器,让 AI 实时"看到"和"听到"环境,结合知识库进行实时分析。这在 AR 辅助、现场维修指导、医疗手术辅助等场景有广泛应用前景。
18.3 构建 RAG 系统的十条原则
基于目前的最佳实践和研究,以下是构建生产级 RAG 系统的十条指导原则:
- 从数据开始,而非从模型开始。花 80% 的精力在数据清洗、结构化和管理上。
- 分块策略需要实验验证。没有放之四海皆准的分块大小。基于你的文档类型和查询模式进行系统实验。
- 混合检索是标配,不是可选项。BM25 + 密集检索融合几乎总是优于单独使用任何一方。
- 始终使用重排序。跨编码器或 LLM-based 重排序是对检索质量最高性价比的投资。
- 让 RAG 能说"我不知道"。提示模型在信息不足时明确表示不确定性,而不是自由发挥。
- 监控和评估从一开始就嵌入系统。你不能优化无法测量的东西。
- 缓存所有可缓存的内容。嵌入向量、检索结果、LLM 回答——缓存能显著降低成本并改善延迟。
- 增量迭代,避免大爆炸重构。从一个简单的 Naive RAG 开始,逐步根据评估结果添加优化。
- 考虑用户体验。引用来源、流式输出、内容格式化——这些"外围工程"直接影响用户信任。
- 安全始于设计。文档权限控制、注入攻击防御、数据脱敏——在架构层面考虑而非事后修补。
19. 总结
从 2020 年 Lewis 等人的一篇开创性论文,到 2026 年遍布各行各业的成熟基础设施,RAG 技术走过了令人瞩目的演进之路。
回顾这条演进路径,我们可以提炼出几条贯穿始终的主线:
从静态到动态:RAG 从离线批处理的固定流水线,走向在线实时、智能体自主决策的动态系统。
从简单到复杂:Naive RAG 的单轮检索-生成,演变为多轮迭代、多跳推理、多智能体协作的复杂工作流。
从文本到多模态:知识不再局限于纯文本,图表、图片、视频中的信息正在被纳入 RAG 的视野。
从无意识到有意识:Self-RAG、CRAG 等反思机制让 RAG 系统具备了"自知之明"——知道什么信息是可靠的,什么需要验证,什么时候应该承认不知道。
从通用到个性化:从千人一面的通用回答,走向因人而异、因场景而异的个性化知识服务。
但 RAG 远未到达终点。幻觉问题依然存在,复杂推理仍是挑战,多语言支持还需加强,安全隐私问题亟待解决,版权边界尚不清晰。
RAG 的本质是什么?我认为,它不仅仅是"给 LLM 装上一个检索器"这种技术拼接。RAG 代表了一种更根本的智能范式:将知识(Knowledge)与智能(Intelligence)解耦。智能体(人或者 AI)不需要在自己的"大脑"中存储所有知识,而是保有获取知识、筛选知识、运用知识的能力。
这种范式不仅在技术上是优雅的(模块化、可扩展、可更新),在认知上也是深刻的——它反映了人类智慧的运行方式。我们不记忆所有的百科全书条目,但我们知道去哪里查找、如何判断信息的可信度、如何将分散的信息综合为连贯的回答。
在这个意义上,RAG 不仅仅是一项 AI 工程技术。它是对"何为智能"这一古老问题的当代回答。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)