RAG高效召回策略:提升召回质量的关键方法

RAG(Retrieval-Augmented Generation,检索增强生成)系统的性能高度依赖于其召回阶段的质量。高效的召回能力能够确保大语言模型(LLM)获取到最相关、最准确的上下文信息,从而生成高质量的回答。本部分将深入探讨提升RAG召回质量的多种核心策略。

1. 合理设置TOP_K值

在向量检索中,TOP_K参数用于指定召回结果的数量。合理设置TOP_K值是平衡召回率和系统效率的关键。

      docs = knowledgeBase.similarity_search(query, k=10)
    

优化建议:

  • 过小: 可能会遗漏相关文档,导致召回率不足。
  • 过大: 增加后续重排序和LLM处理的负担,影响推理速度和成本,甚至可能引入不相关信息。
  • 动态调整: 考虑根据查询类型、文档库规模或系统资源进行动态调整。例如,对于开放性或模糊查询,可以适当增大K值以增加召回多样性。

2. 优化知识库索引构建

高质量的索引是高效召回的基础。通过改进索引方法,可以增强系统对查询和文档语义的理解。

2.1 知识图谱增强

利用知识图谱(Knowledge Graph, KG)中的语义信息和实体关系,可以显著提升召回的相关性和精确性。

  • 语义理解: 知识图谱能够提供结构化的知识,帮助系统理解查询中的实体、概念及其相互关系。
  • 实体关系: 通过图谱中的边和节点,可以捕获文档之间的隐式关联,从而在召回时发现更深层次的相关内容。
  • 消歧能力: 对于同名异义的实体,知识图谱能够通过上下文关系进行消歧,确保召回的精确性。

3. 引入重排序(Reranking)

重排序是召回阶段的重要后处理步骤,旨在对初步召回的结果进行二次筛选和排序,进一步提升文档与查询的相关性。

重排序模型:
对召回结果进行重排,提升问题和文档的相关性。常见的重排序模型有 BGE-Rerank 和 Cohere Rerank 等。这些模型通常采用更复杂的交叉注意力机制,能够捕捉查询和文档之间的细粒度相关性。

应用场景示例:

  • 用户查询: “如何提高深度学习模型的训练效率?”
  • 初步召回结果: 系统根据向量相似度初步召回10篇文档,其中可能包含与“深度学习”、“训练效率”相关的文章,但排序不一定最优。
  • 重排序过程: BGE-Rerank 对召回的10篇文档进行重新排序。
    • 将与“训练效率”最相关的文档(如“优化深度学习训练的技巧”、“GPU加速训练方法”)排在最前面。
    • 将相关性较低的文档(如“深度学习基础理论”、“神经网络发展史”)排在后面。

混合检索结果的归一化处理:
重排序模型也可以用于归一化处理来自不同召回源(如向量检索和关键词检索)的结果。通过对所有召回结果计算统一的相关性得分并重新排序,可以更好地结合多种检索方法的优势,提升召回质量。

4. 优化查询策略

改进用户查询本身是提升召回效果的直接途径,包括扩展查询范围或改写查询形式。

4.1 多查询生成(Multi-Query Retrieval)

使用大模型将用户原始查询改写成多个语义相近或互补的查询,以增加召回多样性,覆盖用户可能存在的多种意图。

  • 原理: LLM根据原始查询生成多个变体,然后对每个变体执行检索,最后将所有检索结果合并。
  • 优势: 能够有效解决用户查询模糊、简短或存在多种理解方式的问题,增加召回相关文档的概率。
  • 例如: LangChain的 MultiQueryRetriever 支持多查询召回。
      import os
from langchain.retrievers import MultiQueryRetriever
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms import Tongyi

# 初始化大语言模型
# 确保DASHSCOPE_API_KEY已设置在环境变量中
DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")
llm = Tongyi(
    model_name="qwen-max",
    dashscope_api_key=DASHSCOPE_API_KEY
)

# 创建嵌入模型
embeddings = DashScopeEmbeddings(
    model="text-embedding-v3",
    dashscope_api_key=DASHSCOPE_API_KEY
)

# 加载向量数据库
# 注意:生产环境中应谨慎使用allow_dangerous_deserialization=True,确保数据来源安全。
vectorstore = FAISS.load_local("./vector_db", embeddings, allow_dangerous_deserialization=True)

# 创建MultiQueryRetriever
retriever = MultiQueryRetriever.from_llm(
    retriever=vectorstore.as_retriever(),
    llm=llm
)

# 示例查询
query = "客户经理的考核标准是什么?"
# 执行查询
results = retriever.get_relevant_documents(query)

# 打印结果(仅展示部分内容,实际可能更长)
print(f"查询: {query}")
print(f"找到 {len(results)} 个相关文档:")
for i, doc in enumerate(results):
    print(f"\n文档 {i+1}:")
    print(doc.page_content[:200] + "..." if len(doc.page_content) > 200 else doc.page_content)
    

