RAG

LLM的局限性

  • 知识库有截至时间
  • 大模型没有外部的私有数据
  • 会出现幻觉

核心思路

  1. 先从外部知识库中检索(Retrieval) 出和用户问题相关的资料
  2. 把检索到的资料作为增强(Augmented) 上下文,和用户的问题一起给到大模型
  3. 大模型基于这些真实的资料来生成(Generation) 回答

两大阶段: 索引阶段(离线)和查询阶段(在线)

索引阶段

  1. 文档加载:将各种格式的文档转化为纯文本
  2. 文档切割(Chunking)(分块): 不同的分块策略
  3. 向量化(嵌入:Embedding):将分好块的文本块转化为一个向量表示
  4. 存入向量数据库

查询阶段

  1. 输入向量化
  2. 相似度检索(+重排序)
  3. 构造增强prompt
  4. LLM生成回答

上面为最基础的RAG流程,也成为Naive RAG

微调和RAG区别是什么?

微调(Fine_tuning):针对的是训练,针对下游任务进行

分为:

  • 全量微调
  • 参数高效微调:如LoRA
  • 指令微调:用(指令+回答)格式数据的微调

RAG的Chunking策略

策略一:固定大小切割:

容易破坏语义->引入重叠(但是不能解决问题)

策略二:递归字符切割

这是目前最常用的切割策略,也是 LangChain 框架中 RecursiveCharacterTextSplitter 的实现方式。

核心思想:按照文本的自然边界切割 维护一个分隔符的优先级列表,进行递归切割,如果使用a字符切割块太大,就使用下一个优先级的字符在块内切割,递归进行

策略三:基于文档结构的切割

比如MD文件,使用标题层级 比如代码文件.根据函数,类 HTML,根据标签

策略四:语义切割

基于内容的语义相似度进行切割

核心思想是:把语义相似的句子放在一起,语义发生转折的地方就是切割点。

实现方法: 先把文档按句子切分,然后计算相邻句子之间的语义相似度(用 Embedding 模型把句子转成向量,然后计算余弦相似度)。如果相邻句子的相似度很高,说明它们在讨论同一个话题,应该放在同一个块里;如果相似度突然下降,说明话题发生了转变,这里就是一个切割点

优点:切割质量最高 缺点:计算成本最高

策略五:Agent驱动的智能切割

先用上述方法生成初始的文本块,然后用 LLM 来审视每个块,判断这个块的内容是否完整、是否需要和相邻的块合并或拆分。LLM 充当一个「智能编辑」的角色,根据对内容的理解来做出切割决策

不缺钱的可以这么玩,效果理论上最好

Re-rank

问题:向量检索只检索语义相似度,缺乏对于整体的理解

Bi-Encoder(双编码器).是RAG的Embedding模型,方法: 将查询和文档编码为向量并计算余弦相似度

Bi-Encoder的两个缺陷: 1.信息压缩损失 2.缺乏查询意图感知

Cross -Encoder:

Re-rank使用的是Cross-Encoder(交叉编码器) 去Bi-coder的根本区别在于:它把查询和文档拼在一起,让模型同时看到两者,进行深度的交互分析

Cross-Encoder把查询和文档拼成如下格式的输出:

1
[CLS] 用户的问题 [SEP] 检索到的文档内容 [SEP]
缺陷:

太慢了,需要将查询和候选文档拼在一起做一次计算

实际应用

两阶段检索 第一阶段:Bi-Encoder快速召回候选文档,追求速度和召回率 第二阶段:Cross-Encoder做精细化重排序

主流的Re-rank模型(自己看)

目前市面上的 Re-rank 模型选择还挺多的,我聊聊几个主流的。

Cohere Rerank 是目前用得最多的商业方案之一,它是一个 SaaS API 服务,效果好、接入简单,基本上几行代码就能用起来。如果你的项目预算充足,不想自己部署模型,Cohere 是最省心的选择。

如果你更倾向开源方案,BGE-Reranker 是目前开源模型里的标杆,由智源研究院出品,有 base 和 large 两个版本。它在中文场景下表现特别好,而且可以本地部署,数据安全有保障。很多国内企业在生产环境中用的就是它。

ms-marco-MiniLM 是微软基于 MiniLM 训练的一个轻量级 Cross-Encoder,模型体积很小,推理速度快,适合资源有限的场景。比如你的服务器 GPU 不多,或者对延迟要求很高,这个模型就很合适。

另外还有 Jina Reranker,Jina AI 出品的,支持多语言,如果你有英文之外的检索需求可以关注一下;以及 bce-reranker,网易有道开源的双语重排序模型,中英文混合场景下效果不错。

实际效果

在复杂效果中提升效果巨大,准确率上升幻觉降低

Embedding

将文字转化为计算机能够理解的文字,也就是向量 而在高维空间中,语义相近的文本在向量空间中的距离也相近

第一代:静态词向量

Word2Vec:两种训练方式

  • CBOW
  • Skip-gram

第二代:上下文嵌入时代

BERT: 自注意力机制,双向上下文理解

预训练方式:MLM和NSP

第三代:融合和优化时代

