RAG
LLM的局限性
- 知识库有截至时间
- 大模型没有外部的私有数据
- 会出现幻觉
核心思路
- 先从外部知识库中检索(Retrieval) 出和用户问题相关的资料
- 把检索到的资料作为增强(Augmented) 上下文,和用户的问题一起给到大模型
- 大模型基于这些真实的资料来生成(Generation) 回答
两大阶段: 索引阶段(离线)和查询阶段(在线)
索引阶段
- 文档加载:将各种格式的文档转化为纯文本
- 文档切割(Chunking)(分块): 不同的分块策略
- 向量化(嵌入:Embedding):将分好块的文本块转化为一个向量表示
- 存入向量数据库
查询阶段
- 输入向量化
- 相似度检索(+重排序)
- 构造增强prompt
- 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把查询和文档拼成如下格式的输出:
| |
缺陷:
太慢了,需要将查询和候选文档拼在一起做一次计算
实际应用
两阶段检索 第一阶段: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 模型?
面对这么多选择,实际项目中怎么选?给几个实用的建议:
- 看榜单:参考 MTEB 排行榜,这是目前最权威的 Embedding 模型评测榜单。
- 中文场景优先选国产模型:BGE 系列、M3E 系列、ACGE 系列在中文场景下表现通常优于 OpenAI 的模型。
- 关注上下文窗口:如果你的文档很长(比如法律合同、学术论文),一定要选支持长上下文的模型(如 BGE-M3 的 8192 tokens)。
- 考虑部署方式:如果对数据安全有要求,需要私有化部署,就选开源模型(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 关键词检索的混合检索已经成为标配方案。
- 用户提问后,同时发起两路检索:
- 向量检索:把问题转成向量,在向量数据库中搜索 Top-K 个相似文档
- BM25 检索:把问题分词后,在倒排索引中搜索 Top-K 个相关文档
- 用 RRF 算法合并两路结果,得到综合排序
- (可选)对合并后的结果做 Re-rank 精排
- 取最终 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还有哪些可以降低幻觉的方法?
- prompt engineering
- 输出验证(独立校验)
- 领域微调(SFT[有监督微调]和RLHF[人类反馈强化学习])
- 不确定性量化
- GraphRAG和lightRAG