RAG优化

RAG优化:文档知识准备阶段的关键步骤

在构建基于 RAG(Retrieval-Augmented Generation)技术的系统时,文档知识准备是至关重要的一步。为了确保模型能够高效、准确地从知识库中检索并生成答案,我们需要对原始数据进行清洗、优化和增强。本文将详细探讨文档知识准备阶段的关键步骤,帮助大家更好地理解和实践这一过程。


数据清洗

RAG 的性能高度依赖于知识数据的准确性和清洁程度。在数据清洗过程中,我们需要关注以下几个方面:

1. 确保数据的准确性

为了保证数据的准确性,我们需要优化文档读取器和多模态模型。特别是在处理如 CSV 表格等文件时,单纯的文本转换可能会导致表格原有结构的丢失。因此,我们需要引入额外的机制,在文本中恢复表格结构。例如,可以使用分号或其他符号来区分数据,从而保留表格的逻辑关系。

2. 基本数据清理

对知识文档进行基本的数据清理是必不可少的一步,其中包括:

3. 实体解析

在知识库中,不同术语可能会指代相同的实体或概念。为了避免歧义,我们需要对实体和术语进行标准化处理。例如:


文档划分

合理划分文档是提升检索效率的重要环节。我们需要思考以下问题:


数据增强

为了提升语料库的多样性和覆盖范围,可以采用以下数据增强方法:


用户反馈循环

现实世界用户的反馈是优化知识库的重要依据。通过收集用户在实际使用中的反馈,我们可以:

这种循环机制能够帮助我们不断改进知识库,使其更加贴合用户需求。


时间敏感数据处理

对于一些经常更新的主题,例如新闻、科技动态等,我们需要设计一套机制来管理时间敏感的数据:


解析PDF文件的主流方法详解

在构建RAG(Retrieval-Augmented Generation)系统时,最麻烦的莫过于构建知识库,而一个完美的知识库是实现检索精准的关键。今天,我们就来聊一聊目前有哪些主流的PDF解析手段,以及它们的优缺点和适用场景。


一、基于规则的解析算法

方法简介

在Langchain中,默认使用的PDF解析算法是 pypdf。其主要原理是根据PDF页面中的文本对象的坐标和布局信息,按照一定的顺序提取文本内容,尽可能保持原文档中的文本顺序和格式。

优点

缺点


二、基于多模态大模型的解析技术

方法简介

该方法直接利用 VLM(Vision-Language Model) 对PDF信息进行抽取。其核心在于如何编写一个完备的prompt,以及如何评估抽取结果的准确性。

可选的基座模型

目前,许多大模型都可以作为基座模型使用,这里需要根据具体需求选择适合的模型。

Prompt示例

以下是一个效果较好的prompt示例(需注意,do_sample 参数需设置为 False):

"As a professional OCR expert, analyze the provided document/images and extract text with 100% fidelity. For multi-page PDFs, maintain page separation using clear markers. Preserve original layouts including paragraphs, lists, tables using appropriate delimiters. Convert formulas to LaTeX (preferred) with context notation for complex equations. Retain original formatting styles (bold/italic) using Markdown. Flag low-confidence text regions with xxx. Exclude headers/footers unless specified. Never modify/add content."

优势与挑战


三、多级标题如何处理

为什么要处理多级标题?

具体做法

  1. 使用OCR工具提取标题区块文字
    推荐使用 Layout-parse 工具,但其缺点是速度较慢。
    不建议使用 unstructured 工具,因为其效果较差,且会将许多公式误识别为标题。

  2. 存储标题信息
    将检测出的所有标题存储为一个列表。

  3. 判断标题层级
    利用标题区块的高度来判断哪些是一级标题、二级标题或三级标题。例如,unstructured工具的fast模式会按照文字边界切分,同一级标题区块的高度误差在 0.001 之间。因此,只需要利用unstructured获取标题高度值即可完成层级判断。


四、好用的PDF文件解析工具推荐

以下是一些常用且好用的PDF文件解析工具:

  1. Deepdoc
  2. TextMonkey
  3. OLMOCR
  4. Pandoc
  5. Pymupdf
  6. Mathpix
  7. Docling
  8. Marker

