【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%的落地问题。


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

相关推荐
Alan Lu Pop1 小时前
Figma 配置
前端·ai编程·cursor
无心水1 小时前
Python时间处理通关指南:datetime/arrow/pandas实战
开发语言·人工智能·python·pandas·datetime·arrow·金融科技
AI视觉网奇1 小时前
block_sparse_attn 安装
python
墨白曦煜1 小时前
RocketMQ 实战:揭秘 @RocketMQMessageListener 的反序列化魔法与“万能”消费策略
开发语言·python·rocketmq
zybsjn1 小时前
一天快速实现markdown 编辑器和排版工具:基于Node.js + Express + 原生JS的开发实践
node.js·express·ai编程
ZTLJQ10 小时前
序列化的艺术:Python JSON处理完全解析
开发语言·python·json
H5css�海秀10 小时前
今天是自学大模型的第一天(sanjose)
后端·python·node.js·php
阿贵---10 小时前
使用XGBoost赢得Kaggle比赛
jvm·数据库·python
无敌昊哥战神10 小时前
【LeetCode 257】二叉树的所有路径(回溯法/深度优先遍历)- Python/C/C++详细题解
c语言·c++·python·leetcode·深度优先