BGE-M3 是 2023 年发布的一个里程碑模型,它的「M3」代表三个多:

  • Multi-Granularity(多粒度):能处理句子、段落、篇章、文档等不同粒度的输入,最大支持 8192 tokens。
  • Multi-Functionality(多功能):一站式集成稠密检索、稀疏检索和多向量检索三种能力,一次推理就能得到三种输出。
  • Multi-Language(多语言):支持 100 多种语言

第四代:基于大模型的Embedding

大模型有远超传统编码器模型的语义理解能力,如果能把这种能力迁移到 Embedding 生成上,

怎么选 Embedding 模型?

面对这么多选择,实际项目中怎么选?给几个实用的建议:

  1. 看榜单:参考 MTEB 排行榜,这是目前最权威的 Embedding 模型评测榜单。
  2. 中文场景优先选国产模型:BGE 系列、M3E 系列、ACGE 系列在中文场景下表现通常优于 OpenAI 的模型。
  3. 关注上下文窗口:如果你的文档很长(比如法律合同、学术论文),一定要选支持长上下文的模型(如 BGE-M3 的 8192 tokens)。
  4. 考虑部署方式:如果对数据安全有要求,需要私有化部署,就选开源模型(BGE、M3E);如果追求简单省事,就用 API 服务。

向量数据库

使用特殊的索引结构,能够在海量向量中实现毫秒级的近似最近邻搜索(ANN)

核心原理

用空间换时间,通过提前建立索引结构,让检索时不需要遍历所有向量 目前最主流的三种

最常见的HNSW

给所有向量建立了一个多层导航图,几次跳级就可以定位到目标,查询速度快(ms),且召回率高

IVF

核心思想:先分区域再搜索 将所有向量先按照相似度聚合成若干个桶,查询先判断在哪几个桶,再在这几个桶里面查询 好处:内存效率高,适合超大规模数据,会损失一点召回率

PQ: 核心:压缩存储 把每个向量切成几段,每段嘴一个简化版的表示 适合内存优先的场景下特别使用

主流向量数据库对比

先说 Milvus。这个应该是目前开源向量数据库里最有名的一个了,由 Zilliz 公司开发维护,GitHub 上有 2 万多 Star。它最大的优势就是「能扛」,支持十亿级甚至百亿级的向量规模,索引类型也很丰富,HNSW、IVF、PQ 都支持,还有 GPU 加速选项。如果你的项目是那种企业级的、数据量特别大的场景,Milvus 基本上是首选。它的生态也很完善,Python、Java、Go 的 SDK 都有。但说实话,Milvus 的部署和维护有一定门槛,通常需要 Kubernetes 来编排,如果你团队没有 DevOps 经验,上手会有点吃力。

然后是 Pinecone。如果你不想折腾基础设施,Pinecone 可能是最省心的选择。它是一个全托管的 SaaS 服务,你不需要自己部署任何东西,注册个账号、几行代码就能开始用。自动扩缩容、零运维,对开发团队特别友好。但它的缺点也很明显:一是付费的,而且费用不算便宜;二是数据存在第三方服务器上,如果你的数据有合规要求(比如不能出境),就不太合适了。

再来说 Weaviate。这个是我个人比较喜欢的一个,因为它原生支持混合检索,也就是向量检索和 BM25 关键词检索可以一起做,不用你自己去拼接两套系统。它还内置了多种 Embedding 模型的集成,可以直接在 Weaviate 内部完成文本到向量的转换,省了一个步骤。如果你要做混合检索的 RAG 系统,Weaviate 是开箱即用的,体验很好。不过在大规模数据场景下,它的性能会比 Milvus 弱一些,适合中小规模的应用。

Chroma 则是另外一个极端。它主打的就是「轻量」和「简单」,Python 原生支持,装个 pip 包就能用,API 设计得非常简洁。如果你是在做原型验证、个人项目、或者教学演示,Chroma 是最方便的。但它的功能和性能都比较有限,不支持分布式,也没有安全机制(没有加密、没有权限控制),所以不太适合用在生产环境里。

最后是 Qdrant。这个是后起之秀,用 Rust 语言写的,所以单机性能非常强。在 2025 年的一些基准测试中,Qdrant 的 QPS 和延迟表现都是同类产品里最好的。它也支持丰富的过滤条件和混合检索。如果你的场景对响应速度有很高要求,或者想自建但不想用那么重的 Milvus,Qdrant 是一个很好的折中选择。不过它的分布式方案相对来说还比较新,如果你需要多节点的集群部署,可能需要多测试一下稳定性。

多路召回

向量检索只关注语义相似度,在精确匹配方面存在弊端

核心思想

将多种召回方式的结果合并 常见的召回通道有

1.向量检索(Dense Retrieval)

语义相似度,主力通道

2.关键词检索

BM25,基于词频和文档频率

3.知识图谱检索

关键:融合 多路召回的结果需要合并去重,并按照相关性排序 融合的方法

1.RRF(倒数排名融合,Reciprocal Rank Fusion) 核心思想:不看每个文档的绝对分数,只看他在各路召回中的排名

