RAG中的数据准备
00 min
2024-6-24
2024-7-4
type
status
date
slug
summary
tags
category
icon
password
notion image
任何机器学习应用的初始阶段都需要进行数据准备。这包括建立数据输入管道和预处理数据,使其与推理管道兼容。
在本篇文章中,我们将关注 RAG 的数据准备方面。我们的目标是有效地组织和结构化数据,确保在应用程序中定位答案的最佳性能。

步骤 1:数据输入Data Ingestion

构建消费者友好型聊天机器人始于好的数据选择。
  1. 好的选择:确定从用户到 API 的数据源,并建立推送机制,以便对 LLM 应用程序进行持续更新。
  1. 数据管理很重要:提前实施数据管理政策。对文件来源进行审计和编目,对敏感数据进行编辑,并为上下文培训奠定基础。
  1. 质量检查:评估数据的多样性、规模和噪音水平。质量较低的数据集会冲淡响应,因此有必要尽早建立分类机制。
  1. 保持领先:即使在快节奏的 LLM 开发过程中,要坚持数据治理。这可以降低风险,确保可扩展的、稳健的数据提取。
  1. 实时清理:从 Slack 等平台提取数据?实时过滤噪音、错别字和敏感内容,打造高效的 LLM 应用。

步骤 2:数据清理Data Cleaning

文件中的每个页面都会转换为文档对象,并包含两个基本组件:页面内容和元数据。page_content 和 metadata.
”页面内容“是直接从文档页面中提取的文本内容。
“元数据“是附加详细信息的重要组合,如文档的来源(源文件)、页码、文件类型和其他信息。元数据在生成答案时,会记录它所利用的特定来源。
notion image
为了实现这一目标,可以使用数据加载器等工具,这些工具由 LangChain 和 Llamaindex 等开源库提供。这些库支持各种格式,从 PDF 和 CSV 到 HTML、Markdown 甚至数据库。
这种方法的优点是可以通过页码检索文件。

步骤 3:分块Chunking

  1. 为什么要分块?
    1. 在软件世界里,改变游戏规则的关键在于如何塑造数据--无论是标记符、PDF 还是其他文本文件。
      想象一下:有一份厚厚的 PDF 文件,现在就其内容提出问题。问题出在哪里?传统的方法是将整个文档和您的问题扔给模型,但效果不佳。为什么呢?让我们来谈谈模型“上下文窗口的局限性”。
      把上下文窗口想象成对文档的窥视,通常仅限于一页或几页。现在,一次共享整个文档?不太现实。不过不用担心!
      诀窍在于将“数据分块”。将数据分解成易于处理的部分,只将最相关的部分发送给模型。这样,就不会让模型不堪重负,而且还能获得需要的回答。
      通过将结构化文件分解成易于管理的小块,我们让 LLM 能够以无与伦比的效率处理信息。这种方法不再受页数限制,可确保关键细节不会在混乱中丢失。
  1. 分块前的一些点?
    1. 文档的结构和长度:
    2. 长文档:书籍、学术文章等
    3. 短文档:社交媒体帖子、客户评论等。
    4. 嵌入模型:分块大小决定了应使用何种嵌入模型。
    5. 预期查询:使用案例是什么?
  1. 数据块大小?
    1. Small chunk size 小块:例如:单句 → 生成的上下文信息较少:单句 → 生成的上下文信息较少。
      Large chunk size 大块尺寸:例如:整页、多个段落、完整文档:整页、多个段落、完整文档。在这种情况下,语块涵盖的信息更多,可以通过更多的上下文信息提高生成效率。
  1. LLM 上下文窗口限制?
    1. Top-K Retrieved Chunks:假设 LLM 的上下文窗口大小为 10,000 tkens,我们为给定的用户查询保留了其中的 1000 tokens,再为指令提示和聊天记录保留了其中的 2000 tkens,这样就只剩下 7000 tkens 可用于其他信息。假设我们打算将 K = 10 的前 10 个信息块传入 LLM,这就意味着我们要将剩余的 7000 个信息块除以 10 个信息块,这样每个信息块的最大信息量将为 700 个。
    2. 分块大小范围:下一步是选择一定范围的潜在块大小进行测试。如前所述,选择时应考虑到内容的性质(如短信息或长文档)、将使用的嵌入模型及其功能(如标记限制)。目的是在保留上下文和保持准确性之间找到平衡。首先要探索各种块的大小,包括捕获更细粒度语义信息的较小块(如 128 或 256 标记)和保留更多上下文的较大块(如 512 或 1024 标记)。
    3. 评估每种分块大小的性能--要测试各种分块大小,可以使用多个索引,或者使用具有多个命名空间的单个索引。使用具有代表性的数据集,为要测试的块大小创建嵌入,并将其保存在索引(或多个索引)中。
      然后,可以运行一系列可以评估质量的查询,并比较不同块大小的性能。这很可能是一个迭代的过程,在这个过程中,你会针对不同的查询测试不同的块大小,直到你能根据内容和预期查询确定性能最好的块大小。
  1. 高Context长度的限制?
    1. 由于 Transformer 模型的Self Attention 机制,高Context长度会导致时间和内存的二次增长。
      在 LlamaIndex 发布的这个示例中,您可以从下表中看到,随着分块大小的增加,平均响应时间略有上升。
      有趣的是,平均似乎在数据块大小为 1024 时达到顶峰,而平均相关性则随着数据块大小的增大而持续提高,同样在 1024 时达到顶峰。这表明,1024 的数据块大小可以在响应时间和响应质量之间取得最佳平衡。
      notion image
  1. 分块方法
    1. 有不同的分块方法,每种方法都可能适用于不同的情况。通过研究每种方法的优缺点,我们的目标是找出适合的应用场景。
    2. 固定大小的分块
    3. 我们决定每个分块中的标记数量,同时考虑到可选的重叠。为什么要重叠?为了确保语义上下文的丰富性在各语块之间保持不变。
      为什么采用固定大小?这是大多数情况下的黄金路径。它不仅计算成本低廉,节省了处理能力,而且使用起来轻而易举。无需复杂的 NLP 库,只需优雅地将固定大小的数据块无缝分解即可。
      下面是使用 LangChain 执行固定大小分块的示例:
      b. 专业分块
      专用分块Markdown 和 LaTeX 是可能会遇到的结构化和格式化内容的两个例子。在这种情况下,可以使用专门的分块方法,在分块过程中保留内容的原始结构。
      Markdown 是一种轻量级标记语言,常用于格式化文本。通过识别 Markdown 语法(如标题、列表和代码块),可以根据内容的结构和层次对其进行智能划分,从而形成语义更加连贯的分块。例如
      LaTex 是一种文档编制系统和标记语言,常用于学术论文和技术文档。通过解析 LaTeX 命令和环境,可以创建尊重内容逻辑组织(如章节、小节和方程式)的语块,从而获得更准确和与上下文相关的结果。例如
      /待完成
上一篇
RAG检索增强生成
下一篇
MarsCode 智能WebIDE

Comments
  • Giscus