IGNORE_WHEN_COPYING_START content_copy download Use code with caution. Python

IGNORE_WHEN_COPYING_END

输出示例:

      查询: 客户经理的考核标准是什么?
找到 5 个相关文档:

文档 1:
理待遇按照人事部门对付科级的待遇标准; 资深客户经理待遇 按照人
事部门对正科级的待遇标准。  
业绩奖励收入是指客户经理每个业绩考核期间的实际业绩所给
与兑现的奖金部分。  
日常工作绩效收入是按照个金客户经理所从事的事务性工作进
行定量化考核,经过工作的完成情况进行奖金分配。该项奖金主要由
个人金融部总经理和各支行的行长其从事个人金融业务的人员进行
分配,主要侧重分配于从事个金业务的基础工作和...

文档 2:
评聘技术职务较低的市场人员,各级领导要加大培养力度,使其尽快百度文库  - 好好学习,天天向上  
-7 入围,并由所在行制定临时奖励办法。  
 
第七章   考核待遇  
第十五条   个人金融业务客户经理的收入基本由三部分组成: 客
户经理等级基本收入、业绩奖励收入和日常工作绩效收入。  
客户经理等级基本收入是指客户经理的每月基本收入, 基本分为
助理客户经理、客户经理、高级客户经理和资深...
...
    

IGNORE_WHEN_COPYING_START content_copy download Use code with caution.

IGNORE_WHEN_COPYING_END

4.2 双向改写(Query/Doc Rewriting)

双向改写是指将查询改写成文档(Query-to-Doc)或为文档生成查询(Doc-to-Query),旨在解决短文本向量化效果不佳的问题,并增强查询与文档之间的语义匹配。

4.2.1 Query-to-Document (Q2D) 改写

将用户原始查询改写成一段更详细、更具文档风格的描述,使其更能代表潜在相关文档的内容。

  • 目的: 原始查询可能过于简短,无法充分表达用户意图或缺乏足够的上下文信息。通过Q2D改写,将短查询扩展为一段“假想的文档”,使其与数据库中的长文档在语义上更匹配。
  • 示例:
    • 用户查询: “如何提高深度学习模型的训练效率?”
    • Q2D改写(LLM生成):提高深度学习模型的训练效率可以从以下几个方面入手:1. 使用更高效的优化算法,如AdamW或LAMB。2. 采用混合精度训练(Mixed Precision Training),减少显存占用并加速计算。3. 使用分布式训练技术,如数据并行或模型并行。4. 对数据进行预处理和增强,减少训练时的冗余计算。5. 调整学习率调度策略,避免训练过程中的震荡。

4.2.2 Document-to-Query (D2Q) 生成

为文档生成一系列与该文档内容高度相关的、用户可能提出的假设性查询。

  • 目的: 增强文档的可检索性,特别是在用户查询与文档原始表述差异较大时。通过为文档预先生成多种查询,可以提高在查询空间中的召回率。
  • 示例:
    • 原始文档内容: 本文介绍了深度学习模型训练中的优化技巧,包括: 1. 使用AdamW优化器替代传统的SGD。 2. 采用混合精度训练,减少显存占用。 3. 使用分布式训练技术加速大规模模型的训练。 IGNORE_WHEN_COPYING_START content_copy download Use code with caution. TextIGNORE_WHEN_COPYING_END
    • D2Q生成(LLM生成) 一组可能的查询: 1. 如何选择深度学习模型的优化器? 2. 混合精度训练有哪些优势? 3. 分布式训练技术如何加速深度学习? 4. 如何减少深度学习训练中的显存占用? 5. 深度学习模型训练的最佳实践是什么? IGNORE_WHEN_COPYING_START content_copy download Use code with caution. TextIGNORE_WHEN_COPYING_END
    • 召回: 在检索时,可以使用用户查询与这些D2Q生成的查询进行匹配,如果匹配成功,则召回相应的文档。

5. 综合索引策略

结合多种索引类型和检索方法,能够有效提升召回的广度和深度,应对不同类型的查询和文档。

5.1 混合检索(Hybrid Retrieval)

将离散索引(Sparse Indexing,如BM25、关键词匹配)与连续索引(Dense Indexing,如向量检索)相结合,通过融合策略提升召回效果。

  • 优势:
    • 离散索引: 擅长精确匹配关键词,对领域专有名词和长尾查询有良好表现。
    • 连续索引: 擅长语义理解和泛化,能处理同义词、近义词和语义相关性。
    • 互补性: 结合两者可以兼顾关键词精确匹配和语义泛化能力,提高召回的准确性和覆盖率。
  • 实现方式: 通常通过加权融合或Ensemble Retriever等技术,将不同召回源的结果进行归一化和合并。

5.1.1 离散索引扩展

