在本章中,我们将构建一条实用的数据 pipeline,它会从 Amazon S3 读取 PDF 文档,并将其摄取到 Pinecone 向量数据库中。该 pipeline 使用 Airbyte 来管理整个抽取、转换和加载,也就是 ETL 工作流。
图 6.1 展示了我们将构建的 pipeline 架构。在这个过程中,我们将学习如何使用 Airbyte 的低代码界面对其进行配置,如何将它连接到包含文档的 Amazon S3 bucket,以及如何在生成嵌入之后,将这些文档迁移到向量数据库中。
图 6.1——Pipeline 架构:Amazon S3 → Airbyte(加载数据、创建嵌入、摄取数据)→ Pinecone 向量数据库
本章展示了现代 ETL 工具如何简化为 RAG 系统准备数据的过程。到本章结束时,你将构建出一条可运行的 ingestion pipeline,它可以将非结构化文档转换为可搜索的向量嵌入,并存储到 Pinecone 中。
本章将涵盖以下主题:
- 适用模式分析
- 构建我们的 ETL pipeline
适用模式分析
Airbyte 和许多 ETL 工具一样,依赖一些众所周知的软件设计模式来实现可扩展的数据 pipeline。这些模式来自 Gregor Hohpe 和 Bobby Woolf 描述的 EIP 目录。
有两种模式与本章构建的 pipeline 特别相关:
- Message Channel
- Channel Adapter
Message Channel 使生产数据和消费数据的组件之间能够通信。系统之间不是直接连接,而是通过 channel 发送消息。这种方法将生产者与消费者解耦,并允许 pipeline 在不同系统之间独立扩展。Channel Adapter 是一种组件,它将外部通信通道,例如 RabbitMQ 或 HTTP API,连接到应用程序,并在通道格式与系统内部表示之间转换数据。
在我们的场景中,生产者从 Amazon S3 读取文档,并将抽取出的数据发送到 pipeline 中。下游组件处理这些数据,并最终将其存储到 Pinecone 向量数据库中。
图 6.2 展示了这些组件如何交互。
图 6.2——Message Channel 和 Channel Adapter 模式:Message Producer → Messaging System → Receiver Application,两侧都有 Source Strategy / Channel Adapter
这些模式构成了 ETL 工具在实践中管理数据移动方式的基础。
ETL 实现的集成模式
ETL 系统通常会结合多种集成模式来管理系统之间的数据移动。Airbyte 通过可配置的 connector 和 adapter 来实现这些模式。
要使用 Airbyte 创建一条 ETL pipeline,我们必须指定两件事:
- 从哪个数据源检索信息
- 处理后的数据将被存储到哪个目标系统
随后,Airbyte 使用内部的 strategy 和 adapter 组件来连接这些系统,并在它们之间移动数据。
这种设计允许 pipeline 被轻松重新配置。例如,今天从 Amazon S3 读取数据的 pipeline,之后可以被修改为从 SharePoint 或关系型数据库读取数据,而不需要改变底层架构。
Channel adapter
如前所述,Channel Adapter 是一种集成组件,它将应用程序连接到消息系统,使其能够发送和接收消息。它是 Channel Adapter EIP 的一种实现。Adapter 会与应用程序的 API 或数据交互,并将其转换为发送到 Message Channel 的消息,反之亦然。
Airbyte 有两类 Channel Adapter:
Inbound channel adapter: 用于单向集成,将数据带入消息应用程序。它可以是 message-driven,也就是在新消息到达时做出反应;也可以是 polling-based,也就是周期性检查是否有新消息。
Outbound channel adapter: 用于单向集成,将数据从消息应用程序发送出去。它监听 channel 上的消息,并将它们发送到外部系统,例如文件、数据库或 API。
与大多数 ETL 工具一样,Airbyte 提供了多个可由用户配置的 Channel Adapter。例如,用户可以为多种向量数据库实现中的任意一种配置 outbound channel adapter,比如 Qdrant、Pinecone 或 Milvus。为了最小化配置工作量,Airbyte 使用了 Strategy pattern。用户可以指定要使用哪个 adapter,并通过无代码界面提供连接细节。
Strategy pattern
Strategy pattern 是一种行为型设计模式,它允许程序在运行时从一组算法中选择一个算法。它通过定义可互换的算法、将每个算法封装在独立类中,并使其能够在运行时被选择来实现这一点,通常是通过将某个 strategy 对象传入 context 对象。这样的方法让代码在不修改核心结构的情况下,变得更加灵活、可替换和可扩展。
Strategy pattern(producer)
要配置 Airbyte 从某个给定源读取数据,例如 Amazon S3,我们只需要在 context 中提供 source type,以及 adapter 进行认证和连接所需的连接信息与安全信息:
图 6.3——Strategy Pattern——Airbyte Producer:Client → Context → Data Source Adapters(Amazon S3、SharePoint、RDBMS,等等)
Strategy pattern(receiver)
要配置 Airbyte 写入某个给定目标,我们需要在 context 中提供 destination type,以及我们想使用的 adapter 所需的连接信息和安全信息:
图 6.4——Strategy Pattern——Airbyte Receiver:Client → Context → Vector Database Adapters(ChromaDB、Pinecone、Weaviate,等等)
现在,我们已经对 ETL 实现底层正在发生的事情有了基本理解,接下来将走过一个具体示例。我们将使用 Airbyte 创建一条数据 pipeline,从 Amazon S3 bucket 中读取文档,对它们进行切分,并将向量嵌入写入 Pinecone 向量数据库。
构建我们的 ETL pipeline
现在,我们已经完成工具选择,并回顾了相关模式,接下来开始构建 ETL pipeline。我们将执行以下步骤:
- 安装向量数据库和 Airbyte,使用开源版本
- 分析文档集合
- 配置 Airbyte
- 迁移文档
- 测试结果
安装 Pinecone 和 Airbyte
Airbyte 的开源版本可以很直接地安装在本地机器上。另一种方式是,你可以在 Airbyte 网站注册免费试用,并且不需要信用卡。Pinecone 提供了一个名为 Pinecone Local 的本地开发工具,可以通过 Docker 运行,为本地开发和测试提供一种类似开源产品的体验。我们的 GitHub 仓库中包含了为本 demo 配置 Pinecone、Airbyte 和 Amazon S3 的说明。
https://github.com/airbytehq/airbyte?tab=readme-ov-file
https://docs.airbyte.com/platform/using-airbyte/getting-started/oss-quickstart
https://docs.pinecone.io/guides/get-started/overview
文档分析
第一步是调查并记录你想迁移到向量数据库中的文档集合。检查每个 collection,并记录文档是如何分类的。问问自己:这些文档是否包含 PII?访问它们需要什么类型的认证?当前有哪些文档类型:PDF、Excel、纯文本?文档内部出现了哪些结构模式?这些 PDF 是否有多个章节和子章节?
如果你发现有多个文档仓库分类很差,那么在运行 ETL pipeline 之前,可以考虑使用文本分类或主题建模算法。这些算法可以构建 taxonomy,用于丰富每份文档的 metadata。有多种方式可以从文档中抽取 taxonomy,从使用 prompt 和第三方 LLM 库构建一个简单的 taxonomy extractor,到使用 Google、Amazon 和 Microsoft 的复杂云工具。本书不会覆盖 taxonomy 创建的所有选项,但如果你有大量分类不佳的文档集合,就应该考虑使用商业或开源的 taxonomy extraction 工具。
图 6.5——Taxonomy 创建:源文档被分类到一个由分类子文档组成的层级结构中
配置 Airbyte 的选项
如上文所讨论,为了让 ETL pipeline 使用 Airbyte 运行,我们需要提供配置数据,使它:
- 知道自己将连接到哪些 endpoint;
- 拥有连接到这些 endpoint 所需的连接信息,例如 URL 和安全凭据,以便完成认证。
Airbyte 可以通过三种方式进行配置:
- 使用它的无代码界面
- 调用 RESTful API
- 使用 Python SDK
RESTful service endpoint 可以使用任何成熟语言调用,例如 TypeScript 或 Java。我们的 GitHub 仓库提供了一个使用 TypeScript 调用这些 endpoint 的示例。
在下面的示例中,我们使用 Airbyte 的无代码界面对其进行配置。使用 TypeScript 和 Java 通过 API 配置 Airbyte 的示例,可以在我们的仓库中找到。
使用 Airbyte 的无代码界面配置 Airbyte
当你登录 Airbyte 时,会看到它的 Connections 页面:
图 6.6——Airbyte Connections 页面:Sources 通过 Airbyte connector hub 连接到 Destinations
要配置连接到 Amazon S3 的 connector,请点击左侧面板中的 Sources 选项。你会看到许多可用的 source connector。在 Source name 字段中搜索 S3,并点击 S3 bucket 图标,以打开 S3 bucket 配置页面。在这里,你可以在可选字段中输入 bucket 名称和 Amazon API key。这会告诉 Airbyte 使用这个 S3 bucket,并在每次 fetch request 中发送 API key,以便你被授权访问该 bucket。
图 6.7——Airbyte S3 Source 配置:输入 Source name、Bucket、需要同步的 streams,以及 Delivery Method
接下来,点击左侧边栏中的 Destinations 选项,并从列表中选择 Pinecone。你可能需要按向量数据库过滤,或按名称过滤。这将打开一个页面,你可以在其中配置到 Pinecone 向量数据库的连接,包括 chunk size、text splitting、embedding model 和 indexing 等设置,如图 6.8 所示。
图 6.8——Airbyte Pinecone Destination 配置:Processing(chunk size、text splitter)、Embedding(OpenAI API key)和 Indexing(Pinecone index、environment、API key)
接下来,点击左侧边栏中的 Builder 标签页来创建 pipeline。你会看到三个用于构建 connector 的选项:
- Importing a YAML manifest
- Fork an existing connector
- Start from scratch
我们将使用第一种方式,并提供一个 YAML 文件,供你自定义并上传。
导入 YAML manifest
YAML 是一种人类可读的数据序列化语言,主要用于配置文件。你可以在我们的 GitHub 仓库中找到这个 YAML 文件。你可以使用任何标准文本编辑器打开它,例如 Notepad++、VS Code、Sublime Text、Vim 或 Atom。
# Airbyte connection: S3 (documents) → Pinecone
resourceType: connection
name: s3-pdfs → pinecone
workspaceId: ${AIRBYTE_WORKSPACE_ID}
# Octavia fills these from the referenced files during `generate`, but you can
# leave them as relative references or apply after generating via CLI.
source: ../sources/s3_pdfs/configuration.yaml
destination: ../destinations/pinecone/configuration.yaml
# Minimal catalog config. Airbyte will infer the schema;
# we include the stream name.
syncCatalog:
streams:
- stream:
name: pdf_docs
jsonSchema: {} # let Airbyte manage schema details
supportedSyncModes: ["full_refresh", "incremental"]
namespace: null
config:
syncMode: incremental
destinationSyncMode: append
primaryKey: [["document_key"]] # de-dupe / stable upserts
selected: true
# Schedule (change as desired)
schedule:
timeUnit: hours
units: 24
status: active
# Optional: connector resources (CPU/mem) or normalization can be added here.
请注意,我们将 syncMode 设置为 incremental,并将 destinationSyncMode 设置为 append。这确保当一个新文档被添加到 S3 bucket 中,或者已有文档出现更新版本时,只有该文件会被处理;旧版本仍会保留。如果不需要旧版本,可以使用 Deduped mode 来节省空间,因为它不会保留旧版本。Airbyte 文档详细介绍了这些以及其他功能。
数据 pipeline 每次执行,都有可能产生 “drift”,也就是由于使用新的或修改后的数据集而导致系统行为发生变化。运行 pipeline 之后,我们希望验证语义查询仍然返回可接受的结果。在第 2 章中,我们讨论过一个最佳实践:在 GenAI 项目开始时编写几十个样本查询。这正是那项工作的价值体现之处。
总结
在本章中,我们深入观察了 ETL 系统的底层机制,并考察了 Channel Adapter、Strategy 和 Message Channel 这些常见模式。随后,我们使用 Airbyte 的无代码 UI 构建了一条 pipeline,它从 Amazon S3 bucket 中读取 PDF 文档,对它们进行切分,创建向量嵌入,并将它们摄取到 Pinecone 中。
完成前面几章的学习之后,你现在应该已经对构建基于 LLM 的系统所需基础知识有了非常扎实的理解。无论是在 RAG 架构还是微服务架构中,只要项目使用 LLM,你都可以有信心开始。下一章中,我们将介绍最佳实践,并列出一些用于管理 GenAI 应用数据的高级选项。