type
status
date
slug
summary
tags
category
icon
password
1. 融合检索 (Fusion Retrieval)
- 核心动机 (Motivation)
- 传统的单一检索方法各有优劣,难以应对所有类型的查询:
- 向量检索 (Vector Search): 强于理解语义和概念(如“财务报告”和“营收报表”可能被视为相似),但有时会忽略用户查询中必须精确匹配的特定关键词或术语。
- 关键词检索 (Keyword Search / BM25): 强于精确匹配关键词,确保包含特定术语的文档被召回,但无法理解同义词或概念上的相似性,容易漏掉相关但措辞不同的文档。
- 融合检索旨在取长补短,通过结合两种方法,创建一个既能理解语义又能精确匹配关键词的、更稳健、更准确的检索系统。
- 实现方法详解 (Method Details)
- 1. 双重索引构建 (Dual Index Creation):
- 在文档预处理(分块、清洗等)之后,系统需要为同一批文本块构建两个并行的索引:
- a. 向量索引 (Vector Index): 使用
OpenAI Embeddings
等模型将每个文本块转换为向量,并构建一个FAISS
索引,用于进行高效的语义相似度搜索。 - b. 关键词索引 (Keyword Index): 使用完全相同的文本块集合,构建一个
BM25
索引。这是一个经典的稀疏检索引擎,用于进行高效的关键词匹配。 - 2. 融合检索流程 (Fusion Retrieval Process):
- 核心逻辑通常被封装在一个函数中(例如
fusion_retrieval
),其步骤如下: - a. 并行检索 (Parallel Retrieval): 当用户发起一个查询时,系统同时将该查询分别发送给
FAISS
向量库和BM25
索引,各自执行搜索并返回一批结果及其原始分数。 - b. 分数归一化 (Score Normalization): 由于向量相似度分数和 BM25 分数的尺度和范围不同,需要将它们各自归一化到一个通用的尺度上(例如 0 到 1)。
- c. 加权融合 (Weighted Combination): 为每个被检索到的文档,通过一个
alpha
参数来计算其最终的融合分数。公式通常为: alpha
参数控制了语义和关键词的权重,可以根据具体应用场景进行调整。- d. 最终排序 (Final Ranking): 根据计算出的“最终分数”对所有从两种方法中返回的文档进行统一的重新排序,并返回 top-k 个结果。
最终分数 = (alpha * 归一化后的向量分数) + ((1 - alpha) * 归一化后的BM25分数)
- 举例说明 (Illustrative Example)
- 用户查询 (User Query):
- 仅使用向量检索:
- 可能会返回一篇详细描述“苹果在机器学习方面的研究”或“Siri智能助手新功能”的文档,即便文中很少提及“人工智能”这个词。它理解了概念,但可能丢失了关键词。
- 仅使用BM25检索:
- 可能会返回一篇多次出现“苹果”和“人工智能”这两个词的新闻稿,但可能会错过一篇更高质量的、探讨“库比蒂诺巨头在A.I.的探索”的技术博客。它匹配了关键词,但可能丢失了语义。
- 融合检索的结果:
- 一篇既在语义上高度相关(向量分数高),又明确包含了“苹果”和“人工智能”等关键词(BM25分数高)的文档,其最终的融合分数将会最高。这样,系统就能返回最理想的结果,既贴合主题概念,又包含用户明确指定的术语。
"关于苹果公司在人工智能领域的最新进展"
- 主要优势 (Key Benefits)
- 提升检索质量: 通过结合语义与关键词搜索,系统能够同时捕捉到概念上的相似性和文本上的精确匹配。
- 灵活性:
alpha
参数允许开发者根据具体用例或查询类型,灵活地调整向量搜索和关键词搜索之间的平衡。 - 稳健性: 组合方法能够有效处理更广泛类型的查询,弥补了单一方法的短板。
- 可定制性: 系统可以轻松地替换或调整其中使用的向量存储或关键词检索方法。
2.重排序模型 ( Reranking)
- 核心动机 (Motivation)
- 在
RAG
系统中引入重排序的主要动机,是为了克服初步检索方法(如向量搜索)的局限性。初步检索通常依赖于较为简单的相似度指标,可能会错失查询与文档之间更细微、更复杂的关联。重排序则允许系统采用更精密、更强大的模型进行二次相关性评估,从而确保最终送入生成阶段的上下文信息是最高质量的,进而提升RAG
系统的整体性能。
- 实现方法详解 (Method Details)
- 重排序通常将检索过程升级为一个“两阶段”模式:
- 1. 第一阶段:召回 (Recall / Initial Retrieval):
- 首先,使用一种速度快、计算成本低的检索方法(如
FAISS
向量搜索),从海量文档中快速召回一个相对较大的候选集(例如,top 50 个文档)。这个阶段的目标是“宁可错杀,不可放过”,保证相关文档大概率包含在这个候选集内。 - 2. 第二阶段:精排 (Precision / Reranking):
- 接着,使用一个更强大、更精确但计算成本更高的模型,对第一阶段召回的候选集进行重新打分和排序。这个“重排序模型”会逐一评估“用户查询”与每个“候选文档”之间的真实相关性。
- 两种主流的重排序模型:
- a. 基于大语言模型 (LLM-based) 的重排序:
- 原理: 通过精心设计的提示 (Prompt),直接请求一个强大的 LLM(如
GPT-4
)为每个“查询-文档”对的相关性打分(例如,给出1到10分的相关性评分)。 - 优点: 非常灵活,无需专门训练模型,可以直接利用现有的大模型能力。
- 缺点: 推理速度相对较慢,API 调用成本较高,且打分结果可能受到提示语设计的微妙影响。
- b. 基于交叉编码器 (Cross-Encoder) 的重排序:
- 原理: 将“查询”和“候选文档”同时输入到一个专门为相关性判断任务训练过的深度学习模型(即交叉编码器)中。模型通过内部复杂的注意力机制,深度分析两者之间的交互关系,并直接输出一个精确的相关性分数。
- 优点: 通常被认为是当前精度最高的重排序方法之一,效果非常出色。
- 缺点: 需要加载一个专门的重排序模型,计算开销比向量检索大(但通常比 LLM 打分的方式更快、成本更低)。
- 举例说明 (Illustrative Example)
- 用户查询 (User Query):
- 第一阶段:召回 (Initial Retrieval - Top 20):
- 向量搜索可能会返回一个内容宽泛的列表,包括:关于 MacBook Pro 电池的评测、关于 MacBook Air 电池的评测、关于 iPhone 电池的新闻(因为包含“苹果”和“电池”)、一篇通用的笔记本电池保养技巧文章等。召回的结果很全,但包含了不那么相关甚至无关的内容。
- 第二阶段:重排序 (Reranking Process):
- 重排序模型会逐一评估这20个文档与查询的真正相关性。
- 它会给 MacBook Pro 和 MacBook Air 的电池评测文章打出非常高的分数。
- 同时,它会识别出“iPhone 电池”与“笔记本”这个核心概念不匹配,以及“通用保养技巧”并非在回答续航“怎么样”的问题,因此给这两篇文档打出非常低的分数。
- 最终结果 (Final Top-3 Results):
- 经过重排序后,返回给 LLM 的最终 top-3 上下文会是排序精准且高度相关的文档,例如:1. MacBook Pro 16英寸深度续航评测, 2. MacBook Air M3 日常使用电池测试, 3. 苹果官网MacBook电池技术规格页。所有不相关的“噪音”文档都被成功过滤掉了。
"苹果笔记本的电池续航怎么样?"
- 主要优势 (Key Benefits)
- 提升相关性: 通过使用更强大的模型,重排序能捕捉到初步检索忽略的细微相关性因素。
- 提升上下文质量: 为
RAG
的生成环节提供更高质量、更精准的上下文,直接提升最终答案的质量。 - 降低噪音: 有效地过滤掉初步检索结果中相关性较低的信息,让系统更专注于核心内容。
- 灵活性: 可以根据不同的需求、预算和性能要求,选择基于 LLM 或基于交叉编码器的不同重排序策略。
3. 多方面过滤 (Multi-faceted Filtering)
- 概述 🔎 应用各种过滤技术来提炼和提高检索结果的质量。
- 实现 🛠️
- 元数据过滤: 根据日期、来源、作者等属性应用过滤器。
- 相似度阈值: 设置相关性得分的阈值,只保留最相关的结果。
- 举例说明 💡
- 场景: 在新闻数据库中搜索。
- 用户提问: "告诉我马斯克最近一周关于AI的新闻。"
- RAG流程:
- 系统首先进行语义检索,找到所有关于“马斯克”和“AI”的新闻。
- 元数据过滤: 然后,它应用一个过滤器,只保留
date
(日期)在过去7天内的结果。 - 来源过滤: 用户还可以指定只看来自“路透社”、“美联社”等权威来源的新闻。
- 最终返回给LLM的是经过多重过滤后的、高度相关的文档。
4. 分层索引 (Hierarchical Indices)
- 核心动机 (Motivation)
- 传统的“扁平化索引”方法在处理大型文档或海量文档集时常常会遇到困难,可能会因缺乏宏观视角而错失上下文,或返回不相关的零散信息。分层索引通过创建一个双层搜索系统来解决这一问题,从而实现更高效、更具上下文感知能力的检索。
- 实现方法详解 (Method Details)
- 该方法的实现分为“索引构建”和“分层检索”两个主要阶段。
- 1. 索引构建阶段 (Indexing Phase):
- a. 初始文档切分: 首先,将 PDF 等原始文档切分为较大的逻辑单元(例如,按页或按章节切分)。
- b. 摘要生成: 利用一个强大的 LLM(如
GPT-4
),以异步方式为每一个较大的逻辑单元生成一份简明扼要的摘要。采用异步处理、批处理和指数退避策略可以有效管理 API 的速率限制。 - c. 精细化分块: 与此同时,将原始的较大逻辑单元进一步切分为更小、更精细的文本块 (chunks)。
- d. 构建双重向量库 (Creating Dual Vector Stores):
- 摘要库 (Summary Store): 将所有生成的摘要进行向量化,并构建一个
FAISS
向量存储。 - 精细块库 (Chunk Store): 将所有精细文本块进行向量化,并构建另一个独立的
FAISS
向量存储。在这一步,至关重要的是,每个精细块的向量都必须包含元数据,以标明它隶属于哪个上层逻辑单元(例如,页码)。 - 2. 分层检索流程 (Hierarchical Retrieval Process):
- 核心逻辑被封装在一个自定义函数中(例如
retrieve_hierarchical
),其检索分为两步: - a. 第一步:搜索摘要库: 当用户发起查询时,系统首先在摘要库中进行搜索。由于摘要库规模小且内容高度概括,这一步能非常快速地定位出哪些宏观章节或页面与查询最相关。
- b. 第二步:过滤并搜索精细块库: 系统根据第一步返回的相关摘要,确定其所属的父级文档单元(例如,识别出第35页是相关的)。然后,系统在精细块库中执行第二次搜索,但这次会利用元数据进行过滤,使得搜索范围仅限于那些隶属于第35页的文本块。
- c. 返回结果: 最终,系统返回的是从最相关的文档章节中精准定位到的、具体的细节文本块。
- 举例说明 (Illustrative Example)
- 场景:
- 一份长达100页的公司年度报告。
- 索引构建:
- 系统为每一页生成一份摘要,创建了一个包含100个摘要向量的“摘要库”。
- 同时,系统将这100页内容切分成了1000个更小的精细文本块,创建了一个包含1000个块向量(且每个向量都带有页码元数据)的“精细块库”。
- 用户查询:
- 分层检索流程:
- 1. 搜索摘要: 查询首先在仅有100个条目的“摘要库”中进行。系统迅速发现,第35页的摘要(例如,内容为“本页总结了第二季度的财务报表,包括营收、成本和各项开支……”)与查询最相关。
- 2. 聚焦搜索: 系统现在已经知道答案在第35页。它接着在庞大的“精细块库”(1000个条目)中进行第二次搜索,但通过元数据过滤,搜索范围被限定在仅有的、属于第35页的10个文本块中。
- 3. 定位结果: 在这10个文本块中,系统可以非常精准地找到包含“营销开支”这一具体项目的那一块文本。
- 优势:
- 整个过程避免了在全部1000个精细文本块中进行盲目搜索,而是通过两步走的方式,极大地缩小了搜索范围,从而在保证精度的同时,显著提升了检索速度。
"第二季度的营销开支具体是多少?"
- 主要特性与优势 (Key Benefits)
- 提升检索效率: 通过先搜索摘要来快速缩小范围,避免了对所有精细块的暴力搜索。
- 更好的上下文保留: 分层方法有助于在返回具体细节的同时,保留其所属的宏观上下文信息。
- 可扩展性: 该方法尤其适用于大型文档或海量文档集,在这些场景下,扁平化搜索的效率和效果会急剧下降。
- 灵活性: 可以灵活调整摘要和精细块的检索数量,以便针对不同用例进行微调。
5. 集成检索 (Ensemble Retrieval)
- 概述 🔎 结合多个检索模型或技术,以获得更稳健和准确的结果。
- 实现 🛠️ 应用不同的嵌入模型或检索算法,并使用投票或加权机制来确定最终的检索文档集。
- 举例说明 💡
- 场景: 构建一个通用的问答系统。
- 集成检索:
- 模型A: 一个在通用文本上训练的嵌入模型 (如 OpenAI
text-embedding-3-large
)。 - 模型B: 一个在科学文献上微调的嵌入模型。
- 用户提问: "黑洞的史瓦西半径是什么?"
- 流程: 系统同时使用模型A和模型B进行检索。模型B可能会找到更专业、更准确的物理学论文,而模型A可能会找到一些通俗易懂的科普文章。集成检索将两者的结果结合,为LLM提供既专业又易于理解的材料。
6. 靶盘检索 (Dartboard Retrieval)
- 核心动机 (Motivation)
- 应对内容重叠的知识库: 在大型数据库中,不同文档可能会重复或阐述相似的内容,这会导致传统的 top-k 检索返回大量冗余信息。
- 提升信息覆盖度: 通过结合相关性与多样性,系统能够产出一个内容更丰富的文档集,有效缓解因内容过于相似而产生的“回音室效应”,为下游的 LLM 提供更全面的视角。
- 实现方法详解 (Method Details)
- 该方法的核心是一种迭代式的选择算法,类似于投掷飞镖(先射向靶心,再有策略地射向其他区域)。
- 1. 初始候选集获取 (Initial Candidate Retrieval):
- 首先,通过标准的检索方法(如向量搜索、BM25或融合检索)从知识库中获取一个较大的初始候选集(例如,top-N 个文档)。
- 2. 迭代式评分与选择流程 (Iterative Scoring & Selection):
- 这是一个循环选择的过程,直到选出 k 个文档为止:
- a. 第一步 (选择最佳相关项): 从当前的候选集中,选出与用户查询相关性最高的文档,将其作为第一个(或下一个)最终结果,并将其从候选集中移除。
- b. 第二步 (惩罚相似项): 对于剩余的候选文档,系统会计算它们与刚刚被选中的那个文档之间的相似度。然后,根据这个相似度,对它们的原始相关性分数进行惩罚或降权。一个文档与已选中的文档越相似,其多样性就越低,其最终得分在这一轮中就会变得越低。
- c. 第三步 (循环选择): 重复第一步和第二步,即在经过多样性惩罚、分数重新计算后的剩余候选文档中,再次选出得分最高的文档。
- 3. 加权平衡 (Weighted Balancing):
- 在计算最终得分时,可以通过
RELEVANCE_WEIGHT
(相关性权重) 和DIVERSITY_WEIGHT
(多样性权重) 这两个参数,来动态控制评分机制,从而避免因过度追求多样性而选中不相关的结果。 - 4. 对其他检索方法的支持:
- 此算法的本质只需要两样东西:查询与文档之间的距离(用于衡量相关性)和文档与文档之间的距离(用于衡量多样性)。因此,它可以轻松地与其他高级检索方法结合:
- 对于融合检索: 可以通过合并密集向量(语义)和稀疏向量(关键词)的相似度(例如取平均值)来获得统一的距离度量。
- 对于交叉编码器 (Cross-Encoders): 可以直接使用其输出的相关性分数(用
1 - score
转换为距离),并可能通过一些缩放因子进行调整。
- 举例说明 (Illustrative Example)(1)
- 用户查询 (User Query):
- 传统 Top-3 检索结果:
- 一篇详细介绍
M3
芯片技术规格的文章(相关性: 0.95)。 - 一篇内容几乎重叠的、关于
M3
芯片的评测报告(相关性: 0.94)。 - 一篇关于
M3 Pro
芯片发布的新闻稿(相关性: 0.92)。 - 问题: 结果虽然高度相关,但前两篇内容冗余,信息增益很小。
- Dartboard RAG 的 Top-3 检索结果:
- 1. 第一次选择: 系统选出相关性最高的“
M3
芯片技术规格文章”(相关性: 0.95)。 - 2. 第二次选择:
- “
M3
芯片评测报告”因其内容与已选中的第一篇高度相似,其多样性得分极低,导致其最终得分被大幅惩罚。 - 此时,一篇介绍“
M2
芯片架构”的文档,虽然其原始相关性可能只有 0.88,但因为它与第一篇内容差异大、多样性高,其最终得分可能反超被惩罚的“M3
评测报告”,从而被选为第二个结果。 - 3. 第三次选择: 同理,一篇介绍“
M1
芯片能效比”的文档可能因其高多样性而被选中。 - 最终上下文:
- 最终的上下文组合可能是
[M3技术规格, M2芯片架构, M1能效比]
。这个组合既保证了与查询的相关性,又通过多样性选择提供了更全面、更有价值的信息。
"介绍苹果公司的M系列芯片"
- 举例说明 (Illustrative Example)(2)
- 场景: 用户想了解“可持续能源”。
- 标准RAG: 可能会返回10篇都讲“太阳能”的文档,因为它们与查询最相关。
- 飞镖靶检索: 在选择第一个关于“太阳能”的文档后,它会降低其他“太阳能”文档的优先级,转而选择关于“风能”、“水力发电”、“地热能”等其他相关但不同方面的文档。这样,LLM就能获得一个关于可持续能源的更全面的图景。
7. 多模态检索 (Multi-modal Retrieval)
- 核心动机 (Motivation)
- 现实世界中的文档(如研究报告、产品手册、财务报表)通常包含大量的图表、图片和表格等非文本信息。传统
RAG
系统只能处理文本,完全忽略了这些视觉内容中蕴含的丰富信息。多模态RAG
的动机就是为了高效地总结和理解这些复杂的复合型文档,以便为用户提供更全面、更精准的检索和问答服务。
- 核心组件与技术栈 (Key Components & Tech Stack)
PyMuPDF
: 一个强大的 Python 库,用于从 PDF 文件中精准地提取文本、图像和表格等元素。Gemini 1.5-flash
模型: 一个先进的多模态大语言模型,其核心作用是“阅读”并用文本语言来总结图像和表格的内容。Cohere Embeddings
: 用于为所有文本内容(包括原始文本和视觉内容的文本摘要)生成高质量的嵌入向量。Chroma Vectorstore
: 一个向量数据库,用于存储和检索所有内容的嵌入向量。LangChain
: 用于编排和串联整个数据处理、检索、生成的流水线。
- 实现方法详解 (Method Details)
- 1. 多模态内容提取 (Multi-modal Content Extraction):
- 首先,使用
PyMuPDF
遍历整个 PDF 文档,将其中的纯文本块和**视觉元素(如图像、图表、表格)**分门别类地提取出来。 - 2. 视觉内容文本化 (Textualizing Visual Content):
- 这是多模态处理的核心步骤。将上一步提取出的每一个独立的图像和表格,输入到
Gemini 1.5-flash
模型中。 Gemini
会对这些视觉内容进行“解读”,并生成一段描述其核心信息的文本摘要。例如,它能将一张营收增长的条形图,转化为一段文字描述,如:“一张条形图,显示了公司第二季度的营收为500万美元,相比第一季度有显著增长。”- 3. 统一索引构建 (Unified Indexing):
- 经过上一步处理后,文档中所有的信息(无论是原始文本还是视觉元素)都被统一转换为了文本格式。
- 接着,使用
Cohere Embeddings
为所有这些文本内容(原始文本块 + 图像/表格的文本摘要)生成向量。 - 最后,将所有这些向量存入
Chroma
向量数据库中,完成索引构建。 - 4. 检索与生成 (Retrieval & Generation):
- 当用户发起一个查询时(例如,“第二季度的营收表现如何?”),系统在
Chroma
中进行标准的向量搜索。 - 由于图像的文本摘要也被索引了,系统不仅能找到相关的文本段落,还能找到描述相关图表的摘要文本。
- 将所有检索到的文本内容作为统一的上下文,提交给最终的 LLM(也可以是
Gemini
),生成一个综合了文本和视觉信息的精准答案。
- 举例说明 (Illustrative Example)
- 源文档内容:
- 某公司财报的一页,其中包含一段文字:“我们在第二季度采取了有效的市场策略,取得了强劲的业绩增长。”,紧接着下方是一张条形图,清晰地展示了具体的营收数字。
- 传统 RAG 的局限:
- 只能索引那段模糊的文字,当用户问“第二季度具体营收是多少?”时,它无法回答,因为它“看不见”那张图。
- 多模态 RAG 的处理流程:
- 1. 提取与摘要: 系统提取出文字,并用
Gemini
分析条形图,生成摘要:"图表显示,第二季度营收达到500万美元,比第一季度的300万美元增长了66%。"
- 2. 索引: 系统将文字和上述的图表摘要,都作为独立的文本块进行向量化并存储。
- 3. 检索: 当用户问“第二季度具体营收是多少?”时,这个查询的向量会与图表摘要的向量产生极高的相似度。
- 4. 回答: 系统将图表摘要作为上下文,从而能够精准地回答:“第二季度的营收为500万美元。”
- 优势:
- 系统成功地从图像中“提取”并回答了问题,实现了对整个文档的全面理解。
- 主要优势 (Key Benefits)
- 简化复杂文档的检索: 让用户可以像查询纯文本文档一样,轻松地从包含图文的复杂文档中检索信息。
- 统一的问答流程: 为文本和图像内容提供了无缝、统一的问答体验。
- 灵活的架构: 该架构易于扩展,可以方便地接入更多类型的文档(如Word、PPT)或不同类型的多模态模型。
- 作者:SimonSun
- 链接:https://simonsun.xyz//article/rag-6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章