【AI编程时代】:RAG的不同检索策略

目录

前言

一、基础检索策略

稀疏检索(BM25)

稠密检索(向量检索)

二、进阶策略:混合检索

三、精排策略:重排序

四、RAG检索新范式

多跳检索

查询改写

多模态RAG

五、如何选择策略?


前言

在2026年的今天,RAG(检索增强生成)早已不是简单的"向量搜索+LLM"组合。检索策略,即"如何从海量知识库中捞出最相关的那几段话",直接决定了RAG系统的上限。本文将以最通俗的语言,拆解从基础到前沿的检索策略。

一、基础检索策略

RAG检索的起点是解决"大海捞针"的问题。目前主流有两大选择

稀疏检索(BM25)

原理:像传统搜索引擎一样,看文档里是否包含用户问题中的关键词。比如问"如何保养汽车轮胎",它会优先召回包含"保养"、"汽车"、"轮胎"三个词的文档。

特点快、准(字面匹配)、便宜。但无法理解"轮胎"和"轮毂"是相关概念。

稠密检索(向量检索)

原理 :将文本转为高维向量,通过计算向量距离(如余弦相似度)找语义相近的文档。即使文档里没有"轮胎"二字,只要讲"橡胶制品的磨损周期",也能被召回。

特点理解语义、抗变体。但依赖模型质量,且对专有名词(如"GPT-4")召回率可能不如BM25。

我们使用langchain来认识下这两种代码方式的实现:

python 复制代码
# 1. 稀疏检索(BM25)
from langchain_community.retrievers import BM25Retriever

bm25_retriever = BM25Retriever.from_documents(docs, k=3)
results_bm25 = bm25_retriever.invoke("如何保养轮胎?")

# 2. 稠密检索(向量)
from langchain_community.vectorstores import FAISS
from langchain_huggingface import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
vectorstore = FAISS.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
results_vector = retriever.invoke("如何保养轮胎?")

二、进阶策略:混合检索

既然两种方法各有优劣,成年人选择全都要。混合检索 是目前工业界的标配

原理 :并行执行BM25和向量检索,然后对结果进行融合排序。常用**RRF(倒数融合排序)**算法:给每个结果一个排名分,第一名得1分,第二名得0.5分,最后把两种检索的分数相加。

实战价值:专治"语义漂移"。比如问"苹果公司最新财报",BM25确保召回"苹果"相关的文档(过滤掉水果苹果),向量检索确保召回"财报"相关的文档,两者结合,精准命中。

代码演示:

python 复制代码
from langchain.retrievers import EnsembleRetriever
# 创建混合检索器
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, retriever],
    weights=[0.5, 0.5]  # 权重可调
)
results_hybrid = ensemble_retriever.invoke("苹果公司最新财报")

三、精排策略:重排序

混合检索召回了几十个候选文档,但LLM的上下文窗口有限 (通常只塞得下前3-5个)。如果排在前面的文档不相关,LLM就会"带偏"。重排序就是最后的"质检员"。

原理 :使用一个专门的交叉编码器(Cross-Encoder) 模型(如BGE-reranker),将问题每个候选文档拼接在一起输入模型,让模型直接判断"这个文档能回答这个问题吗?",给出0-1的分数。这个计算量虽大,但精度极高。

代码演示:

python 复制代码
from sentence_transformers import CrossEncoder
# 初始化重排序模型
reranker = CrossEncoder('BAAI/bge-reranker-base')

# 假设 candidates 是混合检索返回的10个文档
pairs = [[query, doc.page_content] for doc in candidates]
scores = reranker.predict(pairs)

# 按重排序分数重新排序
reranked_docs = [doc for _, doc in sorted(zip(scores, candidates), reverse=True)]
top_3_for_llm = reranked_docs[:3]  # 把最相关的3个喂给LLM

四、RAG检索新范式

多跳检索

问题:复杂问题需要"顺藤摸瓜"。比如问"马斯克收购推特后第一任CEO是谁?",第一步需检索"马斯克收购推特",第二步从结果中提取"CEO任命"信息进行二次检索。

解法:让LLM参与检索过程,生成中间查询(Query Decomposition),或训练专门的检索智能体(如Q-RAG)。

查询改写

问题:用户提问"它有什么特点?"(指代不明)或"帮我总结一下"(意图模糊),直接检索效果差。

解法:先用LLM将用户query改写为"检索友好"的格式,如"文档中关于太阳系最大行星木星的特点描述"。

多模态RAG

趋势 :检索对象不再限于文本。对于PDF、PPT、图表,直接使用视觉编码器(如CLIP)将整页图像转为向量进行检索,避免OCR过程中的信息丢失,保留原始版式语义。


五、如何选择策略?

|---------|------------|------------------|
| 场景 | 推荐策略 | 理由 |
| 内部文档问答 | 混合检索 + 重排序 | 兼顾专有名词与语义理解,精度最高 |
| 公开知识搜索 | 稠密检索为主 | 语义泛化能力强,适合开放域 |
| 法律/合同检索 | 稀疏检索为主 | 关键词一字不差,法律条文要求精确 |
| 成本敏感 | 仅BM25 | 无需GPU,速度最快 |

最后建议:**"混合检索+轻量级重排序"**是性价比最高的黄金组合,能解决90%的落地问题。


制作不易,如果对你有帮助请**点赞,评论,收藏,**感谢大家的支持

相关推荐
风吹夏回18 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
canonical_entropy19 小时前
Harness Engineering 之外:从非线性动力系统控制理解吸引子引导工程
架构·aigc·ai编程
小熊Coding19 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋919 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本19 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
田里的水稻20 小时前
OE_ubuntu26.04与宿主机之间复制粘贴内容
人工智能·python·机器人
jiayong2320 小时前
02 创建虚拟环境
python
旺仔来了21 小时前
不联网的Linux下部署python环境
linux·开发语言·python
ServBay21 小时前
月之暗面 Kimi Code 0.4.0 发布,终端 AI 编码助手全面采用 TypeScript,实现毫秒级启动
后端·aigc·ai编程
小江的记录本21 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试