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:本文介绍了Transformer 模型在机器翻译任务中的应用,并提出了改进的注意力机制。
- 摘要2:本文探讨了Transformer 模型在文本生成任务中的性能,并与RNN 模型进行了对比。
- 示例:
- 关键句/关键段落: 从长文档中提取与核心主题相关的关键句或重要段落作为索引。
- 示例:
- 关键句1:Transformer 模型通过自注意力机制实现了高效的并行计算。
- 关键句2:BERT 是基于Transformer 的预训练模型,在多项NLP 任务中取得了显著效果。
- 示例:
- 这些小规模内容被向量化并构建索引。
- 摘要: 从每篇完整论文中提取摘要作为索引内容。
- 链接到大规模内容:
- 每个小规模索引单元都与对应的原始大规模内容(如完整的文档、PDF文件)建立明确的链接(例如:文档ID、URL、文件路径)。
- 大规模内容示例:
- 论文1:链接到完整的PDF 文档,包含详细的实验和结果。
- 论文2:链接到完整的PDF 文档,包含模型架构和性能分析。
- 检索与上下文补充:
- 小规模内容检索: 用户输入查询后,系统首先在小规模内容索引中快速检索匹配的内容。
- 获取大规模上下文: 当小规模内容(如摘要或关键句)匹配到用户的查询后,系统会通过预定义的链接找到对应的大规模原始文档。
- 上下文填充: 将检索到的大规模原始文档(或其相关片段)作为RAG系统的上下文输入,结合用户查询和小规模内容,提供给LLM进行更详细的回答生成。
优势:
- 提高检索效率: 对小规模内容进行检索比对整个长文档进行检索更高效。
- 改善召回精确性: 索引小规模内容有助于更精准地捕获核心语义。
- 提供完整上下文: 在小规模内容召回后,仍能获取长文档的完整信息,避免截断导致的语义丢失。
- 应对长文档挑战: 有效解决LLM上下文窗口限制和长文档处理效率低下的问题。
这文章也是ai生成的把
内容是我自己的,ai只是帮我优化一下排版。现在ai有幻觉主体内容还得自己写。