ETL Pipeline

提取、转换和加载 (ETL) 框架充当检索增强生成 (RAG) 使用案例中的数据处理主干。 ETL 管道将数据流从原始数据源协调到结构化向量存储中,确保数据处于 AI 模型检索的最佳格式中。 RAG 使用案例是一个文本,它通过从数据主体中检索相关信息来增强生成模型的能力,以提升生成输出的质量和关联性。

API Overview

ETL 管道有三个主要组件,

  • DocumentReader that implements Supplier<List<Document>>

  • DocumentTransformer 它实现 Function&lt;List&lt;Document&gt;, List&lt;Document&gt;&gt;

  • DocumentWriter that implements Consumer<List<Document>>

Document 类包含文本和元数据,并通过 DocumentReader 从 PDF、文本文件和其他文档类型中创建。

要构建一个简单的 ETL 管道,您可以将每种类型的实例链接在一起。

etl pipeline

假设我们有以下三个 ETL 类型的实例

  • PagePdfDocumentReader DocumentReader 的实现

  • TokenTextSplitter DocumentTransformer 的实现

  • VectorStore DocumentWriter 的实现

要将数据基本加载到 Vector 数据库中,以便与检索增强生成模式配合使用,请使用以下代码。

vectorStore.accept(tokenTextSplitter.apply(pdfReader.get()));

Getting Started

要开始创建 Spring AI RAG 应用程序,请遵循以下步骤:

  1. 下载最新的 Spring CLI Release并遵循 installation instructions

  2. 要创建基于 OpenAI 的简单应用程序,请使用以下命令:[source, shell]

spring boot new --from ai-rag --name myrag
  1. 参照生成的 README.md 文件以获取有关获取 OpenAI API 密钥和运行您的第一个 AI RAG 应用程序的指导。

ETL Interfaces and Implementations

ETL 管道由以下接口和实现组成。详细的 ETL 类图显示在 ETL Class Diagram 部分中。

DocumentReader

提供各类来源的文档。

public interface DocumentReader extends Supplier<List<Document>> {

}

JsonReader

JsonReader 解析 JSON 格式的文档。

示例:

@Component
public class MyAiApp {

	@Value("classpath:bikes.json") // This is the json document to load
	private Resource resource;

	List<Document> loadJsonAsDocuments() {
		JsonReader jsonReader = new JsonReader(resource, "description");
		return jsonReader.get();
	}
}

TextReader

TextReader 处理纯文本文档。

示例:

@Component
public class MyTextReader {

    @Value("classpath:text-source.txt") // This is the text document to load
	private Resource resource;

	List<Document> loadText() {
		TextReader textReader = new TextReader(resource);
		textReader.getCustomMetadata().put("filename", "text-source.txt");

		return textReader.get();
    }
}

PagePdfDocumentReader

PagePdfDocumentReader 使用 Apache PdfBox 库解析 PDF 文档

示例:

@Component
public class MyPagePdfDocumentReader {

	List<Document> getDocsFromPdf() {

		PagePdfDocumentReader pdfReader = new PagePdfDocumentReader("classpath:/sample1.pdf",
				PdfDocumentReaderConfig.builder()
					.withPageTopMargin(0)
					.withPageExtractedTextFormatter(ExtractedTextFormatter.builder()
						.withNumberOfTopTextLinesToDelete(0)
						.build())
					.withPagesPerDocument(1)
					.build());

		return pdfReader.get();
    }

}

ParagraphPdfDocumentReader

ParagraphPdfDocumentReader 使用 PDF 目录(例如 TOC)信息将输入的 PDF 拆分为文本段落,并为每个段落输出一个 Document。注意:并非所有 PDF 文档都包含 PDF 目录。

示例:

@Component
public class MyPagePdfDocumentReader {

	List<Document> getDocsFromPdfwithCatalog() {

        new ParagraphPdfDocumentReader("classpath:/sample1.pdf",
                PdfDocumentReaderConfig.builder()
                    .withPageTopMargin(0)
                    .withPageExtractedTextFormatter(ExtractedTextFormatter.builder()
                        .withNumberOfTopTextLinesToDelete(0)
                        .build())
                    .withPagesPerDocument(1)
                    .build());

		return pdfReader.get();
    }
}

TikaDocumentReader

TikaDocumentReader 使用 Apache Tika 从各种文档格式(例如 PDF、DOC/DOCX、PPT/PPTX 和 HTML)中提取文本。有关受支持格式的详尽列表,请参阅 ` Tika documentation`。

示例:

@Component
public class MyTikaDocumentReader {

    @Value("classpath:/word-sample.docx") // This is the word document to load
	private Resource resource;

	List<Document> loadText() {
        TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(resourceUri);
        return tikaDocumentReader.get();
    }
}

DocumentTransformer

将一批文档作为处理工作流程的一部分进行转换。

public interface DocumentTransformer extends Function<List<Document>, List<Document>> {

}

TextSplitter

TextSplitter 一个抽象基类,用于帮助将文档分隔为适合 AI 模型上下文窗口。

TokenTextSplitter

在保留令牌级别完整性的同时拆分文档。

ContentFormatTransformer

确保所有文档具有统一的内容格式。

KeywordMetadataEnricher

使用必要的关键字元数据增强文档。

SummaryMetadataEnricher

使用摘要元数据丰富文档,以增强检索能力。

DocumentWriter

管理 ETL 流程的最后阶段,为存储准备文档。

public interface DocumentWriter extends Consumer<List<Document>> {

}

FileDocumentWriter

将文档永久存储到文件中。

VectorStore

与各种向量存储进行集成。有关完整列表,请参阅 Vector DB Documentation

ETL Class Diagram

下图展示了 ETL 接口和实现。

etl class diagram