RAG 的工程深度:切分、检索、排序、评估与幻觉防护
RAG 不只是给大模型挂个知识库——文档切分策略、Embedding 演进、向量数据库选型、多路召回与 RRF 融合、Re-rank 精排、RAG 效果量化评估、幻觉成因与分层防护,从朴素 RAG 到工程落地的完整知识体系。
- RAG 要解决什么问题
- RAG 的完整工作流程
- 微调与 RAG 的选择
- 文档切割策略
- Re-rank:检索结果的精排
- Embedding 算法的演进
- 向量数据库选型
- 多路召回与混合检索
- RAG 效果的量化评估
- 大模型幻觉与分层防护
- 核心
- 评价
原文:字节面试官:"RAG 不就是给大模型挂个知识库?",我:"文档切分、向量检索、多路召回、Re-rank、RAG 评估、幻觉抑制……"
大模型落地企业场景时,三个困境反复出现:知识有截止日期、不知道私有数据、会自信地编造内容。RAG 作为当前最主流的解法,很多人对它的理解停留在“检索加生成”六个字,但真正搭建一套可用的 RAG 系统远不止于此——文档怎么切、向量怎么选、召回怎么融合、结果怎么排序、效果怎么量化、幻觉怎么压,每一步都有学问。
RAG 要解决什么问题
大模型的三重困境——知识截止、私有数据盲区、幻觉——本质上是同一个问题:模型只能依赖训练时“记住”的知识来回答,而这些知识可能过时、缺失、甚至错误。RAG(Retrieval-Augmented Generation,检索增强生成)的核心思路是把大模型从“闭卷考试”变成“开卷考试”:先从外部知识库检索出相关资料,再把这些资料和用户问题一起喂给模型,让模型基于真实文档来生成回答。
这样做带来三个直接好处:知识可以随时更新(换文档就行)、私有数据可以用了(灌进知识库)、幻觉大幅减少(有据可依)。但 RAG 不是万能的——它不能改变模型本身的推理能力和输出风格,也不能保证 100% 准确,更合适的定位是“一种让大模型基于真实、可更新知识来回答问题的技术方案”,和微调、Prompt 工程互补而非替代。
RAG 的完整工作流程
一个 RAG 系统分为两大阶段:索引阶段(离线)和查询阶段(在线)。
索引阶段:文档加载(把 PDF/Word/HTML 等各种格式统一转成纯文本)→ 文档切割(把长文档切成几百到几千字符的文本块)→ 向量化(用 Embedding 模型把文本块转成高维向量)→ 存入向量数据库。这一步是“考试前整理参考书”。
查询阶段:用户提问 → 问题向量化(用同一个 Embedding 模型)→ 向量检索(在向量数据库中找 Top-K 相似文本块)→ 构造增强 Prompt(把检索结果和问题拼在一起)→ 大模型生成回答。这一步是“考试时翻书找答案”。
这个最基础的流程叫 Naive RAG(朴素 RAG),实际生产中还会加入查询改写、多路召回、重排序等高级技术。
微调与 RAG 的选择
微调是让模型“内化知识”,相当于送员工去上课,知识刻进脑子里,考试靠记忆回答;RAG 是给模型“配参考书架”,考试时可以翻书,参考书还能随时换新。
关键差异在不同维度上:知识更新方面,微调要重新训练,成本高周期长,RAG 只需更新文档重新索引,几乎实时;准确性方面,微调靠记忆可能记错,RAG 基于真实文档可追溯可验证;风格控制方面,微调更灵活,RAG 主要靠 Prompt 工程,力度有限;成本结构方面,微调初始成本高推理成本低,RAG 初始成本低但每次查询有检索开销和更多 token 消耗。
大多数场景优先选 RAG,尤其是要求回答严格基于特定文档、知识更新频繁、涉及大量私有数据、需要可追溯出处的场景。但实际生产中最成熟的做法是微调 + RAG 结合——先微调让模型适应领域和风格,再用 RAG 提供实时知识支撑。
文档切割策略
文档切割(Chunking)是索引阶段最关键的一步,切得好不好直接决定检索质量。核心矛盾是:切得太小会丢失上下文,切得太大会降低检索精度、浪费上下文窗口。
固定大小切割:按固定字符数或 token 数切,简单但粗暴,容易把句子从中间切断。通常引入重叠(overlap)来缓解,相邻块之间有一段重复内容。
递归字符切割:最常用的策略,LangChain 的 RecursiveCharacterTextSplitter 就是这个实现。按分隔符优先级列表(段落 → 换行 → 句号 → 逗号 → 空格)逐级尝试切分,尽量保持文本的自然完整性。
基于文档结构的切割:利用文档本身的格式结构来分块——Markdown 按标题层级、代码按函数/类、HTML 按标签。语义完整性好,但要求文档格式规范。
语义切割:把文档按句子切分,计算相邻句子的语义相似度(用 Embedding 向量的余弦相似度),相似度突然下降的地方就是话题转折点,作为切割点。质量最高但计算成本也最大。
Agent 驱动的智能切割:用 LLM 审视每个初始文本块,判断内容是否完整、是否需要合并或拆分。理论效果最好,成本也最高。
实战建议:起步用递归字符切割(256-512 tokens,10%-20% 重叠),优化阶段切换到基于文档结构的切割,进阶阶段尝试语义切割或“父子块”策略(小块精准检索,大块提供上下文)。
Re-rank:检索结果的精排
RAG 检索的两阶段——粗排和精排——本质上是两种编码器架构的分工:Bi-Encoder 负责粗排(快而粗),Cross-Encoder 负责精排(慢而准)。理解这对核心矛盾,就理解了为什么要做 Re-rank 以及为什么不能一步到位。
Bi-Encoder:粗排的代价
向量检索用的是 Bi-Encoder(双编码器),查询和文档分别独立编码成向量,再计算两个向量的相似度。它的核心优势是快——文档向量在索引阶段就预计算好了,检索时只需算一次查询向量,毫秒级完成百万级文档的扫描。
但两个先天缺陷决定了它只能做粗排:
- 信息压缩损失:几百字的文本压成一个固定维度的向量,细节和多层次语义必然被”平均”掉。比如一篇文档同时讲了 RAG 的索引流程和 Re-rank 的原理,压成一个向量后变成两者的”重心”,问索引的细节和问 Re-rank 的细节都匹配不够精准——单向量无法同时代表文档的多个语义面。
- 缺乏查询意图感知:文档向量在索引阶段就固定了,不管用户问”iPhone 15 续航怎么样”还是”iPhone 15 拍照好不好”,检索到的都是同一组文档向量——Bi-Encoder 无法根据问题动态调整对文档的关注点。
Cross-Encoder:精排的精度
Re-rank 改用 Cross-Encoder(交叉编码器),把查询和文档拼接在一起送进 Transformer,通过自注意力机制让两者逐词交互。打个比方:Bi-Encoder 是”各自写简历再匹配”,Cross-Encoder 是”面对面面试”——面试官可以针对每个回答追问,信息交互深度完全不在一个量级,精度大幅提升。
代价是慢:Cross-Encoder 要对每个候选文档做一次完整的前向推理,无法预计算。百万级文档全量跑 Cross-Encoder 根本不可行,但在 Top-50/100 的候选集上做精排完全可接受。
两阶段协作:粗排筛候选,精排定排序
所以实际方案是两阶段串联:
- 粗排:Bi-Encoder 快速从全量文档中筛出 Top-50/100 候选——“先把可能的找出来”
- 精排:Cross-Encoder 对候选集做精细排序,输出 Top-5/10——“再把最好的排到前面”
这不是权衡取舍,而是分工协作:粗排解决”大海捞针”的规模问题,精排解决”好中选优”的精度问题。缺了粗排,精排扛不住海量数据;缺了精排,粗排的召回质量又不够用。
主流 Re-rank 模型
Cohere Rerank(商业 SaaS,接入简单)、BGE-Reranker(智源开源,中文场景标杆)、ms-marco-MiniLM(微软轻量级模型,推理快)、Jina Reranker(多语言)、bce-reranker(网易有道,中英混合)。
效果与实战建议
复杂查询场景准确率提升可达 40%-50%,简单事实查询约 18%,模糊查询约 30%-40%。Databricks 测试还表明,Re-rank 能让大模型幻觉率降低约 35%。
实战配置建议:先检索 50-100 候选再重排到 Top-5/10;简单查询可以按条件触发,不必每次都跑 Re-rank。
Embedding 算法的演进
Embedding 的核心思想是把文本转成高维向量,让语义相近的文本在向量空间中距离也相近。这个领域经历了四代演进。
第一代:静态词向量(2013 年)。Word2Vec 是奠基之作,核心假说“上下文相似的词语义也相似”。它的关键缺陷是每个词只有一个固定向量,无法处理多义词——“苹果”无论指水果还是公司,向量相同。同期还有 GloVe 和 FastText 等模型。
第二代:上下文嵌入(2018 年)。BERT 实现了同一词在不同语境下生成不同向量,解决了多义词问题。通过 MLM(Masked Language Model,遮盖语言模型)和 NSP(Next Sentence Prediction,下一句预测)两种预训练方式学习上下文。局限在于上下文窗口只有 512 tokens,且并非为检索任务专门设计。
第三代:融合与优化(2023 年至今)。代表性模型 BGE-M3,“M3”代表三个多:Multi-Granularity(多粒度,最大 8192 tokens)、Multi-Functionality(多功能,集成稠密检索/稀疏检索/多向量检索三种能力)、Multi-Language(多语言,支持 100+ 语言)。OpenAI 的 text-embedding 系列也广泛使用,text-embedding-3-large 维度达 3072。
第四代:基于大模型的 Embedding(2025 年)。LLM2Vec、Qwen3-Embedding、Seed1.5-Embedding 等尝试用 LLM 的语义理解能力来生成 Embedding。字节跳动的 Seed1.5-Embedding 在 MTEB 榜单上达到中英文 SOTA。
选型建议:看 MTEB 排行榜;中文场景优先国产模型(BGE、M3E);长文档关注上下文窗口;数据安全要求高的选可私有部署的开源模型。
向量数据库选型
向量数据库的核心价值是在海量向量中实现毫秒级近似最近邻搜索(ANN,Approximate Nearest Neighbor)。三种主流索引思路:HNSW(多层导航图,查询极快召回率高,是大多数向量数据库的默认选择)、IVF(先聚类分桶再桶内搜索,内存效率高但损失一些召回率)、PQ(Product Quantization,乘积量化,压缩存储省内存,通常和 IVF 结合使用)。
五个主流向量数据库的定位差异:Milvus 适合大规模企业级应用,支持十亿级向量,但部署维护需要 K8s 经验;Pinecone 是全托管 SaaS,零运维最省心,但付费且数据存第三方;Weaviate 原生支持混合检索(向量 + BM25),开箱即用,但大规模性能弱于 Milvus;Chroma 极轻量,pip 装完即用,适合原型验证和个人项目,不支持分布式也没有安全机制;Qdrant 用 Rust 写的,单机性能强,QPS 和延迟表现优秀,是 Milvus 和 Pinecone 之间的折中选择。
另外值得关注的趋势是传统数据库的向量扩展——pgvector(PostgreSQL)和 Elasticsearch 的向量搜索功能,对已有 PG/ES 基础设施的团队来说是运维成本最低的方案。
多路召回与混合检索
单一向量检索擅长语义匹配但不擅长精确匹配——搜“iPhone 15 Pro Max 256GB”可能把“iPhone 14 Pro Max 512GB”也召回来,搜产品编号“PRD-2024-089”则可能完全匹配不上,因为编号没有语义可言。
多路召回的核心思想是“多走几条路,各有侧重,最后合并”。最常见的组合是向量检索(Dense Retrieval,擅长语义匹配)+ BM25 关键词检索(Sparse Retrieval,擅长精确匹配),有条件还可以加知识图谱检索(擅长实体关系推理)。
融合算法用得最多的是 RRF(Reciprocal Rank Fusion,倒数排名融合)——不看每个文档的绝对分数,只看排名,排名越靠前分越高,被越多路召回命中的文档综合得分也越高。类似综艺节目评委打分,去掉绝对分数差异只看排名。
向量检索 + BM25 的混合检索已成为 RAG 实践标配,效果通常比单路检索好 10%-30%,尤其是需要精确关键词匹配的场景。主流框架均已支持:LangChain 的 EnsembleRetriever、LlamaIndex 的 QueryFusionRetriever、Weaviate 的混合搜索。
进阶策略还包括:查询改写(用 LLM 把用户问题改写成更适合检索的形式)、HyDE(先让 LLM 生成假设性答案文档,再用它去检索)、多查询扩展(把一个问题改写成多个子问题分别检索再合并)。
RAG 效果的量化评估
不能量化的优化都是“凭感觉”。RAG 的评估比普通 LLM 更复杂,因为它由检索器和生成器两个组件组成,必须分别评估才能定位问题——就像餐厅菜不好吃,得分别看食材采购质量和厨师烹饪水平。
检索质量指标:Recall@K(找全了没有)、Precision@K(找对了没有)、NDCG(排得对不对——高度相关的文档是否排在前面)。NDCG 是信息检索领域最常用的综合指标。
生成质量指标:Faithfulness(忠实度,回答是否忠实于检索文档,有无编造)、Answer Relevance(答案相关性,是否真正回答了用户问题)、Context Relevance(上下文相关性,检索到的文档是否和问题相关)。
RAGAS 是目前最流行的 RAG 评估开源框架,用更强的 LLM(如 GPT-4)当“裁判”自动评估。输入 question、contexts、answer、ground_truth 四个字段,自动计算各项指标。同类工具还有 DeepEval(融入单元测试框架)、TruLens(深度可观测性)、ARES(用 LLM 生成合成评估数据解决标注不足)。
评估最佳实践:先建基线再做优化;测试数据要覆盖简单查询、复杂推理、多跳问题、模糊问题等多种类型;定期评估持续监控;把评估自动化融入 CI/CD。
大模型幻觉与分层防护
幻觉是模型自信地说出听起来专业但实际编造的内容。它不等于“错误”——模型说“我不知道”不是幻觉,不知道却假装知道、用流畅自信的语言编造错误信息才是。
幻觉分两类:事实性幻觉(生成内容与客观事实不符,又分内在幻觉——与输入上下文矛盾,和外在幻觉——无法从任何已知来源验证)和忠实性幻觉(RAG 场景中更常见,模型拿到了正确文档但生成时偏离了文档内容)。
幻觉的成因贯穿模型全生命周期:数据层面(训练数据含错误或过时信息,“垃圾进垃圾出”)、训练层面(训练目标是预测下一个 token 而非确保事实正确,评估机制鼓励“蒙答案”而非“承认不知道”)、推理层面(用户提示包含错误前提时模型倾向顺从编造而非纠正)。
RAG 降低幻觉的机制:注入真实知识(把参数记忆替换为真实文档,事实性幻觉降低 20%-40%)、注意力机制偏向(Prompt 中包含检索文档时,约 70%-80% 的注意力集中在检索片段)、可追溯可验证(可定位到具体文档来源)。但 RAG 不能完全消除幻觉——检索到错误文档、模型曲解文档内容、越界推断都可能引发幻觉。
五层防护策略,按成本和复杂度递增排列:
Prompt 工程约束:零成本立即生效。限制知识范围(只能基于给定资料回答)、要求标注来源、鼓励承认不确定(OpenAI 2025 年论文指出这是降低幻觉非常有效的手段)、结构化推理(先列事实再推理,减少“脱口而出”)。
RAG 检索增强:中等成本,提供事实依据,是准确知识场景的标配。
输出验证:额外延迟和成本,高风险场景不可或缺。方法包括用另一个模型交叉验证(LLM-as-Judge)、用规则引擎验证关键数据、基于一致性的多次采样验证。
领域微调:用高质量领域数据做 SFT 或 RLHF。RLHF 的关键改进是把奖励机制从“蒙对得分、不答零分”改为“蒙错扣分、不答零分”,引导模型在不确定时说“我不知道”。
不确定性量化(Uncertainty Quantification):让模型对每个输出给出置信度分数,低于阈值时触发人工审核或拒答。技术路线包括基于 token 概率的方法、基于多次采样一致性的方法、基于模型内部状态的方法(需白盒访问)。
此外,GraphRAG 和 LightRAG 用知识图谱增强检索,在需要全局理解和多跳推理的场景中能进一步降低幻觉,是 2025 年的新方向。
企业落地建议按风险等级分层管控:高风险场景(医疗/法律/金融)必须 RAG + 人工审核 + 免责声明 + 输出验证;中风险场景(客服/内容生产/代码辅助)Prompt 约束 + RAG + 输出验证 + 置信度阈值;低风险场景(头脑风暴/草稿起草)基础 Prompt 优化即可。
核心
RAG 是把大模型从“闭卷考试”变成“开卷考试”的工程方案,但它自身的工程深度远超“检索 + 生成”六个字。整个系统中,每个环节都有明确的技术选型空间和精度-成本权衡:文档切割要在上下文完整性和检索精度之间找平衡;Embedding 的选择决定了语义表达的天花板;向量数据库的索引结构(HNSW/IVF/PQ)决定了检索速度和召回率的折中;多路召回用 RRF 融合弥补单路检索的盲区;Re-rank 用 Cross-Encoder 的深度交互补救 Bi-Encoder 的信息压缩损失;效果评估必须拆开检索和生成分别量化才能定位瓶颈;幻觉防护本质是多层次的系统工程,Prompt 约束是最低成本的防线,RAG 提供事实锚点,输出验证做最后兜底,三者缺一不可。
评价
原文作为 RAG 知识体系的扫盲文章完成度很高,十大问题覆盖了从概念到工程落地的主要环节,每个问题都用了生活化的类比来降低理解门槛,对面试准备和快速建立知识框架有实际价值。
不足之处也很明显。第一,各环节之间的关联分析不够——文档切分策略如何影响 Embedding 质量、Embedding 选择如何决定 Re-rank 的收益空间、多路召回的各路权重如何根据场景动态调整,这些跨环节的联动关系几乎是空白。第二,工程落地的坑谈得太少——生产环境中文档更新的增量索引策略、多用户并发下的向量数据库性能调优、检索延迟的 P99 指标控制、知识库质量对 RAG 效果的决定性影响(“垃圾进垃圾出”这个前提比什么算法都重要),这些才是真正决定项目成败的因素。第三,对 Naive RAG 之外的高级架构(Modular RAG、Agentic RAG、GraphRAG)只是一笔带过,而这些正是 2024-2025 年 RAG 领域最重要的演进方向,也是面试中越来越常被追问的部分。第四,幻觉部分虽然方法列举全面,但对“RAG 自身也可能引入幻觉”这一反直觉现象的讨论不够深入——检索到但不相关的文档可能比没有文档更危险,这是 RAG 系统设计中的关键 traps。