目录
前言
在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%的落地问题。
制作不易,如果对你有帮助请**点赞,评论,收藏,**感谢大家的支持