这些工具各有特点,可以根据具体需求选择合适的工具。例如,Mathpix在公式识别方面表现出色,而Pandoc则适用于文档格式转换。


文本分块策略

在构建 RAG(Retrieval-Augmented Generation)系统时,文档需要被分割成多个文本块后再进行向量嵌入。这一过程的核心目标是在保持语义连贯性的同时,尽可能减少嵌入内容中的噪声,从而更高效地找到与用户查询最相关的文档部分。本文将详细探讨文本分块策略的重要性及其对大模型输出的影响。


文本分块策略的意义

在 RAG 系统中,文本分块的策略直接影响检索和生成的效果。如果分块过大,可能包含大量不相关的信息,从而降低了检索的准确性;而分块过小则可能丢失必要的上下文信息,导致生成的回答缺乏连贯性或深度。因此,实施适当的文档分块策略的目标是在信息完整性和相关性之间找到平衡

理想文本块的特性

一般来说,一个理想的文本块应该满足以下条件:

  1. 语义独立性:在没有周围上下文的情况下,对人类来说仍然有意义。
  2. 模型可理解性:保持语义清晰,便于语言模型处理和理解。

这种设计方式不仅有助于提高检索的精确度,还能提升大模型生成回答的质量。


文本分块策略对大模型输出的影响

将长文档拆分为适合检索的“段落”是 RAG 系统成功的关键之一。一个良好的分块策略能够让每个文本片段既包含足够的信息来回答某类问题,又不会过长以至于增加噪声或使向量表示模糊不清。

文本分块过长的影响

在构建 RAG 系统时,过长的文本块会带来一系列问题:

1. 语义模糊

当文本块过长时,在向量化过程中,细节语义信息容易被平均化或淡化。这是因为向量化模型需要将大量词汇信息压缩成固定长度的向量表示,导致无法精准捕捉文本的核心主题和关键细节。结果是生成的向量难以代表文本的重要内容,从而降低了模型对文本理解的准确性。

2. 降低召回精度

在检索阶段,系统需要根据用户的查询从向量数据库中检索相关文本。过长的文本块可能涵盖多个主题或观点,增加了语义的复杂性,导致检索模型难以准确匹配用户的查询意图。这会直接导致召回结果的相关性下降,从而影响大模型生成答案的质量。

3. 输入受限

大语言模型(LLM)对输入长度有严格限制。过长的文本块会占据更多输入空间,减少可供输入的大模型的文本块数量。这种限制可能导致遗漏重要上下文或相关信息,从而影响最终回答效果。

文本分块过短的影响

相反,过短的文本块也会对大模型输出产生不利影响,其具体表现为:

1. 上下文缺失

短文本块可能缺乏必要的上下文信息。而上下文对于理解语言意义至关重要。缺乏上下文的信息会让模型难以准确理解文本内容,从而影响生成回答的连贯性和准确性。

2.主题信息丢失

段落或章节级别的主题信息需要一定的文本长度来表达。过短的文本块可能只包含片段信息,无法完整传达主要观点或核心概念,影响模型对整体内容的把握。


3.碎片化问题

大量的短文本块会导致信息碎片化,增加检索和处理的复杂度。系统需要处理更多的文本块,增加了计算和存储的开销。同时,过多的碎片化信息可能会干扰模型的判断,降低系统性能和回答质量。


如何制定合适的文本分块策略?

在实际应用中,为了取得最佳效果,可以参考以下原则来制定文本分块策略:

  1. 基于语义单元划分:尽可能以自然段落、句子组或主题为单位进行划分,确保每个文本块具有相对独立的语义。
  2. 控制文本长度:根据具体任务需求设置文本块长度范围,既不过短导致上下文缺失,也不过长引入多余噪声。
  3. 测试与优化:通过实验不断调整分块策略,分析不同长度和划分方式对检索和生成效果的影响。

常见文本分块策略

