# RAG效果不好怎么调?6张图讲透相似度·意图识别·召回排序·ReRank·混合检索(附代码)

发布时间:2026/7/23 21:43:27
# RAG效果不好怎么调?6张图讲透相似度·意图识别·召回排序·ReRank·混合检索(附代码) 本文是「108张AI知识卡片·大模型通关手册」系列第 6 篇。上一篇把 RAG 核心链路切→嵌→存→检→答从 0 串通了但跑通和好用之间隔着一条鸿沟——检索不准、排序不对、相似度选错、意图没识别……这篇专门讲调优6 个旋钮每个都能让你的 RAG 效果提一个档次。每张卡都配了能动手感受的方式看完你就知道自己的 RAG 该拧哪个旋钮。目录TL;DR 太长不看一、相似度计算选错尺子检索结果差30%二、意图识别用户说的话≠用户想要的东西三、召回第一道关卡宁多勿漏四、ReRank重排序召回只是粗筛精排才定胜负五、排序不止ReRank排序的完整逻辑链路六、混合检索关键词语义双剑合璧七、一张图串起RAG调优链路八、代码加上ReRank和混合检索的RAG写到最后系列导航 持续更新TL;DR 太长不看⚡30 秒版先记这 7 条细节往下翻。相似度计算余弦看方向、欧氏看距离、点积看方向长度——选错尺子Top-K 排序直接变脸。意图识别用户说退货可能是问政策、问流程、问时效——先分桶再检索精准度翻倍。召回第一道关卡宽宽地捞宁多勿漏K 太小漏答案、K 太大炸噪声。ReRank召回只是粗筛交叉编码器把问题和文档拼在一起打分精排才定胜负。排序不止 ReRank还叠加新鲜度、权威性、交互特征——“像不像之外还要看该不该”。混合检索关键词擅长精确匹配、语义擅长同义匹配双剑合璧互补短板。调优口诀意图识别精准分流 → 相似度夯实底座 → 召回宽捞 → 排序精筛 → ReRank 定榜 → 混合检索兜底。一、相似度计算选错尺子检索结果差30%同样的向量、同样的 Top-K换个相似度公式检索结果能差 30%。你以为是 Embedding 模型的锅其实是你选错了尺子。相似度计算解决的核心问题是两个向量像不像用什么数学标准来量三把尺子摆在你面前——余弦相似度看方向、欧氏距离看直线距离、点积方向长度。选哪把直接决定 Top-K 里谁排第一。它到底在干嘛机制层三种公式的数学本质不同。余弦相似度只看两个向量夹角的 cos 值不管向量多长归一化后范围 [−1, 1]语义检索最常用——它回答方向像不像。欧氏距离算两个点之间的直线距离对向量长度敏感长度差异大的向量即使方向一致也可能排得远——它回答位置近不近。点积 余弦 × 模长兼顾方向和大小某些场景下比纯余弦好——它回答方向像不像且力道够不够。你能感受到什么体感层归一化后的向量余弦和点积等价。但没归一化时点积会让长向量信息量大的长文档天然得分高——有时这是你想要的长文档更全面有时不是一条短但精准的答案被压下去。欧氏距离则对向量模长极其敏感两个方向完全一致但长度不同的向量欧氏距离可能很远余弦却判定一模一样。公式算什么对长度敏感典型场景余弦相似度夹角 cos否归一化后语义检索默认选择欧氏距离直线距离是聚类、空间分布分析点积cos × 模长是向量已归一化时等价余弦未归一化时偏好长向量️ 动手感受同一批向量换3把尺子操作同一批文档向量 同一个查询分别用余弦/欧氏/点积算 Top-5看排序差异。你会看到余弦短文档和长文档公平竞争纯看意思像不像。点积长文档排名集体上升——因为它力道大。欧氏距离向量模长差异大的文档排名剧烈抖动。变化说明了什么不是模型不准是你选的尺子不对——换一把结果就变了脸。 想一想如果余弦相似度最通用为什么有些框架默认用点积什么场景下点积反而比余弦好提示当你希望信息量大的文档天然排前面时点积的偏心反而是优势。 顺着他想相似度只管像不像不管对不对——两段意思相近但事实矛盾的文档相似度都很高。那相关性和正确性之间的鸿沟靠什么填二、意图识别用户说的话≠用户想要的东西你问 RAG退货它给你捞了 5 段退货条款——可你其实想问的是退货流程怎么走。检索没毛病是你没告诉它你到底想问什么。意图识别解决的核心问题用户说的话和用户想要的东西经常不是一回事。它把用户输入分到不同的意图桶里每个桶对应不同的检索策略——问政策走关键词精确匹配问流程走语义向量检索闲聊直接 LLM 生成不检索。它到底在干嘛机制层意图识别本质上是个分类器把用户输入映射到预定义的意图类别。常见做法分三档关键词规则匹配退货政策命中政策关键词→走政策桶简单粗暴但覆盖不全、小模型分类BERT 微调准确率高但要标注数据、大模型零样本分类直接让 LLM 判断意图零标注但延迟高。分类结果决定后续检索策略——FAQ 类走关键词精确匹配、知识类走语义向量检索、闲聊类直接生成不检索、多跳推理类需要拆子问题分步检索。你能感受到什么体感层同一个退货退货政策是什么→检索政策文档怎么申请退货→检索流程文档退货要多久→检索时效文档。不分类三段全召回模型被信息淹没回答又长又乱。分了类每类只召回最精准的 3-5 条回答干净利落。️ 动手感受开/关意图识别对比操作输入同一个模糊问题如退货开/关意图识别看检索结果和最终回答的区别。你会看到不开意图识别检索出政策、流程、时效三类文档混在一起回答东一榔头西一棒。开了意图识别系统先判断你问的是流程只检索流程文档回答精准。变化说明了什么同样的问题、同样的向量库“先分桶再检索比一股脑全搜精准得多——意图识别是检索的导航仪”。 想一想如果用户的问题横跨两个意图呢“退货政策和退货流程有什么区别”——这种混合意图分类器怎么处理强制选一个桶会丢信息选两个桶又可能召回太多。多意图场景是意图识别的天花板。 顺着他想意图识别做错了比不做更糟——把怎么申请退货误判为退货政策检索方向全错比不分桶全搜还惨。那什么时候该信任分类器、什么时候该兜底这引出了置信度阈值的概念。三、召回第一道关卡宁多勿漏RAG 检索不准80% 的人第一反应是换 Embedding 模型——但真正的锅可能在召回策略。Top-K 设 5 和设 50结果天差地别。召回解决的核心问题从海量文档里宽宽地捞一批候选宁多勿漏。它不追求精准追求的是别把答案漏掉——精准是排序环节的事。它到底在干嘛机制层召回策略决定捞多少、怎么捞。向量召回ANN 近似最近邻是主流按相似度取 Top-K。K 太小→漏答案正确文档排在第 8 位你只取 Top-5 就丢了K 太大→噪声多、排序压力大取 Top-200其中 190 条是噪音排序模型要在垃圾堆里找金子。实际生产中 K 通常设 20-100再交给排序环节精筛。更进阶的做法是多路召回向量召回 关键词召回 知识图谱召回三路互补每路捞一批合并后交给排序——单路漏掉的另一路补上。你能感受到什么体感层问退货政策K5 可能只召回 3 条相关政策另外 2 条是噪音K50 能召回全部 8 条相关政策但也混进 42 条无关的。排序环节要从 50 条里挑出那 8 条——比从 5 条里猜要靠谱得多。这就是宽捞的哲学宁可多捞再筛不要漏了再也找不到。️ 动手感受K5 vs K20 vs K50操作同一个问题K 分别设 5/20/50看召回的命中率和噪音率变化。你会看到K5命中 3 条政策但漏了 5 条——回答不完整。K20命中 7 条政策噪音 13 条——排序能筛掉大部分噪音。K50命中全部 8 条政策但噪音 42 条——排序压力骤增可能被噪音干扰。变化说明了什么K 不是越大越好存在一个甜蜜区间——命中够全、噪音可控。这个区间要靠你的数据实测没有万能值。 想一想K 越大越好那为什么不直接 K10000K 增大的代价不只是排序压力——每多召回一条排序模型的推理成本就多一份延迟也多一截。在不漏和不慢之间你的业务能容忍多少延迟 顺着他想多路召回听起来完美但三路结果怎么合并向量召回的 Top-5 和关键词召回的 Top-5 重叠了怎么办这引出了融合Fusion的概念——倒排融合RRF是其中最经典的方案。四、ReRank重排序召回只是粗筛精排才定胜负召回捞了 50 条相似度最高的那条真的是最相关的吗不一定——双塔式 Embedding 各自算向量再比距离问题和文档从没见过彼此。ReRank 就是让它们面对面聊一次。ReRank 解决的核心问题双塔式检索只看了各自的长相没看彼此的交互。交叉编码器把问题和文档拼在一起过一遍模型直接打相关性分——精度碾压但速度慢所以只能用在召回后的小范围精排。它到底在干嘛机制层双塔模型Bi-Encoder是 Embedding 检索的标配——问题和文档各自编码成向量再算相似度。优点是快向量可以预计算缺点是问题和文档之间没有任何交互苹果在问题里指水果还是手机文档端完全不知道。交叉编码器Cross-Encoder把[CLS] 问题 [SEP] 文档 [SEP]拼成一条序列喂进 Transformer 做完整注意力直接输出一个相关性分数。因为问题和文档的每个 token 都能互相 attend精度远高于双塔——但每对 (问题, 文档) 都要过一遍完整推理不能预计算所以只能对召回的几十条做精排不能对全库做。你能感受到什么体感层问苹果最新的芯片双塔检索可能把苹果公司的历史排第一因为苹果这个词的向量权重太大而 ReRank 会把M3 芯片参数提上来——因为它看到了苹果和芯片在同一个问题里的交互关系知道这里苹果指公司不是水果。双塔Bi-Encoder交叉编码器Cross-Encoder速度快向量预计算慢每对都要推理精度中等高适用阶段召回全库扫描精排召回后小范围交互无各自编码完整注意力️ 动手感受双塔 vs 交叉编码器排序操作同一批召回的 20 条文档分别用双塔相似度排序 vs Cross-Encoder 重排序看 Top-5 差异。你会看到双塔排序字面关键词匹配的文档排前面但可能苹果指水果的那条排了第一。Cross-Encoder 排序结合问题上下文苹果指公司芯片的文档被提上来。变化说明了什么ReRank 不是更准的检索是更懂上下文的判断——它让问题和文档真正对话了一次。 想一想Cross-Encoder 这么准为什么不直接用它做全库检索因为全库 100 万条文档每条都和问题拼一起过一遍 Transformer——延迟从毫秒级变成分钟级。精度和速度的博弈永远是工程的核心矛盾。 顺着他想有没有一种方案比双塔准、比 Cross-Encoder 快晚期交互模型如 ColBERT就是折中——每个 token 都保留向量检索时做细粒度交互速度接近双塔、精度接近 Cross-Encoder。五、排序不止ReRank排序的完整逻辑链路召回捞了 50 条ReRank 精排到 10 条模型只能吃 5 条——哪 5 条排序决定生死。可大多数人只关心召回和 ReRank排序环节草草了事。排序解决的核心问题“像不像不等于该不该”。相似度最高的文档未必是最该喂给模型的——它可能过时了、来源不权威、或者和用户当前场景不匹配。排序要综合多种信号做出该不该的判断。它到底在干嘛机制层排序是一个多层信号叠加的过程。第一层相似度分数余弦/点积纯看像不像。第二层ReRank 分数Cross-Encoder看交互相关性。第三层业务信号——文档新鲜度时间衰减2024 年的文档比 2020 年的权重高、文档权威性官网文档权重高于社区帖子、查询-文档交互特征文档是否包含问题中的实体词。最终分数 α×相似度 β×ReRank 分 γ×新鲜度 δ×权威性权重靠实验调。排序做完取 Top-N通常 3-5 条喂给模型。你能感受到什么体感层问2024 年退货政策纯相似度排序可能把 2020 年的旧政策排第一文字最像但加上时间衰减后2024 年的新政策会被提上来。排序的威力在于它不是只看像不像还看该不该——一个过时的答案再像也不是你要的。️ 动手感受纯相似度排序 vs 多信号排序操作同一批召回结果分别用纯相似度排序 vs 加入时间衰减权威性权重的排序看 Top-5 差异。你会看到纯相似度2020 年旧政策排第一因为文字和问题最像。多信号排序2024 年新政策排第一旧政策被时间衰减压下去。变化说明了什么排序不是排个序号的事是综合判断该不该的事——多加一个信号维度结果就可能翻盘。 想一想权重 α、β、γ、δ 怎么设没有万能值——你的数据如果偏时效性新闻类γ 要大偏权威性法规类δ 要大。这些权重靠什么调靠 A/B 测试和人工评估不是靠拍脑袋。 顺着他想排序做完喂给模型的 Top-5 顺序重要吗模型是按顺序读的——排第一的文档注意力最高排第五的可能被挤掉。所以排序不只是选谁还是谁先谁后。六、混合检索关键词语义双剑合璧纯向量检索搜订单号 A12345搜不到纯关键词检索搜怎么退款搜不到同义的如何退钱——各有盲区。混合检索就是让它们组队你搜不到的我来我搜不到的你来。混合检索解决的核心问题向量检索擅长语义匹配但怕精确匹配关键词检索擅长精确匹配但不懂同义。两路召回、合并排序互补短板。它到底在干嘛机制层混合检索同时跑两路召回——向量路语义检索ANN 索引和关键词路BM25/TF-IDF倒排索引。两路各出 Top-K合并后统一排序。合并策略最经典的是倒排融合Reciprocal Rank Fusion, RRF每条文档的 RRF 分数 Σ 1/(krank_i)k 通常取 60。RRF 不依赖绝对分数向量相似度和 BM25 分数量纲不同不能直接比只依赖排名——两路都排得靠前的文档天然得高分。更精细的做法是两路召回后合并集再过一遍 Cross-Encoder 做最终精排。你能感受到什么体感层问订单 A12345 的物流状态——关键词路精确命中订单号 A12345这条记录向量路可能完全搜不到因为 A12345 没有语义信息问怎么退钱——向量路搜到退款流程文档同义匹配关键词路搜不到退钱和退款字面不同。两路合并两种问题都能答。向量检索关键词检索混合检索同义匹配✅ 强❌ 弱✅精确匹配❌ 弱✅ 强✅速度快ANN快倒排两路并行略慢复杂度低低中需合并策略️ 动手感受纯向量 vs 纯关键词 vs 混合操作准备两类问题——“怎么退钱”语义型和订单号 A12345精确型分别用三路检索看结果。你会看到纯向量怎么退钱命中退款流程✅A12345搜不到❌。纯关键词A12345精确命中✅怎么退钱搜不到退款❌。混合两类问题都命中✅。变化说明了什么单路检索总有盲区混合检索用冗余换覆盖——多跑一路多一份保障。 想一想混合检索一定比单路好吗如果你的数据全是自然语言问答、几乎没有精确匹配需求如客服对话关键词路可能全是噪音——多跑一路不仅没增益还增加了合并的复杂度和延迟。所以要不要混合取决于你的数据特征不是无脑加。 顺着他想两路召回后合并策略 RRF 只看排名不看分数——这是优点量纲无关还是缺点丢了分数信息有没有既看排名又看分数的合并方案七、一张图串起RAG调优链路6 个调优旋钮不是散落的它们串成一条从用户输入到喂给模型的完整调优链路用户提问 │ ① 意图识别 ← 分桶FAQ/知识/闲聊/多跳决定检索策略 │ ② 混合召回 ← 向量路(ANN) 关键词路(BM25)宽捞宁多勿漏 │ ③ 融合(RRF) ← 两路合并按排名融合 │ ④ 相似度计算 ← 底座余弦/欧氏/点积选错尺子全盘偏 │ ⑤ 排序(多信号) ← 相似度 ReRank 新鲜度 权威性 │ ⑥ ReRank精排 ← Cross-Encoder 交叉编码定最终榜单 │ Top-N → 拼进 Prompt → 大模型生成调优口诀意图识别精准分流——别让问流程的人看政策文档。相似度夯实底座——选错尺子后面全白搭。召回宽捞——宁多勿漏漏了再也找不到。排序精筛——“像不像之外还要看该不该”。ReRank定榜——让问题和文档面对面聊一次最终排名它说了算。混合检索兜底——单路总有盲区双路互补才安心。照这 6 个旋钮在脑子里走一遍你就知道自己的 RAG “锅出在哪一步”——而不是只会换框架碰运气。八、代码加上ReRank和混合检索的RAG上一篇跑了 20 行最小 RAG这篇加两个关键升级混合检索BM25 向量和ReRankCross-Encoder 精排。fromopenaiimportOpenAIimportnumpyasnpfromrank_bm25importBM25Okapi clientOpenAI(api_key你的KEY,base_urlhttps://api.openai.com/v1)defembed(text):rclient.embeddings.create(inputtext,modeltext-embedding-3-small)returnnp.array(r.data[0].embedding)docs[RAG用检索增强生成突破知识时效,向量数据库为高维相似度搜索而生,Chunk切分粒度直接决定检索质量,订单号A12345的物流状态已更新,ReRank用交叉编码器做精排提升精度,混合检索结合关键词和语义双路召回]vecs[embed(d)fordindocs]# ① 向量路余弦相似度 Top-Kq怎么让检索更精准qvembed(q)cos_sims[qv v/(np.linalg.norm(qv)*np.linalg.norm(v))forvinvecs]vec_rankingnp.argsort(cos_sims)[::-1][:4]# ② 关键词路BM25 Top-Ktokenized[d.split()fordindocs]bm25BM25Okapi(tokenized)kw_scoresbm25.get_scores(q.split())kw_rankingnp.argsort(kw_scores)[::-1][:4]# ③ RRF融合k60k60rrf_scores{}forrank,idxinenumerate(vec_ranking):rrf_scores[idx]rrf_scores.get(idx,0)1/(krank1)forrank,idxinenumerate(kw_ranking):rrf_scores[idx]rrf_scores.get(idx,0)1/(krank1)mergedsorted(rrf_scores,keyrrf_scores.get,reverseTrue)[:3]# ④ ReRank精排用LLM模拟Cross-Encoder打分rerank_prompt给以下(问题,文档)对的相关性打1-10分只输出数字。\nforidxinmerged:rerank_promptf问题{q}| 文档{docs[idx]}\nscoresclient.chat.completions.create(modelgpt-4o-mini,messages[{role:user,content:rerank_prompt}]).choices[0].message.content# ⑤ 取Top1喂给模型生成top_idxmerged[0]ansclient.chat.completions.create(modelgpt-4o-mini,messages[{role:system,content:只根据参考资料回答},{role:user,content:f参考资料{docs[top_idx]}\n问题{q}}]).choices[0].message.contentprint(ans)对比上一篇的 20 行多了 BM25 关键词路、RRF 融合、和 LLM 模拟的 ReRank——这就是从能用到好用的距离。要上生产把 LLM 模拟 ReRank 换成真正的 Cross-Encoder如bge-reranker-v2-m34 行代码搞定。写到最后这篇把 RAG 从跑通推到了调优——相似度选错尺子、意图没识别、召回 K 设错、排序只看相似度、没上 ReRank、没用混合检索6 个常见坑一次讲完。但 RAG 的天花板还不止于此——CRAG纠错式 RAG、Self-RAG自反思 RAG、句子滑动窗口检索、自动合并检索……这些高阶玩法在下一篇高阶篇里拆开讲。写这种图文长文挺费劲——每个调优旋钮要不要讲透、动手场景能不能真感受到、那个想一想是不是真能卡住人每一处都得磨。所以如果你读下来觉得真有用、不想下次又翻半天找不到点个赞让我知道这种类比机制体感动手灵魂提问的写法值得继续做下去⭐收藏起来这条 RAG 调优链路是后面所有检索优化文章的地基回来翻的概率比你想的高关注一下下一篇RAG 高阶篇CRAG·Self-RAG·滑动窗口·自动合并我会尽快更上关注了就不会错过。如果这篇哪里没讲清楚、或者你想看的概念系列里还没排上评论区直接说我会一条条回也按大家最想看的优先排期。系列导航 持续更新系列第 6 篇上一篇给AI装外挂知识库·RAG入门6张图把核心链路一次讲透 下一篇预告RAG还在用基础版CRAG·Self-RAG·滑动窗口·自动合并·索引·融合全讲透