如何让 RAG 检索更高效?——大模型召回策略全解


一、引子:RAG 的“强”靠得住吗?

RAG(Retrieval-Augmented Generation)作为一种将文档检索与大语言模型结合的框架,已成为企业落地知识问答、搜索增强、智能客服的首选。

但现实中我们常听到:

  • “模型答得不准”
  • “文档检索到的都不相关”
  • “返回的内容一堆没用的废话”

这些问题的核心,往往出在了检索阶段的“召回”环节。


二、什么是召回?RAG 的第一道门槛

在 RAG 中,“召回”指的是:

从海量文档中选出一小批候选文档,作为模型生成答案的“上下文”。

流程大致如下(见图1):

  1. 用户提问(Query)
  2. 检索系统用 embedding(向量)或关键词查找文档
  3. 将 N 篇文档拼接进 prompt,送入语言模型
  4. 模型基于这些上下文生成答案

如果第2步召回错了,后面再强的大模型也无能为力。


三、常见召回方式有哪些?

RAG 的召回方式,按复杂度从低到高大致可分为以下几类:

1. 基于关键词的召回(BM25 等)

  • 最经典的搜索引擎方法
  • 基于词频、TF-IDF 计算相关性
  • 优点:快、无需训练
  • 缺点:语义能力弱,容易漏召

适合冷启动或低资源场景。


2. 基于向量的语义召回(Embedding 检索)

  • 利用 embedding 模型(如 BGE、E5)将 query 和文档转换为向量
  • 用余弦相似度 / 点积进行匹配
  • 通常结合 Faiss、Milvus 等向量引擎使用

优点:

  • 语义匹配强,不拘泥于关键词
  • 可扩展性好,支持十亿级别文档库

缺点:

  • 需构建向量库
  • 语义漂移风险(召回相关但不精确)

3. 多阶段召回(Hybrid Retrieval)

结合多种召回方式,通常分为两个阶段:

第一阶段用 BM25 等快速粗筛,
第二阶段用向量匹配 / reranker 精排。

示意图见图2。

常见方式包括:

  • Union(并集): 关键词 + 向量合并
  • Stacking: BM25 → Embedding → rerank
  • Embedding + rerank(推荐)

优点:召回率和精准率都更高
缺点:延迟更高,依赖 reranker 质量


四、提升召回效果的高级技巧 – 优化检索质量

1. Query Rewriting(问题改写)

对用户 query 进行改写,提高检索相关性
如加上领域词、消歧义、重构句式

例:

“他是谁?” → “曹操是谁?”


2. Query Expansion(问题扩展)

将 query 拓展为多个语义接近的问题,以召回更多候选文档

例:

“中国主席是谁” → “中国国家领导人是谁”

可直接采用 LangChain 提供的 MultiQueryRetriever 部署该功能:

from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI# 加载向量数据库(示例用 Faiss)
vectorstore = FAISS.load_local("faiss_index", embeddings)# 初始化 LLM(也可以换成其他如 ChatGLM)
llm = OpenAI(temperature=0)# 创建多查询检索器
retriever = MultiQueryRetriever.from_llm(  ## 这里,看这里 !!!!!!在这里啊啊啊 !retriever=vectorstore.as_retriever(),llm=llm
)# 输入用户问题
query = "中国主席是谁?"# 自动扩展多个语义相似 query 并执行召回
docs = retriever.get_relevant_documents(query)

LLM 自动将原始 query 改写成多个相关问法, 各自检索召回文档, 之后聚合或融合多组结果


3. 多视角查询(Multi-view Retrieval)

对 query 使用不同 embedding 模型(如 domain-specific、cross-lingual)同时召回

适合跨语言、多模态场景,如医疗报告、PDF等


4. Chunk 优化

RAG 中通常将文档切分为小段(chunk)后进行召回
但:

  • 切太短容易丢上下文
  • 切太长又不便检索与嵌入

常见做法:

  • 固定窗口滑动切分
  • 按语义段落切分(推荐)
  • 结合摘要进行“chunk pooling”

5. 使用 Reranker 精排模型

可对 top-K 召回结果重新排序 (重排排的是 – 问题和召回结果的相关程度),显著提升 Top-1 命中率

在这里插入图片描述

常见 Reranker 精排模型 如:

  • 【商用 API】Cohere Rerank
  • 【开源】BGE Reranker(下方有使用代码示例)
# 安装依赖(首次使用时运行一次)
# pip install transformers torchfrom transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch# 1. 加载 BGE-Reranker 模型和分词器(首次运行会自动从 HuggingFace 下载)
model_name = "BAAI/bge-reranker-large"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
model.eval()# 2. 输入一个查询 + 文档对(可以用于 rerank 检索结果)
pairs = [["what is panda?", "The giant panda is a bear species."]]# 3. 编码并送入模型推理
inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():scores = model(**inputs).logits.view(-1).float()print(scores)  # 输出相关性得分,例如 tensor([4.95])# 高相关性:3.0~10.0
# 中等相关性:0.0~3.0
# 低相关性/不相关:负数(如-5.0以下)

