ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

【RAG 学习笔记 02】在线链路七步走:混合检索与 RRF 为什么有效

【RAG 学习笔记 02】在线链路七步走:混合检索与 RRF 为什么有效 这是 RAG 学习笔记的第 2 篇把在线链路走一遍问题清洗 → 查询改写 → 混合检索 → Rerank → 组装上下文 → LLM 生成 → 引用后处理我原本是硬背这串流程背不下来后来把它想成帮朋友查资料回答问题的完整过程就顺了。本系列导航00 开篇用「开卷考试」理解 RAG 与我的学习方法01 Chunking 切块与 Embedding 选型02 在线链路七步走与混合检索 RRF本篇03 Rerank 与查询改写04 工程化延迟、缓存、成本与权限05 评测调优与三个进阶架构一、七步流程每一步为什么存在步骤做什么类比问题清洗去掉错别字、多余空格、敏感词把朋友含糊的话听清楚查询改写把口语化、有指代的问题改成适合检索的句子把它退款怎么算改成会员年卡的退款条件是什么混合检索同时用关键词BM25和语义向量找文档同时用关键字搜索和意思相近搜索Rerank把找回来的几十篇用更精细的模型重新排序海选后面试精挑 5 个组装上下文把挑出来的片段拼成一段话给 LLM把资料整理好放在桌上LLM 生成大模型根据资料写出答案你根据资料组织语言回答朋友引用后处理标来源、检查不安全内容告诉朋友这是从 XX 文件第 3 页看到的记忆口诀清 → 改 → 找 → 排 → 拼 → 答 → 标。面试口述版“在线阶段先清洗和改写用户问题然后混合检索召回候选再用 Rerank 精排组装上下文给 LLM 生成最后做引用和安全后处理。”——这就够了不需要一字不差背步骤名。二、混合检索BM25 管字面向量管意思BM25 是什么BM25 是一种基于关键词的检索算法传统搜索引擎比如 Elasticsearch默认就用它。它给每篇文档打分依据三个因素词频查询词在文档里出现几次越多分越高但有上限逆文档频率IDF一个词在所有文档里越罕见权重越高——比如Pod比怎么稀有所以匹配上Pod得分更高文档长度长文档做归一化避免长文档占便宜。一句话BM25 就是字面匹配打分器。向量检索在做什么很多人包括我以为向量检索就是把文字编码成向量——其实它包含两步编码用 Embedding 模型把用户问题变成向量约 10–30ms搜索拿这个向量去向量数据库Milvus / FAISS里找最相似的文档向量约 20–50ms。类比你要在图书馆找一本内容相似的书——先把需求翻译成管理员能懂的索引号编码管理员再去书架按索引号找搜索。两步加起来才是向量检索时间。为什么必须混合BM25 擅长精确匹配产品名、错误码、版本号、专有名词向量检索擅长语义泛化同义改写、口语表达。举例用户问K8s Pod 启动失败怎么排查方式结果纯向量召回Kubernetes 容器无法运行意思相近但可能漏掉精确包含Pod的文档纯 BM25精确命中Pod“启动失败”但漏掉容器无法运行这类语义相关文档混合 RRF两者互补Recall10 从 0.78 提升到 0.91一句话BM25 擅长字面一样向量擅长意思一样合起来才最全。三、RRF为什么只看排名、不看分数RRF Reciprocal Rank Fusion倒数排名融合。公式很朴素score Σ 1 / (k rank_i)意思是对每一路检索结果按其排名贡献分数第 1 名贡献最大越靠后越小再把多路分数相加。为什么不用加权分数而是用 RRF这是我最没懂、后来最服气的一点BM25 的分数范围可能是 0–20向量相似度是 0–1量纲完全不一致。直接加权归一化会引入偏差归一到哪个区间权重怎么定。而RRF 只看排名对分数量纲不敏感所以更稳健。k 值常用默认k60对排名差异不敏感。面试被问到怎么融合多路检索结果时我的答法是“我用 RRF 而不是加权求和因为两路分数量纲不同加权归一化会引入偏差RRF 只依赖排名更稳健。”四、顺带搞懂什么叫双塔粗排面试文档里写召回阶段是双塔粗排Query 和 Doc 独立编码交互不充分我一开始完全不懂。双塔有两个塔神经网络——一个塔编码 Query另一个塔编码 Doc。它们各自独立把文字变成向量然后算两个向量的相似度。为什么叫粗排因为 Query 和 Doc没有放在一起看模型不知道它们之间具体的词级交互。举例Query 是苹果价格Doc 是苹果手机售价——双塔只能分别编码可能忽略价格和售价的细微对应关系。精排Cross-Encoder把 Query 和 Doc 拼在一起如[CLS] 苹果价格 [SEP] 苹果手机售价 [SEP]让模型同时看到两边做深度交互——精度更高但计算慢。所以标准流程是双塔粗排召回 Top-50 → Cross-Encoder 精排 Top-5。粗排快但不够准精排准但慢所以只对少量候选做。五、检索为空怎么办三层兜底举例保险理赔 RAG用户问2025 年新增的宠物医疗险报销比例第一层——放宽重试降阈值、去过滤、启用 BM25 兜底第二层——明确拒答Prompt 约束上下文无相关信息时直接说未找到第三层——追问澄清追问您是指哪一款宠物险核心原则宁可拒答不可幻觉。这一条我后来在评估部分又见到一次无答案样本、受监管行业设 Faithfulness 门槛 0.98。会拒答是 RAG 系统成熟的标志只会答不会拒的系统在真实业务里很危险。六、这一篇的记忆卡概念一句话在线七步清 → 改 → 找 → 排 → 拼 → 答 → 标BM25基于关键词的字面匹配打分器词频 IDF 长度归一向量检索编码文字→向量 搜索向量库找相似混合检索BM25 管字面、向量管意思Recall10 可从 0.78 → 0.91RRF只看排名不看分数避免量纲不一致双塔粗排Query/Doc 独立编码快但不准检索为空放宽重试 → 明确拒答 → 追问澄清七、我的复盘这一篇最大的收获是搞清了**召回和排序是两个不同的目标**召回阶段要的是别漏高 Recall排序阶段要的是把对的放前面高精度。一句话想通后很多设计就顺了为什么召回想多要几路——为了 Recall为什么召回了还要 Rerank——为了把对的排前面为什么 RRF 只看排名——因为在排序这个目标上排名比原始分数更可比。下一篇讲 Rerank 和查询改写为什么 Cross-Encoder 更准却更慢、HyDE 什么情况下会把检索带偏、以及为什么多轮对话里每一轮的 Query 都必须自包含。
返回列表