在自然语言处理和文本处理的过程中,分块(Chunking)是一项非常重要的技术。分块的目标是将大段的文本划分为更小的块,以便更高效地进行处理和分析。本文将详细介绍几种常见的文本分块策略,包括其特点、适用场景以及优缺点。


固定大小的分块

固定大小的分块是最简单和直接的方法。在这种策略中,我们直接设定每个块中包含的字数,并决定块之间是否需要重叠内容。通常,为了避免语义上下文在块之间丢失,我们会让相邻的块之间保持一定程度的重叠。

优点

缺点

固定大小分块适用于对上下文要求不高或对计算资源有限制的场景。

>固定长度分块

内容分块

内容分块是根据文档的具体内容进行分割。例如,可以根据标点符号(如句号)将文本分割为句子,或者利用更高级的自然语言处理工具库(如 NLTK 或 spaCy)提供的句子分割功能,进行更精确的分块。

优点

缺点

这种策略对于需要保留语义连贯性的文档处理任务非常有用,例如问答系统和摘要生成。

>基于语义分块

递归分块

递归分块是一种推荐程度较高的方法。通过重复应用分块规则,递归地将文本分解为更小的块。例如,使用 langchain 库时,可以按照以下步骤进行递归分块:

  1. 首先,根据段落换行符(\n\n)进行初步分割。
  2. 检查每个块的大小。如果某个块的大小超过预设阈值,则对其使用单换行符(\n)再次进行分割。
  3. 如果仍然超过阈值,则进一步根据空格、句号等更细粒度的规则进行分割。
  4. 不断调整规则,直到满足块大小的要求。

优点

缺点

递归分块适合对语义保留要求高、文本结构复杂且信息密度变化较大的场景。


从小到大分块

小的分块和大的分块各有优势,因此一种更直接的解决方案是将同一文档按照从大到小的所有尺寸进行分块。然后,将不同大小的分块全部存储到向量数据库中,并保存每个分块之间的上下级关系,以便支持递归搜索。

优点

缺点

这种方法适用于需要多粒度语义查询的场景,例如知识图谱构建和复杂问题解答。


特殊结构分块

针对特定结构化内容(如代码、Markdown 文件、LaTeX 文件)的专门分块器,可以确保正确地保留和理解这些文档的结构。例如,langchain 提供了以下特殊分块器:

优点

缺点

这种方法适合处理具有明确结构化特征的文本,如技术文档、代码库和学术论文等。


分块大小的选择

选择合适的分块大小是影响文本处理效果的重要因素。以下是几个需要考虑的重要因素:

  1. 嵌入模型
    不同嵌入模型有其最佳输入大小。例如,OpenAI 的 text-embedding-ada-002 模型在 256 或 512 大小的块上表现最佳。因此,在使用这些模型时,应尽量选择与其匹配的分块大小。

  2. 文档类型
    文档类型决定了上下文保留的重要性:

    • 对于长篇文章或书籍,较大的分块有助于保留更多上下文和主题连贯性。
    • 对于社交媒体帖子等短文本,较小的分块可能更适合捕捉每个帖子的精确语义。
  3. 用户查询长度及复杂性

    • 如果用户查询通常简短且具体,则较小的分块可能更合适。
    • 如果用户查询较为复杂,则可能需要更大的分块来确保足够的信息量支持答案生成。

综上所述,选择合适的分块大小需要综合考虑嵌入模型、文档类型以及用户查询特点等多方面因素。


Embedding模型阶段

嵌入模型(Embedding Model)是一种能够将文本转换为高维向量表示的工具。通过这种方式,文本的语义信息得以以数值化的形式表示,便于计算机进行处理和分析。

不同嵌入模型的效果差异

不同的嵌入模型在效果上可能存在显著差异,因此选择合适的模型对于具体任务至关重要。推荐参考 Hugging Face 的嵌入模型排行榜 MTEB,该排行榜提供了关于各种嵌入模型性能的详细对比,能够帮助我们根据实际需求选择最优的解决方案。


向量数据库阶段

在完成文本向量化后,向量数据库(Vector Database)成为存储和检索这些向量的重要工具。在这一阶段,元数据的引入可以显著提升检索效率和用户体验。

元数据的作用

