当前位置: 首页 > news >正文

RAG 检索优化:混合搜索、Reranking、多路召回

引言

RAG 基础设施搭好了,但你很快会发现——基础的向量检索不够准

用户问"2024年Q3财报营收多少",返回的是一段公司愿景。用户问"张三的工号",知识库里明明有,就是搜不出来。

纯向量检索有天然短板,今天用三板斧把召回率从 80% 提到 95%:

  1. 混合搜索:向量检索 + 关键词检索,两条路同时走
  2. Reranking:用更精准的模型对候选结果二次排序
  3. 多路召回:不同策略并行检索,合并去重

纯向量检索的三个短板

1. 关键词精确匹配差:查"合同编号 HT-2024-0815",向量返回"合同签署流程"(语义相关但不是要的)。编号、人名、专有名词需要精确匹配,向量弱势。

2. 短查询信息不足:查"年假",向量空间里"假期"、“休息”、"放假"都很近,结果容易飘。

3. 领域新词:行业术语"人天工时"、“BOM 物料”,Embedding 模型训练数据未必覆盖,向量表示不准。


方案一:混合搜索

向量检索找语义相关,BM25 关键词检索找精确匹配,两路融合。

BM25(经典关键词检索)

from rank_bm25 import BM25Okapiimport jiebaclass BM25Retriever: def __init__(self, chunks: list[dict]): tokenized = [list(jieba.cut(c["content"])) for c in chunks] self.bm25 = BM25Okapi(tokenized) self.chunks = chunks def search(self, query: str, top_k: int = 10) -> list[dict]: scores = self.bm25.get_scores(list(jieba.cut(query))) top_indices = scores.argsort()[::-1][:top_k] return [{"id": self.chunks[i]["id"], "content": self.chunks[i]["content"], "score": float(scores[i])} for i in top_indices if scores[i] > 0]

RRF 融合排序

两路检索的分数尺度不同,不能直接加权。RRF(互惠排名融合)只看排名位置,天然兼容:

def reciprocal_rank_fusion(results_list: list[list[dict]], k: int = 60, top_k: int = 10) -> list[dict]: scores, content_map = {}, {} for results in results_list: for rank, item in enumerate(results, 1): doc_id = item["id"] scores[doc_id] = scores.get(doc_id, 0) + 1.0 / (k + rank) content_map[doc_id] = item sorted_ids = sorted(scores, key=scores.get, reverse=True)[:top_k] return [{**content_map[did], "rrf_score": scores[did]} for did in sorted_ids]

效果对比

方案Hit@5MRR
纯向量检索85%0.78
纯 BM2572%0.65
混合搜索(RRF)92%0.86

方案二:Reranking(精排)

混合搜索召回了更多候选,但排序可能不够精准。Reranking 用更强的模型二次排序。

为什么更准:Embedding 模型是双编码器,query 和 document 分别编码;Reranker 是交叉编码器,把 query + document 拼在一起输入,能做更深层的语义交互,排序更准确。代价是速度慢——所以 Reranker 只对已召回的 20~30 个候选做精排。

BGE Reranker(本地免费)

from sentence_transformers import CrossEncoderclass BGEReranker: def __init__(self): self.model = CrossEncoder("BAAI/bge-reranker-v2-m3") def rerank(self, query: str, candidates: list[dict], top_k: int = 5) -> list[dict]: scores = self.model.predict([(query, c["content"]) for c in candidates]) scored = [{**candidates[i], "rerank_score": float(scores[i])} for i in range(len(candidates))] return sorted(scored, key=lambda x: x["rerank_score"], reverse=True)[:top_k]

也可以用 Cohere Rerank API 或 Jina Reranker API(不需要本地部署)。

效果对比

方案Hit@5MRR延迟
混合搜索(无 Rerank)92%0.8650ms
+ BGE Reranker(本地)96%0.92120ms

Reranking 在 MRR 上的提升尤其明显——正确答案被排到更前面了。


方案三:多路召回

Query 扩展

用 LLM 把用户的一句查询改写成多个版本,每个版本独立检索,合并去重:

原始查询:"年假怎么算"LLM 扩展后:- "年假怎么算"- "员工年假天数计算规则"- "工龄对应的年假标准"- "带薪休假的计算方式"

四个查询各自检索,用 RRF 合并,召回率远高于单查询。

HyDE(假设性文档)

让 LLM 先生成一段"假设性答案",用答案去检索,而不是用问题:

response = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": f"直接回答以下问题:{query}"}])hypothetical_doc = response.choices[0].message.content# 用假设性答案的向量做检索

原理:答案和文档的向量空间分布比问题更接近,检索效果更好。


完整 Pipeline

class RAGRetriever: async def retrieve(self, query: str, top_k: int = 5) -> list[dict]: # 1. 粗召回:混合搜索,多召回 4 倍候选 vector_results = await self.vector_store.search(embed(query), top_k=top_k*4) bm25_results = self.bm25.search(query, top_k=top_k*4) # 2. RRF 融合 candidates = reciprocal_rank_fusion([vector_results, bm25_results], top_k=top_k*4) # 3. Reranker 精排 if self.reranker: candidates = self.reranker.rerank(query, candidates, top_k=top_k) # 4. 阈值过滤(去掉低相关度的 chunk) return [r for r in candidates if r.get("rerank_score", 0.3) >= 0.3]

调参建议

RRF k 值:默认 60,中文知识库用 40~60 比较稳。

Reranker 候选数:建议 20~30 条,再多延迟上去了(BGE Reranker 30 条约 130ms)。

分数阈值:低相关度的 chunk 塞进 Prompt 反而干扰 LLM,设min_score=0.3过滤。


总结

  1. 纯向量检索不够用——关键词精确匹配差、短查询飘、领域词汇弱。
  2. 混合搜索是基本操作——向量 + BM25 + RRF,召回率提升 7~10 个百分点。
  3. Reranking 提升排序质量——BGE Reranker 本地免费,MRR 提升显著。
  4. 多路召回锦上添花——Query 改写、HyDE 进一步提高上限。
  5. 评测驱动优化——没有 Hit Rate 和 MRR 数据,一切优化都是猜测。

完整 Pipeline:粗召回(混合搜索)→ RRF 融合 → Reranker 精排 → 阈值过滤。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

http://www.jsqmd.com/news/1151498/

相关文章:

  • 力扣hot100简单题(三)
  • 基于Java的健身房管理系统
  • LangChain Agent 入门实战:从报错到跑通带记忆的交互式智能体(初学者保姆级教程)
  • 开源分析-joyagent多模态RAG实现
  • 半导体供应链安全与国产化替代实战指南
  • GLM5.2模型自部署实战:vLLM加速与量化技术实现推理性能超越
  • 曲辕RPA-激活曲辕办公软件
  • 运维与后端的绝对刚需之 Linux 性能调优与故障排查
  • 预算有限怎么选论文 AI 工具?高性价比口碑清单 + 避坑提醒
  • CoreDNS 调优:NDots 设不对,每次 DNS 查询都多走一步
  • 华为MetaERP 先把你那个前提纠一下——“华为 MetaERP 基本原理和 Oracle EBS 一致“这个说法不太准,得区分“功能表层“和“架构原理“:EBS 原理:R12 是单体 SOA +
  • 渲染管线选型实战:Forward+ 与 Deferred 的权衡及实时光追落地考量
  • 第一篇:基于移位变种的古典密码破解竞赛
  • Linux 定时任务不执行?cron 排错别只盯表达式
  • 【维克】海外量化行业扫描:美国的量化对冲基金有多强?
  • AD7175-8与PIC18F87K22高精度数据采集系统设计
  • C# 实现 Word 文档文本批量替换 (动态填充)
  • 10个让AI画得更准的神奇魔法词:实测对比效果惊人
  • 一步跨到4K时代,Seedance2.5官网在哪?行业拐点来了
  • Agent 开发框架怎么选?LangGraph、LlamaIndex、CrewAI 深度对比
  • Python asyncio在AI编程中的深度应用:从协程到异步Agent架构
  • 为什么花了十几万搭知识库,生成内容还是很多幻觉?
  • 团队文件共享指南:解锁高效协作新姿势
  • 2026PDF各类格式转换全方案:免费无水印在线网站、电脑本地软件实操指南
  • 半导体百科 | FAB设备预测性维护实战
  • 商业数据分析-助睿数智-互联网用户行为日志数据挖掘与分析报告
  • 2026排盘结果导出工具怎么选:看命盘留存、格式兼容和复盘效率
  • web应用技术-课程设计
  • Unity游戏模组开发基础:BepInEx框架5分钟极速安装与配置指南
  • 独立搭建 AI Agent 全景指南:从理论到实战