搞懂 RAG 检索召回全链路:从文档切分到阈值匹配 很多开发者第一次做 RAG上来就纠结用哪个向量模型结果系统效果怎么调都不行。其实 RAG 的命门不在生成而在检索——能不能把正确的段落找出来决定了一切。这篇文章不写代码、不堆公式用类比和图把整条链路讲透文档切分 → 向量化 → 索引 → 检索召回 → 阈值匹配 → 重排 → 生成。读完你能建立一张完整的认知地图知道每个环节在干嘛、为什么这么干、踩坑点在哪。适合人群有开发经验、想系统理解 RAG 原理的工程师。一、先搞清楚RAG 到底在解决什么问题一句话——让大模型开卷考试。大模型有两个硬伤知识有截止日期训练完之后的事不知道也不知道你公司的内部资料。RAGRetrieval-Augmented Generation检索增强生成的思路朴素得不能再朴素用户提问 → 先去文档库里把相关的几段找出来 → 连同问题一起塞给大模型 → 大模型基于这些段落作答。类比一下就懂了不用 RAG 让学生闭卷考试全凭脑子记记不全就瞎编这就是幻觉的来源。用 RAG 让学生开卷考试先把相关章节翻出来照着答。所以 RAG 的核心不是生成而是**“检索”**。检索召回这一步做不好后面的生成再强也是垃圾进垃圾出。二、整条链路的全景图RAG 分两个阶段先记住这张图一个关键认知两个阶段用的必须是同一个 embedding 模型。因为你是用同一种语言把文本变成坐标才能比较问题与段落的距离。就像查字典——建库用中文字典查的时候也得用同一本否则对不上。下面逐块拆。最容易踩坑的四块——切分、检索、阈值、提升效果——是本文重点。三、文档切分被 90% 新手低估的地基很多人一上来就纠结向量模型其实切分质量对效果的影响往往比模型还大。地基没打好上面全白搭。为什么要切两个原因大模型有输入长度限制整本手册塞不进去整章作为一个检索单元召回时九成是无关内容会干扰模型。所以要把长文档切成一段段小块chunk每块几百字。切多大是个权衡块太大块太小召回夹带大量无关内容干扰模型语义被切碎完整意思跨在两块里存储省、检索快块数爆炸、检索慢、重复召回阈值判断不准信息冗余经验值英文 256~512 token中文 300~800 字。没有标准答案要按文档类型调。类比切肉——太大不入味太小吃不出肉味。重叠Overlap防止切断语义按每 500 字切一刀、不重叠骑在边界上的句子会被劈成两半。解决办法是块与块之间留一段重叠比如每块 500 字、下一块从第 400 字开始重叠 100 字边界内容就有冗余保护。文档: AAAAAA BBBBBB CCCCCC DDDDDD EEEEEE 不重叠(块长3): [AAA][BBB][CCC][DDD][EEE] ← 边界易断 重叠(块长3,重叠1): [AAA][ABB][BBC][CCC]... ← 边界有冗余保护经验值重叠设为块大小的 10%~20%。切分策略的演进固定长度切最简单但可能劈断句子。按分隔符切按段落、句号切保证句子完整。递归切分先按章节标题切太大就按段落再大就按句号层层降级。LangChain 默认做法推荐起步用。按结构切Markdown 按#标题、代码按函数、HTML 按标签切能保留章节归属信息。语义切分用模型判断语义连贯度在语义跳跃处切。最智能但最慢最贵。别忘了元数据切的时候顺手给每块打标签来源文件、章节、页码、时间、类别、权限。检索时可以先按元数据过滤再算相似度“只在 2024 年合同里找”精准度大幅提升。口诀块要语义完整 大小适中 带重叠 带元数据。四、检索召回原理RAG 的心脏分四步向量化 → 相似度 → 加速索引 → 两种流派。4.1 向量化Embedding把文字变成坐标计算机不懂苹果只懂数字。Embedding 模型把任意文本翻译成一串浮点数768 或 1536 个如何退货 → [0.12, -0.45, 0.88, ..., 0.03] 退款流程 → [0.10, -0.41, 0.85, ..., 0.05] 今天天气 → [-0.77, 0.20, -0.11, ..., -0.60]精妙之处意思相近的文字坐标离得近意思无关的离得远。如何退货和退款流程坐标接近今天天气离得老远。Embedding 本质是给语义建了一张地图。两个要点维度数字个数常见 768/1024/1536越高表达越强但越贵方向比绝对位置重要下面相似度会用到。4.2 怎么算像不像相似度计算三种主流算法记住结论就行方法直觉RAG 里余弦相似度Cosine比两个向量朝向夹角✅最常用首选点积Dot Product既看方向又看长度偶尔用需先归一化欧氏距离L2两点直线距离较少用为什么余弦最常用因为它只看方向不看长度。文本向量长度受字数影响你不想让一段很长的段落仅因为长就显得更像所以只比方向更公平。余弦分数范围 -1~1文本场景实际多为 0~1接近 1 高度相似接近 0 几乎无关。关键认知相似度 0.8 不是有绝对意义的标量它是在当前这个 embedding 模型下的相对分数。换模型同样的文本分数会变。所以阈值不能抄别人的得用自己的数据和模型测出来。4.3 找得快靠什么近似最近邻ANN索引朴素做法是把问题和全库每个段落两两算一遍——一百万条数据每次提问都算扛不住。所以向量数据库用索引结构加速核心思想是用速度换一点精度快速找到基本最相似的这叫近似最近邻搜索ANN。几种主流索引知道名字和特点就够索引类型特点适合HNSW图结构查询快、召回准吃内存最主流百万级以下首选IVF先聚类分桶只在相关桶里找数据量大、要求快PQ乘积量化压缩向量省内存海量数据、内存吃紧Flat暴力不建索引两两比数据极小几千条100%准确实际产品Milvus、Qdrant、pgvector、Faiss常组合使用如 IVFPQ。学习者记住默认选 HNSW 就行。还有个ef_search/nprobe旋钮本质都是查得越细越准但越慢是调优杠杆。4.4 最重要的认知稠密 vs 稀疏两大流派这是新手最容易忽略、却最关键的一点。稠密检索Dense 向量检索懂语义。问退货能召回写着退款流程的段落。但对专有名词、编号、人名不敏感——搜ISO-9001 认证或张三的合同可能一脸懵因为这些是符号没语义可言。稀疏检索Sparse 关键词检索经典算法 BM25精确匹配强。“ISO-9001“张三一把就中。但不懂语义问退货”、文档写退款流程”一个字对不上就召不回。稠密向量稀疏BM25擅长语义、同义词、泛化精确词、专有名词、编号短板符号、罕见词同义改写、跨语言类比听懂意思的助手按字面找的助手最高心法好的 RAG 系统几乎都用混合检索——两路都跑结果合并。只要文档里有专有名词、编号、人名就必须上混合检索纯向量必翻车。4.5 召回 vs 排序别混了召回Retrieve从库里捞候选追求别漏掉该有的宁可多捞。排序Ranking对候选重排追求把最该靠前的排前面。工业系统通常召回求全、排序求精分两步。后面讲的重排就是干排序的。五、阈值与匹配度分数到底什么意思这块踩坑的人最多。把概念彻底拆开。分数的本质RAG 里看到的相似度 0.78或匹配度 85%来源是向量检索给的是余弦相似度0~1BM25 给的是没有固定上下界的分数可能 0.5 也可能 30产品为了好看会归一化成 0~100%。所以匹配度 85%离开具体模型和归一化方式没有绝对意义。它的真正含义是在这批召回结果里相对排得靠前。阈值Threshold砍掉不相关的Top-K 里可能混进分数排进前 K、但其实不相关的段落阈值就是用一条线把它们砍掉避免模型被带偏。比如 Top-5 分数[0.86, 0.82, 0.79, 0.55, 0.41]阈值设 0.7就只把前三条喂模型。阈值怎么定这是经验活没有万能值。那些说设 0.7的教程是误导。正确做法准备一批真实测试问答50~200 个带应召回段落标注跑一遍检索记录每个问题的召回段落和分数看分数分布相关的落哪个区间不相关的落哪选一个尽量留住相关、尽量砍掉不相关的分界线没有标准答案持续观察持续调。新手误区照抄 0.7一上来设太高结果啥都召不回完全不设阈值让模型胡说。Top-K 怎么选K 太小K 太大可能漏掉正确段落、召回率低噪声多、模型被干扰、占 token 费钱起步值 K 3~5。简单问题小 K复杂问题需综合多处信息可放大到 10但配合重排筛掉。召回太多 vs 太少太少总得到没找到阈值调低、K 调大、检查切分是不是太碎、检查 embedding 模型是不是太弱、上混合检索。太多但都不准模型被带偏阈值调高、K 调小、上重排、检查切分是不是太大。小结分数是相对的阈值要用自己的数据测Top-K 起步 3~5永远配一个兜底。六、提升效果从能用到好用按性价比从高到低排。6.1 混合检索性价比第一稠密 稀疏两路都跑结果合并。合并不是简单求和量纲不同要用加权或归一化RRFReciprocal Rank Fusion不看分数只看排名在两路里都靠前的段落得分高。简单粗暴有效起步首选。加权融合两路分数各自归一化到 0~1按权重相加如向量 0.7 关键词 0.3。权重靠测试调。6.2 重排 Rerank性价比第二召回阶段为了快用的是 embedding双塔模型问题和段落各自编码再比相似度快但粗。重排用的是交叉编码器Cross-Encoder把问题和段落拼在一起喂给模型细看两者关系给更准的分数。召回embedding 快、粗、能处理百万候选 → 捞 Top-50 重排cross-encoder慢、精、只能处理几十条 → 精排出 Top-5经典的漏斗结构召回求全重排求精。重排几乎是生产系统标配。代价是慢所以只对召回的 Top-N如 50重排不能全库重排。6.3 查询改写性价比第三用户提问往往口语、模糊、太短直接检索效果差。常见优化查询扩展让大模型把退货扩写成退货 退款 售后 运费再检索。HyDE假设性文档先让大模型猜一个答案段落拿这个猜测去检索答案像答案比问题像答案更易命中。多查询Multi-Query把一个问题改写成 3~5 个不同角度的问法各检索一遍合并。子问题分解复杂问题拆成几个子问题分别检索。核心思想别拿用户那句粗糙原文去检索先打磨一下。6.4 评估指标被 90% 新手忽略的关键不评估就是瞎调。准备一个评测集几十到几百个真实问题标注正确答案来自哪些段落跑这些指标指标通俗解释关注点RecallK正确段落有没有进 Top-K召回阶段核心指标越高越好MRR正确段落排第几排越前分越高看排序质量NDCG排得准不准重要的排更前得分更高更严格的排序指标精确率KTop-K 里有多少相关看噪声多少起步盯死 RecallK如 Recall5让该出现的段落尽量进 Top-K这个上去了重排才有意义。先建评测集再谈调优没有评测集的调参都是玄学。6.5 其他实用技巧上下文扩展召回某块后把它前后相邻块也带上。元数据过滤先按来源/时间/类别过滤再向量检索。父子块小块做精准召回召回后替换成所属大块喂模型兼得精度与完整度。去重混合检索多路结果会重复记得合并。定期重建索引文档更新后 embedding 也要更新。七、一张总图串起所有概念┌─────────── 用户提问 ───────────┐ │ │ ▼ │ [查询改写/扩展] ← 提升效果 │ │ │ ▼ │ [问题向量化] │ (同 embedding 模型) │ │ │ ┌───────────┴───────────┐ │ ▼ ▼ │ 稠密检索(向量) 稀疏检索(BM25) ← 两大流派 (HNSW 索引加速) (倒排索引) ← 索引 │ │ │ └───────────┬───────────┘ │ ▼ │ [混合融合 RRF] ← 混合检索 │ │ │ ▼ │ Top-50 候选 │ │ │ ▼ │ [重排 Cross-Encoder] ← 重排 │ │ │ ▼ │ Top-5 阈值过滤 ← 阈值 │ │ │ ▼ │ [拼 Prompt 喂大模型] │ │ │ ▼ │ 最终回答 │ 离线侧建库 文档 → 切分(带重叠元数据) → 向量化 → 存向量库 ← 切分是地基 持续用评测集(RecallK)量化效果迭代调参 ← 评估是基石八、推荐的学习路线按这个顺序推进每一步看得见效果再进下一步别贪多第一步1 天用 LangChain / LlamaIndex 跑通最简 RAG固定切分 向量检索 Top-3 直接喂模型目的是建立体感。第二步2~3 天换成递归切分 重叠 元数据体会切分的影响。第三步2 天建小评测集20~50 个问题算 Recall5。从这一刻起告别瞎调。第四步3~5 天上混合检索向量 BM25 RRF对比 Recall 提升。第五步2~3 天上重排模型对比 MRR 和最终回答质量。第六步查询改写、阈值精调、上下文扩展按业务痛点逐个加。每一步都用评测集量化前后对比——这是成长最快的路径。名词速查表术语一句话解释RAG检索增强生成先查文档再回答Chunk文档切成的小块Embedding把文本变成一串数字向量向量那串数字代表文本在语义地图上的坐标余弦相似度比较两个向量方向夹角0~1越大越像HNSW最主流的向量索引快且准ANN近似最近邻搜索用速度换一点精度稠密检索向量检索懂语义稀疏检索 / BM25关键词检索精确匹配混合检索 (Hybrid)稠密 稀疏两路合并RRF一种合并多路检索结果的算法按排名融合Rerank / Cross-Encoder重排模型对少量候选精排Top-K取相似度最高的 K 条阈值 (Threshold)砍掉分数过低的不相关结果RecallK正确段落有没有进 Top-K核心评估指标MRR正确段落的平均排名质量Query Rewriting查询改写/扩展先打磨用户问题再检索评测集带标准答案的测试问题集调优的基石写在最后RAG 这件事难的不是某一个算法而是整条链路的每个环节都做到及格。木桶效应在 RAG 上体现得淋漓尽致切分没做好向量模型再贵也白搭检索没召回重排再强也是无米之炊没有评测集所有调参都是凭感觉。记住三个最容易翻车的点切分是地基、混合检索是刚需、评估集是前提。把这三件事先做扎实你已经超过大多数跑通 demo 就以为搞懂 RAG的人了。

本周精选

本月热点