元数据是指与向量关联的非向量化数据。在向量数据库中,某些数据库支持将向量和元数据一同存储。为向量添加元数据标注是一种有效的策略,它在提高检索效率和优化搜索结果方面起着关键作用。

示例:日期作为元数据标签

日期是一个常见且实用的元数据标签。它能够帮助我们根据时间顺序对搜索结果进行筛选。例如:

假设我们正在开发一款允许用户查询电子邮件历史记录的应用程序。在这种情况下,日期最近的电子邮件可能更符合用户的查询需求。然而,从嵌入向量的角度来看,我们无法直接判断这些邮件与用户查询之间的相似度。

通过将每封电子邮件的日期作为元数据附加到其嵌入向量中,我们可以在检索过程中优先考虑日期最近的邮件,从而显著提高搜索结果的相关性。这种方法结合了语义匹配和时间排序,为用户提供了更精准的搜索体验。

其他元数据类型

除了日期,还可以添加以下类型的元数据:

这些元数据不仅能够提升知识检索的准确性,还能为最终用户提供更加丰富和精确的搜索体验。例如,通过关键词标注,可以快速定位与用户查询高度相关的小节内容。


RAG优化中查询索引阶段

生成回答阶段的设计与优化

在构建基于大型语言模型(LLM)的系统时,生成回答阶段是一个至关重要的环节。LLM 的解码器部分通常基于给定输入来预测下一个词,这意味着提示词的设计会直接影响模型的输出质量和行为表现。本文将探讨如何通过提示词设计、模型选择以及 RAG 系统的构建来优化 LLM 的生成回答阶段。


提示词设计的关键要点

提示词对模型行为的影响

大型语言模型的解码器部分通过预测下一个词来生成完整的回答。因此,提示词(Prompt)的设计方式会显著影响模型预测下一个词的概率。这给我们带来了一些启示:通过调整提示词的形式,可以有效地影响模型对不同类型问题的接受程度和回答方式。

例如,通过修改提示词,可以让 LLM 更清楚地知道它正在执行的任务。这种方式不仅能够帮助模型更准确地理解用户意图,还能减少生成回答过程中的不确定性。

减少主观性和幻觉的提示词策略

为了减少模型产生主观回答和幻觉(hallucination)的概率,在 RAG(Retrieval-Augmented Generation)系统中,提示词应明确指出回答仅基于检索到的信息,而不应包含任何其他主观推测。例如,可以设置如下提示词:

你是一名智能客服。你的目标是提供准确的信息,并尽可能帮助提问者解决问题。你应保持友善,但不要过于啰嗦。请根据提供的上下文信息,在不考虑已有知识的情况下,回答相关查询。

这一提示明确了模型的角色、目标以及回答依据,能够有效减少模型生成主观性内容的可能性。

动态调整提示词以适应场景需求

当然,根据具体场景需求,我们也可以适当让模型的回答融入一些主观性或其对知识的理解。此外,还可以使用少量样本(Few-Shot Learning)的方式,将希望生成的问答示例加入提示词中,以指导 LLM 如何利用检索到的信息。这种方法不仅能使模型的回答更加精准,还能显著提升其在特定情境下的实用性。


模型选择与开发框架

根据需求选择合适的 LLM

在选择 LLM 时,可以根据以下几个关键因素进行决策:

  1. 开放模型与专有模型:根据预算和数据隐私需求,选择开源模型(如 GPT-Neo、LLaMA)或专有模型(如 OpenAI 的 GPT-4)。
  2. 推理成本:不同模型在推理阶段所需的计算资源和时间可能差别较大,需要根据实际应用场景权衡。
  3. 上下文长度:一些任务可能需要处理长文本上下文,因此需要选择支持较长上下文长度的模型。

使用开发框架搭建 RAG 系统

为了更高效地搭建 RAG 系统,可以借助一些 LLM 开发框架,例如:

这些框架通常配备了调试工具,可以帮助开发者定义回调函数,查看使用了哪些上下文,检查检索结果来自哪个文档等,从而确保系统行为符合预期。


Pasted image 20250506221216.png