使用关键词抽取、实体识别等技术生成离散索引,与向量检索互补,提升召回准确性。

  • 1. 关键词抽取: 从文档中提取重要的关键词,作为离散索引的一部分,用于补充向量检索的不足。
    • 文档内容: 本文介绍了深度学习模型训练中的优化技巧,包括: 1. 使用AdamW优化器替代传统的SGD。 2. 采用混合精度训练,减少显存占用。 3. 使用分布式训练技术加速大规模模型的训练。 IGNORE_WHEN_COPYING_START content_copy download Use code with caution. TextIGNORE_WHEN_COPYING_END
    • 通过关键词抽取技术(如TF-IDF、TextRank、LlamaIndex关键词提取)提取: ["深度学习", "模型训练", "优化技巧", "AdamW", "混合精度训练", "分布式训练"] IGNORE_WHEN_COPYING_START content_copy download Use code with caution. TextIGNORE_WHEN_COPYING_END
    • 召回场景: 当用户查询“如何优化深度学习模型训练?”时,离散索引中的关键词能够快速匹配到相关文档。
  • 2. 实体识别: 从文档中识别出命名实体(如人名、地点、组织、时间等),作为离散索引的一部分,增强检索的精确性。
    • 文档内容: 2023年诺贝尔物理学奖授予了三位科学家,以表彰他们在量子纠缠领域的研究成果。 IGNORE_WHEN_COPYING_START content_copy download Use code with caution. TextIGNORE_WHEN_COPYING_END
    • 通过实体识别技术(如SpaCy、BERT-based NER)提取: ["2023年", "诺贝尔物理学奖", "量子纠缠"] IGNORE_WHEN_COPYING_START content_copy download Use code with caution. TextIGNORE_WHEN_COPYING_END
    • 召回场景: 当用户查询“2023年诺贝尔物理学奖的获奖者是谁?”时,离散索引中的实体能够快速匹配到相关文档。

5.1.2 连续索引扩展(多模型融合)

结合多种向量模型(如OpenAI的Ada、智源的BGE、阿里通义的text-embedding-v3等)进行多路召回,取长补短,提升召回多样性。

  • 优势: 不同嵌入模型对文本的理解和编码方式可能有所差异,结合多个模型可以捕获更全面的语义信息。
  • 实现: 对同一查询使用多个嵌入模型生成向量,分别进行召回,然后将结果合并后进行重排序。

5.2 Small-to-Big 检索(小-大检索)

Small-to-Big 索引策略: 一种高效的检索方法,特别适用于处理长文档或多文档场景。其核心思想是通过小规模内容(如摘要、关键句或段落)建立索引,并链接到大规模内容主体中。这种策略的优势在于能够快速定位相关的小规模内容,并通过链接获取更详细的上下文信息,从而提高检索效率和答案的逻辑连贯性。

核心机制:

  1. 构建小规模内容索引:
    • 摘要: 从每篇完整论文中提取摘要作为索引内容。
      • 示例:
        • 摘要1:本文介绍了Transformer 模型在机器翻译任务中的应用,并提出了改进的注意力机制。
        • 摘要2:本文探讨了Transformer 模型在文本生成任务中的性能,并与RNN 模型进行了对比。
    • 关键句/关键段落: 从长文档中提取与核心主题相关的关键句或重要段落作为索引。
      • 示例:
        • 关键句1:Transformer 模型通过自注意力机制实现了高效的并行计算。
        • 关键句2:BERT 是基于Transformer 的预训练模型,在多项NLP 任务中取得了显著效果。
    • 这些小规模内容被向量化并构建索引。
  2. 链接到大规模内容:
    • 每个小规模索引单元都与对应的原始大规模内容(如完整的文档、PDF文件)建立明确的链接(例如:文档ID、URL、文件路径)。
    • 大规模内容示例:
      • 论文1:链接到完整的PDF 文档,包含详细的实验和结果。
      • 论文2:链接到完整的PDF 文档,包含模型架构和性能分析。
  3. 检索与上下文补充:
    • 小规模内容检索: 用户输入查询后,系统首先在小规模内容索引中快速检索匹配的内容。
    • 获取大规模上下文: 当小规模内容(如摘要或关键句)匹配到用户的查询后,系统会通过预定义的链接找到对应的大规模原始文档。
    • 上下文填充: 将检索到的大规模原始文档(或其相关片段)作为RAG系统的上下文输入,结合用户查询和小规模内容,提供给LLM进行更详细的回答生成。

优势:

  • 提高检索效率: 对小规模内容进行检索比对整个长文档进行检索更高效。
  • 改善召回精确性: 索引小规模内容有助于更精准地捕获核心语义。
  • 提供完整上下文: 在小规模内容召回后,仍能获取长文档的完整信息,避免截断导致的语义丢失。
  • 应对长文档挑战: 有效解决LLM上下文窗口限制和长文档处理效率低下的问题。

评论

  1. 111
    3 周前
    2025-6-24 16:18:19

    这文章也是ai生成的把

    • 博主
      111
      3 周前
      2025-6-26 11:32:49

      内容是我自己的,ai只是帮我优化一下排版。现在ai有幻觉主体内容还得自己写。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