此版本仍在开发中,尚未被视为稳定版本。最新的快照版本请使用 Spring AI 1.0.0-SNAPSHOT!spring-doc.cn

ETL 管道

提取、转换和加载 (ETL) 框架是检索增强生成 (RAG) 用例中数据处理的主干。spring-doc.cn

ETL 管道编排从原始数据源到结构化向量存储的流程,确保数据处于最佳格式,以便 AI 模型进行检索。spring-doc.cn

RAG 用例是文本,通过从数据主体中检索相关信息来提高生成输出的质量和相关性,从而增强生成模型的功能。spring-doc.cn

API 概述

ETL 管道创建、转换和存储实例。Documentspring-doc.cn

Spring AI 消息 API

该类包含文本、元数据和可选的 addall 媒体类型,如图像、音频和视频。Documentspring-doc.cn

ETL 管道有三个主要组件:spring-doc.cn

  • DocumentReader实现Supplier<List<Document>>spring-doc.cn

  • DocumentTransformer实现Function<List<Document>, List<Document>>spring-doc.cn

  • DocumentWriter实现Consumer<List<Document>>spring-doc.cn

类内容是在 的帮助下从 PDF、文本文件和其他文档类型创建的。DocumentDocumentReaderspring-doc.cn

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

ETL 管道

假设我们有这三种 ETL 类型的以下实例spring-doc.cn

要执行将数据基本加载到 Vector Database 中以用于 Retrieval Augmented Generation 模式的操作,请使用以下 Java 函数样式语法代码。spring-doc.cn

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

或者,您可以使用对域更自然地表达的方法名称spring-doc.cn

vectorStore.write(tokenTextSplitter.split(pdfReader.read()));

ETL 接口

ETL 管道由以下接口和实现组成。 详细的 ETL 类图显示在 ETL 类图部分中。spring-doc.cn

文档阅读器

提供来自不同来源的文档源。spring-doc.cn

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

    default List<Document> read() {
		return get();
	}
}

文档Transformer

在处理工作流中转换一批文档。spring-doc.cn

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

    default List<Document> transform(List<Document> transform) {
		return apply(transform);
	}
}

文档编写器

管理 ETL 流程的最后阶段,准备要存储的文档。spring-doc.cn

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

    default void write(List<Document> documents) {
		accept(documents);
	}
}

ETL 类图

下面的类图说明了 ETL 接口和实现。spring-doc.cn

ETL 类图

文档读者

JSON 格式

该 API 处理 JSON 文档,将其转换为对象列表。JsonReaderDocumentspring-doc.cn

@Component
class MyJsonReader {

	private final Resource resource;

    MyJsonReader(@Value("classpath:bikes.json") Resource resource) {
        this.resource = resource;
    }

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

构造函数选项

提供了几个构造函数选项:JsonReaderspring-doc.cn

  1. JsonReader(Resource resource)spring-doc.cn

  2. JsonReader(Resource resource, String…​ jsonKeysToUse)spring-doc.cn

  3. JsonReader(Resource resource, JsonMetadataGenerator jsonMetadataGenerator, String…​ jsonKeysToUse)spring-doc.cn

参数

  • resource:指向 JSON 文件的 Spring 对象。Resourcespring-doc.cn

  • jsonKeysToUse:JSON 中的键数组,应用作结果对象中的文本内容。Documentspring-doc.cn

  • jsonMetadataGenerator:为每个 .JsonMetadataGeneratorDocumentspring-doc.cn

行为

按如下方式处理 JSON 内容:JsonReaderspring-doc.cn

  • 它可以处理 JSON 数组和单个 JSON 对象。spring-doc.cn

  • 对于每个 JSON 对象(在数组或单个对象中):spring-doc.cn

    • 它根据指定的 .jsonKeysToUsespring-doc.cn

    • 如果未指定键,则使用整个 JSON 对象作为内容。spring-doc.cn

    • 它使用提供的元数据(如果未提供,则使用空元数据)。JsonMetadataGeneratorspring-doc.cn

    • 它会创建一个包含提取的内容和元数据的对象。Documentspring-doc.cn

使用 JSON 指针

现在支持使用 JSON 指针检索 JSON 文档的特定部分。此功能允许您轻松地从复杂的 JSON 结构中提取嵌套数据。JsonReaderspring-doc.cn

方法get(String pointer)
public List<Document> get(String pointer)

此方法允许您使用 JSON 指针检索 JSON 文档的特定部分。spring-doc.cn

参数
  • pointer:一个 JSON 指针字符串(如 RFC 6901 中所定义),用于在 JSON 结构中查找所需的元素。spring-doc.cn

返回值
  • 返回 a,其中包含从指针定位的 JSON 元素解析的文档。List<Document>spring-doc.cn

行为
  • 该方法使用提供的 JSON 指针导航到 JSON 结构中的特定位置。spring-doc.cn

