Advanced RAG 高级技巧完整指南 2026:超越基础检索,构建生产级知识库
解决 RAG 幻觉、检索不准、上下文丢失三大核心问题
Advanced RAG 高级技巧完整指南 2026:超越基础检索,构建生产级知识库
解决 RAG 幻觉、检索不准、上下文丢失三大核心问题
基础 RAG 系统很容易搭建,但让它在生产中稳定好用却很难。本文深入讲解 Advanced RAG 的核心技术:混合检索、重排序、多查询分解、查询路由,以及如何系统性地评估和提升 RAG 效果。
大多数 RAG 系统的问题不是"无法工作",而是"工作得不够好"——检索到错误的文档、回答时遗漏关键信息、对复杂问题给出不完整的答案。
本文讲解如何解决这些问题。
一、RAG 系统的三大核心问题
问题1:检索不准(召回率/精确率不足)
症状:用户问了一个很明确的问题,但检索到的文档不相关,或者遗漏了最重要的文档。
根本原因:纯向量相似度检索的局限
问题2:上下文窗口不足(Context Stuffing)
症状:塞入太多文档导致 LLM 注意力分散,关键信息被"稀释"。
问题3:查询-文档不匹配
症状:用户问的是一个复杂的多步骤问题,但文档是按单一主题分块的,没有一块文档能完整回答这个问题。
二、混合检索(Hybrid Retrieval)
解决问题1的核心方案:结合向量检索和关键词检索。
python
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma向量检索器
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(embedding_function=embeddings)
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})BM25 关键词检索器
bm25_retriever = BM25Retriever.from_documents(documents)
bm25_retriever.k = 5混合检索(RRF 融合)
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6] # 关键词 40%,向量 60%
)results = ensemble_retriever.invoke("用户查询")
为什么有效:BM25 擅长精确关键词匹配,向量检索擅长语义理解,两者互补。
三、重排序(Reranking)
检索出候选文档后,用更精细的模型重新排序:
python
from sentence_transformers import CrossEncoder使用 Cross-Encoder 重排序(比双塔模型更准确)
reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')def rerank_documents(query, documents, top_k=3):
# 为每对 (query, doc) 打分
pairs = [(query, doc.page_content) for doc in documents]
scores = reranker.predict(pairs)
# 按分数重排序
ranked = sorted(
zip(documents, scores),
key=lambda x: x[1],
reverse=True
)
return [doc for doc, _ in ranked[:top_k]]
先宽松检索,再严格重排
candidates = ensemble_retriever.invoke(query) # 检索 10 个
top_docs = rerank_documents(query, candidates, top_k=3) # 保留 3 个
重排序通常能将准确率提升 15-30%。
四、多查询分解(Multi-Query)
对复杂问题,自动生成多个子查询:
python
from langchain.retrievers.multi_query import MultiQueryRetriever让 LLM 自动生成多个视角的查询
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=ensemble_retriever,
llm=llm
)对于查询 "如何提升 RAG 系统的准确率"
会自动生成:
1. "RAG 检索准确率优化方法"
2. "提高知识库问答质量"
3. "减少 RAG 幻觉的技术方案"
然后合并三个查询的结果,去重
五、查询路由(Query Routing)
不是所有问题都需要检索知识库:
python
def route_query(query):
"""决定如何处理这个查询"""
prompt = f"""判断这个查询应该如何处理:
查询:{query}选项:
knowledge_base - 需要检索内部文档
direct_answer - 通用知识,直接回答
calculation - 需要计算
clarification - 需要澄清问题 返回选项名称,只返回名称。"""
route = llm.invoke(prompt).content.strip()
return route
根据路由结果选择处理方式
query = "我们产品的退款政策是什么?"
route = route_query(query)if route == "knowledge_base":
docs = retriever.invoke(query)
answer = rag_chain.invoke({"query": query, "docs": docs})
elif route == "direct_answer":
answer = llm.invoke(query)
六、RAG 评估体系
不能只凭主观感受判断 RAG 好不好,需要系统性评估:
python
使用 RAGAS 框架评估
from ragas import evaluate
from ragas.metrics import (
faithfulness, # 忠实度:回答是否基于检索文档
answer_relevancy, # 相关性:回答是否回答了问题
context_precision, # 精确率:检索文档是否相关
context_recall # 召回率:是否检索到了必要文档
)构建测试集(20-50个问答对)
test_dataset = {
"question": [...],
"answer": [...], # RAG 系统的回答
"contexts": [...], # 检索到的文档
"ground_truth": [...] # 标准答案
}result = evaluate(test_dataset, metrics=[
faithfulness,
answer_relevancy,
context_precision,
context_recall
])
print(result)
关键指标:
延伸阅读
相关工具