混合检索的具体实现

目前 RAG 实践中,向量检索 + BM25 关键词检索的混合检索已经成为标配方案。

  1. 用户提问后,同时发起两路检索:
    • 向量检索:把问题转成向量,在向量数据库中搜索 Top-K 个相似文档
    • BM25 检索:把问题分词后,在倒排索引中搜索 Top-K 个相关文档
  2. 用 RRF 算法合并两路结果,得到综合排序
  3. (可选)对合并后的结果做 Re-rank 精排
  4. 取最终 Top-N 个文档送入大模型

除了向量查询和关键词查询之外的其他的高级召回策略:

  • 查询改写(Query Rewriting):在检索之前,先用 LLM 把用户的原始问题改写成更适合检索的形式。比如用户问「你们公司加班多吗」,可以改写成「公司加班制度」「加班时间规定」「加班补贴政策」等多个查询,分别检索后再合并结果。
  • HyDE(Hypothetical Document Embedding):先让 LLM 根据用户问题生成一个「假设性的答案文档」,然后用这个假设文档的向量去检索。因为假设文档在表述上更接近真实的答案文档,所以检索效果通常更好。
  • 多查询扩展(Multi-Query):把用户的一个问题,用 LLM 改写成多个不同角度的子问题,分别检索后合并结果。

量化RAG的效果

分为两步部分进行,检索质量和生成质量

检索质量的评估指标

召回率(Recall@K):找全了没有?

在检索返回的 Top-K 个结果中,有多少真正相关的文档被找到了。比如知识库中有 10 个和问题相关的文档,检索返回了 5 个,那召回率就是 50%。召回率关注的是「有没有遗漏」,找得全不全。

精确率(Precision@K):找对了没有?

在检索返回的 Top-K 个结果中,有多少是真正相关的。比如检索返回了 10 个文档,其中 6 个是相关的,那精确率就是 60%。精确率关注的是「有没有乱凑」,找得准不准。

这两个是一对好搭档,一个关注「全」,一个关注「准」,通常需要平衡着看。除了这两个,还有一个更综合的指标叫 NDCG,它不仅看你找得全不全、准不准,还看「排得对不对」,也就是高度相关的文档是不是排在了前面,部分相关的文档是不是排在了后面。NDCG 是信息检索领域最常用的综合评估指标。

此外,还有一些辅助指标,比如 MRR 关注的是「第一个相关文档排在了第几位」,MAP 关注的是「所有相关文档的整体排序质量」。了解一下就行,核心记住 Recall、Precision 和 NDCG 这三个就够了。

生成质量的评估指标

需要判断回答是否准确,是否相关,是否忠实于检索到的文档

Faithfulness(忠实度)

最重要的指标,衡量LLM生成的回答是否忠实于检索到的文档,有没有编造检索文档中不存在的信息

RAGAS 框架(后面会介绍)的评估方式是:先把生成的回答拆分成一个个独立的陈述,然后检查每个陈述是否能从检索到的文档中找到支撑。如果有 10 个陈述,8 个能找到支撑,2 个是编造的,那忠实度就是 0.8。

Answer Relevance(答案相关性)

Context Relevance(上下文相关性)

RAGAS:RAG评估的事实标准

目前RAG评估领域最流行的开源框架 核心思路:利用一个更强大的LLM作为裁判,来自动化评估RAG系统的输出质量 你只需要提供测试数据集(包含问题、标准答案、检索到的文档、模型生成的回答) RAGAS就能自动计算上面提到的指标

RAGAS 的使用方式也很简单。你准备一个包含 question(问题)、contexts(检索到的文档)、answer(模型生成的回答)、ground_truth(标准答案)的数据集,然后调用 RAGAS 的 evaluate 函数就行了。

除了 RAGAS,还有一些其他的 RAG 评估工具:

  • DeepEval:把 RAG 评估融入单元测试框架,适合工程化团队
  • TruLens:提供 RAG 应用的深度可观测性和诊断能力
  • ARES:用 LLM 生成合成评估数据,解决人工标注数据不足的问题

幻觉(Hallucination)

大模型自行编造的内容 幻觉不等于错误,而是不知道而假装指导

幻觉的类型

事实性幻觉(Factuality Hallucination)

生成的内容与客观事实不符 又分为两类:内在幻觉和外在幻觉 内在幻觉:与上下文信息矛盾 外在幻觉:生成内容无法从输入上下文和任何已知知识中验证,是凭空捏造的

幻觉的产生的原因

数据层面

训练数据包含错误信息,偏见或过时的知识

训练层面

LLM追求生成[看起来合理]的内容而非[事实上正确]的内容

推理层面

提示词诱导幻觉:比如提示词包含错误信息

RAG是怎么降低幻觉的

  • 注入真实知识
  • 注意力机制偏向
  • 可追溯可验证

但是不能消除幻觉

除了RAG还有哪些可以降低幻觉的方法?

  1. prompt engineering
  2. 输出验证(独立校验)
  3. 领域微调(SFT[有监督微调]和RLHF[人类反馈强化学习])
  4. 不确定性量化
  5. GraphRAG和lightRAG