  • 如果指针有效并指向现有元素:spring-doc.cn

    • 对于 JSON 对象:它返回一个包含单个 Document 的列表。spring-doc.cn

    • 对于 JSON 数组:它返回一个 Documents 列表,数组中的每个元素对应一个 Documents。spring-doc.cn

  • 如果指针无效或指向不存在的元素,则会引发 .IllegalArgumentExceptionspring-doc.cn

JsonReader jsonReader = new JsonReader(resource, "description");
List<Document> documents = this.jsonReader.get("/store/books/0");

示例 JSON 结构

[
  {
    "id": 1,
    "brand": "Trek",
    "description": "A high-performance mountain bike for trail riding."
  },
  {
    "id": 2,
    "brand": "Cannondale",
    "description": "An aerodynamic road bike for racing enthusiasts."
  }
]

在此示例中,如果 配置为 ,它将创建对象,其中内容是数组中每辆自行车的 “description” 字段的值。JsonReader"description"jsonKeysToUseDocumentspring-doc.cn

笔记

  • 它使用 Jackson 进行 JSON 解析。JsonReaderspring-doc.cn

  • 它可以通过使用数组的流式处理来高效地处理大型 JSON 文件。spring-doc.cn

  • 如果在 中指定了多个键,则内容将是这些键的值的串联。jsonKeysToUsespring-doc.cn

  • 读取器非常灵活,可以通过自定义 和 来适应各种 JSON 结构。jsonKeysToUseJsonMetadataGeneratorspring-doc.cn

发短信

该操作处理纯文本文档,并将其转换为对象列表。TextReaderDocumentspring-doc.cn

@Component
class MyTextReader {

    private final Resource resource;

    MyTextReader(@Value("classpath:text-source.txt") Resource resource) {
        this.resource = resource;
    }

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

		return textReader.read();
    }
}

构造函数选项

提供了两个构造函数选项:TextReaderspring-doc.cn

  1. TextReader(String resourceUrl)spring-doc.cn

  2. TextReader(Resource resource)spring-doc.cn

参数

  • resourceUrl:表示要读取的资源的 URL 的字符串。spring-doc.cn

  • resource:指向文本文件的 Spring 对象。Resourcespring-doc.cn

配置

  • setCharset(Charset charset):设置用于读取文本文件的字符集。默认值为 UTF-8。spring-doc.cn

  • getCustomMetadata():返回一个可变映射,您可以在其中为文档添加自定义元数据。spring-doc.cn

行为

按如下方式处理文本内容:TextReaderspring-doc.cn

  • 它将文本文件的全部内容读取到单个对象中。Documentspring-doc.cn

  • 文件的内容将成为 .Documentspring-doc.cn

  • 元数据会自动添加到 :Documentspring-doc.cn

    • charset:用于读取文件的字符集(默认值:“UTF-8”)。spring-doc.cn

    • source:源文本文件的文件名。spring-doc.cn

  • 通过 添加的任何自定义元数据都包含在 .getCustomMetadata()Documentspring-doc.cn

笔记

  • 这会将整个文件内容读入内存,因此它可能不适合非常大的文件。TextReaderspring-doc.cn

  • 如果需要将文本拆分成更小的块,可以使用文本分割器,就像阅读文档后一样:TokenTextSplitterspring-doc.cn

List<Document> documents = textReader.get();
List<Document> splitDocuments = new TokenTextSplitter().apply(this.documents);
  • Reader 使用 Spring 的抽象,允许它从各种来源(Classpath、文件系统、URL 等)读取数据。Resourcespring-doc.cn

  • 自定义元数据可以添加到读者使用该方法创建的所有文档中。getCustomMetadata()spring-doc.cn

Markdown

处理 Markdown 文档,将它们转换为对象列表。MarkdownDocumentReaderDocumentspring-doc.cn

@Component
class MyMarkdownReader {

    private final Resource resource;

    MyMarkdownReader(@Value("classpath:code.md") Resource resource) {
        this.resource = resource;
    }

