基于模式提示的复杂多智能体系统构建——使用 Airbyte 和 Pinecone 摄取数据

0 阅读10分钟

在本章中,我们将构建一条实用的数据 pipeline,它会从 Amazon S3 读取 PDF 文档,并将其摄取到 Pinecone 向量数据库中。该 pipeline 使用 Airbyte 来管理整个抽取、转换和加载,也就是 ETL 工作流。

图 6.1 展示了我们将构建的 pipeline 架构。在这个过程中,我们将学习如何使用 Airbyte 的低代码界面对其进行配置,如何将它连接到包含文档的 Amazon S3 bucket,以及如何在生成嵌入之后,将这些文档迁移到向量数据库中。

image.png

图 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 展示了这些组件如何交互。

image.png

图 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 进行认证和连接所需的连接信息与安全信息:

image.png

图 6.3——Strategy Pattern——Airbyte Producer:Client → Context → Data Source Adapters(Amazon S3、SharePoint、RDBMS,等等)

Strategy pattern(receiver)

要配置 Airbyte 写入某个给定目标,我们需要在 context 中提供 destination type,以及我们想使用的 adapter 所需的连接信息和安全信息:

image.png

图 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 工具。

image.png

图 6.5——Taxonomy 创建:源文档被分类到一个由分类子文档组成的层级结构中

配置 Airbyte 的选项

如上文所讨论,为了让 ETL pipeline 使用 Airbyte 运行,我们需要提供配置数据,使它:

  1. 知道自己将连接到哪些 endpoint;
  2. 拥有连接到这些 endpoint 所需的连接信息,例如 URL 和安全凭据,以便完成认证。

Airbyte 可以通过三种方式进行配置:

  • 使用它的无代码界面
  • 调用 RESTful API
  • 使用 Python SDK

RESTful service endpoint 可以使用任何成熟语言调用,例如 TypeScript 或 Java。我们的 GitHub 仓库提供了一个使用 TypeScript 调用这些 endpoint 的示例。

在下面的示例中,我们使用 Airbyte 的无代码界面对其进行配置。使用 TypeScript 和 Java 通过 API 配置 Airbyte 的示例,可以在我们的仓库中找到。

使用 Airbyte 的无代码界面配置 Airbyte

当你登录 Airbyte 时,会看到它的 Connections 页面:

image.png

图 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。

image.png

图 6.7——Airbyte S3 Source 配置:输入 Source name、Bucket、需要同步的 streams,以及 Delivery Method

接下来,点击左侧边栏中的 Destinations 选项,并从列表中选择 Pinecone。你可能需要按向量数据库过滤,或按名称过滤。这将打开一个页面,你可以在其中配置到 Pinecone 向量数据库的连接,包括 chunk size、text splitting、embedding model 和 indexing 等设置,如图 6.8 所示。 image.png

图 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 应用数据的高级选项。