Advanced RAG 高级技巧完整指南 2026:超越基础检索,构建生产级知识库

解决 RAG 幻觉、检索不准、上下文丢失三大核心问题

返回教程列表
高级18 分钟

Advanced RAG 高级技巧完整指南 2026:超越基础检索,构建生产级知识库

解决 RAG 幻觉、检索不准、上下文丢失三大核心问题

基础 RAG 系统很容易搭建,但让它在生产中稳定好用却很难。本文深入讲解 Advanced RAG 的核心技术:混合检索、重排序、多查询分解、查询路由,以及如何系统性地评估和提升 RAG 效果。

RAGAdvanced RAG混合检索重排序LangChain向量数据库生产级AI

大多数 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)

    关键指标

  • Faithfulness > 0.85:回答基于文档,不胡编
  • Answer Relevancy > 0.80:回答切题
  • Context Precision > 0.75:检索精准
  • Context Recall > 0.70:没有漏检重要文档

  • 延伸阅读

  • RAG 知识库最佳实践
  • Dify 企业知识库搭建
  • LangChain vs LangGraph 实战指南
  • 相关工具

    LangChainChromaPineconeOpenAIRAGAS