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


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

相关推荐
唐老板15 小时前
给 Claude 定规则:让它写出的代码像我们团队的人写的
ai编程
Avan_菜菜1 天前
AI 能写代码了,为什么我反而开始要求它先写文档?
前端·github·ai编程
hboot1 天前
AI工程师第二课 - 数据处理
人工智能·python·数据分析
ServBay1 天前
打通 AI 编程本地运维边界,利用 MCP 协议简化环境与服务管理
后端·ai编程·mcp
葫芦和十三1 天前
渐进发现|代码库不是文档库
langchain·agent·ai编程
狼爷1 天前
别再迷信 AI 编程王炸组合:OpenSpec+Superpowers 5大实操冲突及解决方案
ai编程
kyriewen1 天前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
用户3521802454751 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
用户8356290780511 天前
使用 Python 自动化 PowerPoint 形状布局与格式设置
后端·python
Awu12271 天前
⚡从零开发 Agent CLI(三):终端样式改造——从 console.log 到交互式 Ink UI
aigc·ai编程