    List<Document> loadMarkdown() {
        MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder()
            .withHorizontalRuleCreateDocument(true)
            .withIncludeCodeBlock(false)
            .withIncludeBlockquote(false)
            .withAdditionalMetadata("filename", "code.md")
            .build();

        MarkdownDocumentReader reader = new MarkdownDocumentReader(this.resource, config);
        return reader.get();
    }
}

允许您自定义 MarkdownDocumentReader 的行为:MarkdownDocumentReaderConfigspring-doc.cn

  • horizontalRuleCreateDocument:当设置为 时,Markdown 中的水平线将创建新对象。trueDocumentspring-doc.cn

  • includeCodeBlock:设置为 时,代码块将包含在与周围文本相同的文本中。当 时,代码块将创建单独的对象。trueDocumentfalseDocumentspring-doc.cn

  • includeBlockquote:当设置为 时,块引用将包含在与周围文本相同的文本中。当 , blockquotes 创建单独的对象时。trueDocumentfalseDocumentspring-doc.cn

  • additionalMetadata:允许您将自定义元数据添加到所有创建的对象。Documentspring-doc.cn

示例文档:code.md

This is a Java sample application:

```java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

Markdown also provides the possibility to `use inline code formatting throughout` the entire sentence.

---

Another possibility is to set block code without specific highlighting:

```
./mvnw spring-javaformat:apply
```

行为:MarkdownDocumentReader 处理 Markdown 内容并根据配置创建 Document 对象:spring-doc.cn

  • 标题将成为 Document 对象中的元数据。spring-doc.cn

  • 段落成为 Document 对象的内容。spring-doc.cn

  • 代码块可以分隔到它们自己的 Document 对象中,也可以包含在周围的文本中。spring-doc.cn

  • 块引用可以分隔到它们自己的 Document 对象中,也可以包含在周围的文本中。spring-doc.cn

  • 水平线可用于将内容拆分为单独的 Document 对象。spring-doc.cn

Reader 在 Document 对象的内容中保留内联代码、列表和文本样式等格式。spring-doc.cn

PDF 页面

使用 Apache PdfBox 库解析 PDF 文档PagePdfDocumentReaderspring-doc.cn

使用 Maven 或 Gradle 将依赖项添加到您的项目中。spring-doc.cn

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-pdf-document-reader</artifactId>
</dependency>

或您的 Gradle 构建文件。build.gradlespring-doc.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-pdf-document-reader'
}

@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.read();
    }

}

PDF 段落

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

依赖

使用 Maven 或 Gradle 将依赖项添加到您的项目中。spring-doc.cn

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-pdf-document-reader</artifactId>
</dependency>

或您的 Gradle 构建文件。build.gradlespring-doc.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-pdf-document-reader'
}

@Component
public class MyPagePdfDocumentReader {

	List<Document> getDocsFromPdfWithCatalog() {

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

	    return pdfReader.read();
    }
}

蒂卡 (DOCX, PPTX, HTML...

它使用 Apache Tika 从各种文档格式中提取文本,例如 PDF、DOC/DOCX、PPT/PPTX 和 HTML。有关受支持格式的完整列表,请参阅 Tika 文档TikaDocumentReaderspring-doc.cn

依赖

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-tika-document-reader</artifactId>
</dependency>

或您的 Gradle 构建文件。build.gradlespring-doc.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-tika-document-reader'
}

@Component
class MyTikaDocumentReader {

    private final Resource resource;

    MyTikaDocumentReader(@Value("classpath:/word-sample.docx")
                            Resource resource) {
        this.resource = resource;
    }

    List<Document> loadText() {
        TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(this.resource);
        return tikaDocumentReader.read();
    }
}

变形金刚

TextSplitter 文本拆分器

一个抽象基类,可帮助划分文档以适应 AI 模型的上下文窗口。TextSplitterspring-doc.cn

TokenTextSplitter

这是一种实现,它使用 CL100K_BASE 编码根据令牌计数将文本拆分为块。TokenTextSplitterTextSplitterspring-doc.cn

用法

@Component
class MyTokenTextSplitter {

    public List<Document> splitDocuments(List<Document> documents) {
        TokenTextSplitter splitter = new TokenTextSplitter();
        return splitter.apply(documents);
    }

    public List<Document> splitCustomized(List<Document> documents) {
        TokenTextSplitter splitter = new TokenTextSplitter(1000, 400, 10, 5000, true);
        return splitter.apply(documents);
    }
}

构造函数选项

提供了两个构造函数选项:TokenTextSplitterspring-doc.cn

  1. TokenTextSplitter():使用默认设置创建拆分器。spring-doc.cn

  2. TokenTextSplitter(int defaultChunkSize, int minChunkSizeChars, int minChunkLengthToEmbed, int maxNumChunks, boolean keepSeparator)spring-doc.cn

参数

  • defaultChunkSize:每个文本块的目标大小(以 tokens 为单位)(默认值:800)。spring-doc.cn

  • minChunkSizeChars:每个文本块的最小大小(以字符为单位)(默认值:350)。spring-doc.cn

  • minChunkLengthToEmbed:要包含的 chunk 的最小长度(默认值:5)。spring-doc.cn

  • maxNumChunks:从文本生成的最大块数(默认值:10000)。spring-doc.cn

  • keepSeparator:是否在块中保留分隔符(如换行符)(默认:true)。spring-doc.cn

行为

按如下方式处理文本内容:TokenTextSplitterspring-doc.cn

  1. 它使用 CL100K_BASE 编码将输入文本编码为标记。spring-doc.cn

  2. 它根据 .defaultChunkSizespring-doc.cn

  3. 对于每个块:spring-doc.cn

    1. 它将块解码回文本。spring-doc.cn

    2. 它尝试在 .minChunkSizeCharsspring-doc.cn

    3. 如果找到断点,它会在该点截断块。spring-doc.cn

    4. 它会修剪块,并根据设置选择性地删除换行符。keepSeparatorspring-doc.cn

    5. 如果生成的块长于 ,则会将其添加到输出中。minChunkLengthToEmbedspring-doc.cn

  4. 此过程将一直持续,直到处理完或达到所有令牌为止。maxNumChunksspring-doc.cn

  5. 如果剩余文本的长度大于 ,则将其添加为最终块。minChunkLengthToEmbedspring-doc.cn

Document doc1 = new Document("This is a long piece of text that needs to be split into smaller chunks for processing.",
        Map.of("source", "example.txt"));
Document doc2 = new Document("Another document with content that will be split based on token count.",
        Map.of("source", "example2.txt"));

TokenTextSplitter splitter = new TokenTextSplitter();
List<Document> splitDocuments = this.splitter.apply(List.of(this.doc1, this.doc2));

for (Document doc : splitDocuments) {
    System.out.println("Chunk: " + doc.getContent());
    System.out.println("Metadata: " + doc.getMetadata());
}

笔记

  • 它使用库中的 CL100K_BASE 编码,该编码与较新的 OpenAI 模型兼容。TokenTextSplitterjtokkitspring-doc.cn

  • 拆分器尝试在可能的情况下通过在句子边界处断开来创建语义上有意义的块。spring-doc.cn

  • 原始文档中的元数据将被保留并复制到从该文档派生的所有块中。spring-doc.cn

  • 如果设置为 (默认行为),则原始文档中的内容格式化程序 (如果已设置) 也会复制到派生的块中。copyContentFormattertruespring-doc.cn

  • 此拆分器对于为具有标记限制的大型语言模型准备文本特别有用,可确保每个块都在模型的处理容量范围内。spring-doc.cn

ContentFormatTransformer 格式转换器

确保所有文档中的内容格式一致。spring-doc.cn

关键字元数据扩充器

这是一个使用生成式 AI 模型从文档内容中提取关键字并将其添加为元数据的 API。KeywordMetadataEnricherDocumentTransformerspring-doc.cn

用法

@Component
class MyKeywordEnricher {

    private final ChatModel chatModel;

    MyKeywordEnricher(ChatModel chatModel) {
        this.chatModel = chatModel;
    }

    List<Document> enrichDocuments(List<Document> documents) {
        KeywordMetadataEnricher enricher = new KeywordMetadataEnricher(this.chatModel, 5);
        return enricher.apply(documents);
    }
}

构造 函数

构造函数采用两个参数:KeywordMetadataEnricherspring-doc.cn

  1. ChatModel chatModel:用于生成关键字的 AI 模型。spring-doc.cn

  2. int keywordCount:要为每个文档提取的关键字数。spring-doc.cn

行为

流程文档如下:KeywordMetadataEnricherspring-doc.cn

  1. 对于每个输入文档,它将使用文档的内容创建一个提示。spring-doc.cn

  2. 它将此提示发送到提供的 以生成关键字。ChatModelspring-doc.cn

  3. 生成的关键字将添加到文档元数据的键 “excerpt_keywords” 下。spring-doc.cn

  4. 将返回扩充的文档。spring-doc.cn

定制

可以通过修改类中的常量来自定义关键字提取提示。默认模板为:KEYWORDS_TEMPLATEspring-doc.cn

\{context_str}. Give %s unique keywords for this document. Format as comma separated. Keywords:

Where 替换为文档内容,并替换为指定的关键字计数。{context_str}%sspring-doc.cn

ChatModel chatModel = // initialize your chat model
KeywordMetadataEnricher enricher = new KeywordMetadataEnricher(chatModel, 5);

Document doc = new Document("This is a document about artificial intelligence and its applications in modern technology.");

List<Document> enrichedDocs = enricher.apply(List.of(this.doc));

Document enrichedDoc = this.enrichedDocs.get(0);
String keywords = (String) this.enrichedDoc.getMetadata().get("excerpt_keywords");
System.out.println("Extracted keywords: " + keywords);

笔记

  • 这需要一个功能来生成关键字。KeywordMetadataEnricherChatModelspring-doc.cn

  • 关键字计数必须为 1 或更大。spring-doc.cn

  • 扩充器将 “excerpt_keywords” 元数据字段添加到每个已处理的文档。spring-doc.cn

  • 生成的关键字以逗号分隔的字符串形式返回。spring-doc.cn

  • 此扩充器对于提高文档的可搜索性以及为文档生成标记或类别特别有用。spring-doc.cn

摘要元数据Enricher

这是一个使用生成式 AI 模型为文档创建摘要并将其添加为元数据的 a。它可以为当前文档以及相邻文档(上一个和下一个)生成摘要。SummaryMetadataEnricherDocumentTransformerspring-doc.cn

用法

@Configuration
class EnricherConfig {

    @Bean
    public SummaryMetadataEnricher summaryMetadata(OpenAiChatModel aiClient) {
        return new SummaryMetadataEnricher(aiClient,
            List.of(SummaryType.PREVIOUS, SummaryType.CURRENT, SummaryType.NEXT));
    }
}

@Component
class MySummaryEnricher {

    private final SummaryMetadataEnricher enricher;

    MySummaryEnricher(SummaryMetadataEnricher enricher) {
        this.enricher = enricher;
    }

    List<Document> enrichDocuments(List<Document> documents) {
        return this.enricher.apply(documents);
    }
}

构造 函数

它提供了两个构造函数:SummaryMetadataEnricherspring-doc.cn

  1. SummaryMetadataEnricher(ChatModel chatModel, List<SummaryType> summaryTypes)spring-doc.cn

  2. SummaryMetadataEnricher(ChatModel chatModel, List<SummaryType> summaryTypes, String summaryTemplate, MetadataMode metadataMode)spring-doc.cn

参数

  • chatModel:用于生成摘要的 AI 模型。spring-doc.cn

  • summaryTypes:一个枚举值列表,指示要生成的摘要(PREVIOUS、CURRENT、NEXT)。SummaryTypespring-doc.cn

  • summaryTemplate:用于生成摘要的自定义模板(可选)。spring-doc.cn

  • metadataMode:指定在生成摘要时如何处理文档元数据(可选)。spring-doc.cn

行为

流程文档如下:SummaryMetadataEnricherspring-doc.cn

  1. 对于每个输入文档,它将使用文档的内容和指定的摘要模板创建一个提示。spring-doc.cn

  2. 它会将此提示发送到 provided 以生成摘要。ChatModelspring-doc.cn

  3. 根据 specified ,它会将以下元数据添加到每个文档:summaryTypesspring-doc.cn

    • section_summary:当前文档的摘要。spring-doc.cn

    • prev_section_summary:上一个文档的摘要(如果可用且已请求)。spring-doc.cn

    • next_section_summary:下一个文档的摘要(如果可用且已请求)。spring-doc.cn

  4. 将返回扩充的文档。spring-doc.cn

定制

可以通过提供自定义 .默认模板为:summaryTemplatespring-doc.cn

"""
Here is the content of the section:
{context_str}

Summarize the key topics and entities of the section.

Summary:
"""

ChatModel chatModel = // initialize your chat model
SummaryMetadataEnricher enricher = new SummaryMetadataEnricher(chatModel,
    List.of(SummaryType.PREVIOUS, SummaryType.CURRENT, SummaryType.NEXT));

Document doc1 = new Document("Content of document 1");
Document doc2 = new Document("Content of document 2");

List<Document> enrichedDocs = enricher.apply(List.of(this.doc1, this.doc2));

// Check the metadata of the enriched documents
for (Document doc : enrichedDocs) {
    System.out.println("Current summary: " + doc.getMetadata().get("section_summary"));
    System.out.println("Previous summary: " + doc.getMetadata().get("prev_section_summary"));
    System.out.println("Next summary: " + doc.getMetadata().get("next_section_summary"));
}

提供的示例演示了预期的行为:spring-doc.cn

  • 对于包含两个文档的列表,两个文档都会收到一个 .section_summaryspring-doc.cn

  • 第一个文档收到 a 但没有 .next_section_summaryprev_section_summaryspring-doc.cn

  • 第二个文档接收 a 但没有 .prev_section_summarynext_section_summaryspring-doc.cn

  • 第一个文档的 与第二个文档的 匹配。section_summaryprev_section_summaryspring-doc.cn

  • 第一个文档的 与第二个文档的 匹配。next_section_summarysection_summaryspring-doc.cn

笔记

  • 需要一个功能来生成摘要。SummaryMetadataEnricherChatModelspring-doc.cn

  • 扩充器可以处理任何大小的文档列表,正确处理第一个和最后一个文档的边缘情况。spring-doc.cn

  • 此扩充器对于创建上下文感知摘要特别有用,从而可以更好地了解序列中的文档关系。spring-doc.cn

  • 该参数允许控制如何将现有元数据合并到摘要生成过程中。MetadataModespring-doc.cn

作家

文件

这是一种将对象列表的内容写入文件的实现。FileDocumentWriterDocumentWriterDocumentspring-doc.cn

用法

@Component
class MyDocumentWriter {

    public void writeDocuments(List<Document> documents) {
        FileDocumentWriter writer = new FileDocumentWriter("output.txt", true, MetadataMode.ALL, false);
        writer.accept(documents);
    }
}

构造 函数

这提供了三个构造函数:FileDocumentWriterspring-doc.cn

  1. FileDocumentWriter(String fileName)spring-doc.cn

  2. FileDocumentWriter(String fileName, boolean withDocumentMarkers)spring-doc.cn

  3. FileDocumentWriter(String fileName, boolean withDocumentMarkers, MetadataMode metadataMode, boolean append)spring-doc.cn

参数

  • fileName:要将文档写入到的文件的名称。spring-doc.cn

  • withDocumentMarkers:是否在输出中包含文档标记(默认值:false)。spring-doc.cn

  • metadataMode:指定要写入文件的文档内容(默认值:MetadataMode.NONE)。spring-doc.cn

  • append:如果为 true,则数据将写入文件末尾而不是开头(默认值:false)。spring-doc.cn

行为

流程文档如下:FileDocumentWriterspring-doc.cn

  1. 它将打开指定文件名的 FileWriter。spring-doc.cn

  2. 对于输入列表中的每个文档:spring-doc.cn

    1. 如果为 true,则写入包含文档索引和页码的文档标记。withDocumentMarkersspring-doc.cn

    2. 它根据指定的 .metadataModespring-doc.cn

  3. 写入所有文档后,文件将关闭。spring-doc.cn

文档标记

当设置为 true 时,编写器将按以下格式包含每个文档的标记:withDocumentMarkersspring-doc.cn

### Doc: [index], pages:[start_page_number,end_page_number]

元数据处理

编写器使用两个特定的元数据键:spring-doc.cn

这些在编写文档标记时使用。spring-doc.cn

List<Document> documents = // initialize your documents
FileDocumentWriter writer = new FileDocumentWriter("output.txt", true, MetadataMode.ALL, true);
writer.accept(documents);

这会使用所有可用的元数据将所有文档写入“output.txt”,包括文档标记,并附加到文件(如果已存在)。spring-doc.cn

笔记

  • 编写器使用 ,因此它使用操作系统的默认字符编码写入文本文件。FileWriterspring-doc.cn

  • 如果在写入过程中发生错误,则会引发 a,并将原始异常作为其原因。RuntimeExceptionspring-doc.cn

  • 该参数允许控制如何将现有元数据合并到写入内容中。metadataModespring-doc.cn

  • 此编写器对于调试或创建文档集合的可读输出特别有用。spring-doc.cn

矢量存储

提供与各种矢量存储的集成。 有关完整列表,请参阅 Vector DB 文档spring-doc.cn