6. 知识图谱增强召回(KG-Augmented Retrieval)

利用外部或企业内部的知识图谱(Knowledge Graph),将用户查询中的关键词映射为图谱中的实体,结合语义关系(上下位、同义词、连接路径)进行 query 扩展与实体增强,进一步提高文档召回的准确性与泛化能力。

适合对实体识别要求高、推理路径明确的任务(如金融、法律、医疗场景)。

常见方式包括:

  • 实体链接(Entity Linking)
  • 知识图谱辅助 query 改写
  • 基于图谱的多跳路径查询

7. Small-to-Big 检索策略(多文档场景推荐)

当文档较长或数量庞大时,可采用 Small-to-Big 策略提高检索效率与精准度:

核心思想:先索引文档中较短的结构(如摘要、关键句、段落标题),快速定位相关内容,再链接回对应的完整文档获取上下文。

适用场景:论文库、PDF、多段落文档、金融合规材料等结构清晰内容。

优势:显著减少冗余匹配,提升响应速度,同时增强大模型回答的上下文连贯性。

📌 简单来说,就是先匹“小块”,再补“大块”。


五、召回失败的常见原因排查清单

症状可能原因对策
召回内容完全无关Embedding 模型不匹配、未微调更换为领域专用模型或 fine-tune
文档相关但答非所问Chunk 粒度太大 / 太碎优化切分策略
某些关键词缺失Query 不完整、实体消歧失败使用 Query Rewriting
多轮问答上下文缺失检索不含对话历史构造完整对话序列或长上下文支持
返回文档太多 / 太慢无 top-K 控制、未加权排序控制召回数量、使用 reranker

六、实际工程建议

  • 新项目冷启动:先上 BM25 或 embedding 检索,配合简单 rule-based rerank
  • 领域任务(金融、法律等):训练专用 embedding 模型 + 加强 query 改写
  • 性能敏感场景:多阶段检索+轻量化 reranker(如 BGE + Faiss + MonoT5)
  • 高精度要求:使用 reranker + chunk 聚合 + CoT 强化(结合 RAFT 训练)

七、小结:好召回胜过大模型

在 RAG 中,“召回是输入,生成是输出”,而“输入错了,一切皆错”。

高效召回系统的构建,并非靠堆算力,而是靠 工程细节 + 策略优化。在知识密集型任务中,它决定了整个 RAG 系统的下限。


推荐阅读与工具资源

  • RAG 高级实践手册(知乎@逆流)
  • RAGathon (cohere)
  • BGE Embedding + Reranker 模型库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91920.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91920.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91920.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bilateral Reference for High-Resolution Dichotomous Image Segmentation

代码来源 https://github.com/ZhengPeng7/BiRefNet 模块作用 DIS 是一种旨在对高分辨率图像中的目标物体进行精确分割的技术,尤其适用于具有复杂细微结构的物体,例如细长的边缘或微小细节。传统方法在处理这类任务时往往难以捕捉细微特征或恢复高分辨…

RAGFlow 0.20.0 : Multi-Agent Deep Research

Deep Research:Agent 时代的核心能力2025 年被称为 Agent 落地元年,在解锁的各类场景中,最有代表性之一,就是 Deep Research 或者以它为基座的各类应用。为什么这么讲? 因为通过 Agentic RAG 及其配套的反思机制&#…

CMakeLists.txt学习

一:#是行注释 ,[[ 块注释 ]]0.cmake_minimum_required: 指定使用的cmake的最低版本1.project() 定义工程名称并可以指定工程的版本,工程描述,web主页地址,支持的语言(默认情况支持所有语言)2.…

Pytorch-04 搭建神经网络架构工作流

搭建神经网络架构 在pytorch中,神经网络被抽象成由一系列对数据执行特定操作的层或者模块组成,比如下面的Attention实现,每个块都是一个模块或者层。 如果你想快速搭建网络架构,torch.nn这个命名空间提供了所有很多开箱即用的层…

从“碎片化”到“完美重组”:IP报文的分片艺术

前言 在网络通信中,当IP层需要传输的数据包大小超过数据链路层的MTU限制时,就必须进行分片处理。本文将完整解析IP分片的工作机制,包括分片字段的作用、如何减少分片,以及分片报文的组装原理。 IP报头解析请参考&#xff…

[GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!

本文为2023年6月GESP C四级的上机题目的详细题解!觉得写的不错或者有帮助可以点个赞啦! (第一次讲解视频,有问题可以指出,不足之处也可以指出) 目录 题目一讲解视频: 题目二讲解视频: 题目一: 幸运数 题目大意: …

内网穿透 FRP 配置指南

关键词:内网穿透、FRP配置、frps、frpc、远程访问、自建服务器、反向代理、TCP转发、HTTP转发 在开发或部署项目时,我们经常遇到内网设备无法被公网访问的问题,例如你想从外网访问你家里的 NAS、远程调试开发板,或是访问本地测试环…

SpringBoot 信用卡检测、OpenAI gym、OCR结合、DICOM图形处理、知识图谱、农业害虫识别实战

信用卡欺诈检测通常使用公开数据集 数据准备与预处理 信用卡欺诈检测通常使用公开数据集如Kaggle的信用卡交易数据集。数据预处理包括处理缺失值、标准化数值特征、处理类别特征。在Spring Boot中,可以使用pandas或sklearn进行数据预处理。 // 示例:使用Spring Boot读取CS…

使用 Docker 部署 Golang 程序

Docker 是部署 Golang 应用程序的绝佳方式,它可以确保环境一致性并简化部署流程。以下是完整的指南: 1. 准备 Golang 应用程序 首先确保你的 Go 应用程序可以正常构建和运行。一个简单的示例 main.go: package mainimport ("fmt""net/http" )func ha…

从零开始的CAD|CAE开发: LBM源码实现分享

起因:上期我们写了流体仿真的经典案例: 通过LBM,模拟计算涡流的形成,当时承诺: 只要验证通过,就把代码开源出来;ok.验证通过了,那么我也就将代码全都贴出来代码开源并贴出:public class LidDrivenCavityFlow : IDisposable{public LidDrivenCavityFlow(int width 200, int hei…

仓库管理系统-17-前端之物品类型管理

文章目录 1 表设计(goodstype) 2 后端代码 2.1 Goodstype.java 2.2 GoodstypeMapper.java 2.3 GoodstypeService.java 2.4 GoodstypeServiceImpl.java 2.5 GoodstypeController.java 3 前端代码 3.1 goodstype/GoodstypeManage.vue 3.2 添加菜单 3.3 页面显示 1、goodstype表设…

共识算法深度解析:PoS/DPoS/PBFT对比与Python实现

目录 共识算法深度解析:PoS/DPoS/PBFT对比与Python实现 1. 引言:区块链共识的核心挑战 2. 共识算法基础 2.1 核心设计维度 2.2 关键评估指标 3. PoS(权益证明)原理与实现 3.1 核心机制 3.2 Python实现 4. DPoS(委托权益证明)原理与实现 4.1 核心机制 4.2 Python实现 5. P…

3.JVM,JRE和JDK的关系是什么

3.JVM,JRE和JDK的关系是什么 1.JDK(Java Development Kit),是功能齐全的Java SDK,包含JRE和一些开发工具(比如java.exe,运行工具javac.exe编译工具,生成.class文件,javaw.exe,大多用…

深度学习技术发展思考笔记 || 一项新技术的出现,往往是为了解决先前范式中所暴露出的特定局限

深度学习领域的技术演进,遵循着一个以问题为导向的迭代规律。一项新技术的出现,往往是为了解决先前范式中所暴露出的特定局限。若将这些新技术看作是针对某个问题的“解决方案”,便能勾勒出一条清晰的技术发展脉络。 例如,传统的前…

Promise的reject处理: then的第二个回调 与 catch回调 笔记250804

Promise的reject处理: then的第二个回调 与 catch回调 笔记250804 Promise 错误处理深度解析:then 的第二个回调 vs catch 在 JavaScript 的 Promise 链式调用中,错误处理有两种主要方式:.then() 的第二个回调函数和 .catch() 方法。这两种方…

Maven模块化开发与设计笔记

1. 模块化开发模块化开发是将大型应用程序拆分成多个小模块的过程,每个模块负责不同的功能。这有助于降低系统复杂性,提高代码的可维护性和可扩展性。2. 聚合模块聚合模块(父模块)用于组织和管理多个子模块。它定义了项目的全局配…

sqli-labs:Less-21关卡详细解析

1. 思路🚀 本关的SQL语句为: $sql"SELECT * FROM users WHERE username($cookee) LIMIT 0,1";注入类型:字符串型(单引号、括号包裹)、GET操作提示:参数需以)闭合关键参数:cookee p…

大模型+垂直场景:技术纵深、场景适配与合规治理全景图

大模型垂直场景:技术纵深、场景适配与合规治理全景图​​核心结论​:2025年大模型落地已进入“深水区”,技术价值需通过 ​领域纵深(Domain-Deep)​、数据闭环(Data-Driven)​、部署友好&#x…

Kotlin Daemon 简介

Kotlin Daemon 是 Kotlin 编译器的一个后台进程,旨在提高编译性能。它通过保持编译环境的状态来减少每次编译所需的启动时间,从而加快增量编译的速度。 Kotlin Daemon 的主要功能增量编译: 只编译自上次编译以来发生更改的文件,节…

鸿蒙南向开发 编写一个简单子系统

文章目录 前言给设备,编写一个简单子系统总结 一、前言 对于应用层的开发,搞了十几年,其实已经有点开发腻的感觉了,翻来覆去,就是调用api,页面实现,最多就再加个性能优化,但对底层…