ETL 流水线

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

ETL流水线协调从原始数据源到结构化向量存储的流程,确保数据格式为AI模型检索的最佳格式。spring-doc.cadn.net.cn

RAG的用例是通过从数据体中提取相关信息,增强生成模型的能力,从而提升生成输出的质量和相关性。spring-doc.cadn.net.cn

API 概述

ETL 流水线负责创建、转换和存储公文实例。spring-doc.cadn.net.cn

Spring AI 消息 API

公文类包含文本、元数据以及可选的额外媒体类型,如图片、音频和视频。spring-doc.cadn.net.cn

ETL流水线主要包含三个组成部分,spring-doc.cadn.net.cn

公文课程内容由 PDF、文本文件及其他文档类型创建,并借助文档阅读器.spring-doc.cadn.net.cn

要构建一个简单的ETL流水线,你可以将每种类型的实例串联起来。spring-doc.cadn.net.cn

ETL 流水线

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

要将数据加载到向量数据库中以配合检索增强生成模式,请使用以下 Java 函数式语法代码。spring-doc.cadn.net.cn

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

或者,你也可以使用更自然地表达该领域的方法名称spring-doc.cadn.net.cn

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

ETL 接口

ETL流水线由以下接口和实现组成。详细的ETL类图见ETL类图部分。spring-doc.cadn.net.cn

文档阅读器

提供来自多元来源的文献资料来源。spring-doc.cadn.net.cn

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

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

DocumentTransformer

将一批文档作为处理流程的一部分进行转换。spring-doc.cadn.net.cn

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

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

文档作者

管理ETL流程的最后阶段,准备文件以供存储。spring-doc.cadn.net.cn

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

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

ETL类别图

下图展示了ETL的接口和实现。spring-doc.cadn.net.cn

ETL 类图

文档阅读者

JSON

JsonReader处理 JSON 文档,并将其转换为公文对象。spring-doc.cadn.net.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();
	}
}

制造商选项

JsonReader提供多种构造器选项:spring-doc.cadn.net.cn

  1. JsonReader(资源资源)spring-doc.cadn.net.cn

  2. JsonReader(资源资源,字符串...jsonKeysToUse)spring-doc.cadn.net.cn

  3. JsonReader(资源资源,JsonMetadataGenerator jsonMetadataGenerator, String...jsonKeysToUse)spring-doc.cadn.net.cn

参数

行为

JsonReader处理JSON内容的方式如下:spring-doc.cadn.net.cn

使用 JSON 指针

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

get(字符串指针)方法
public List<Document> get(String pointer)

这种方法允许你使用 JSON 指针检索 JSON 文档的特定部分。spring-doc.cadn.net.cn

参数
  • 指针: 一个 JSON 指针字符串(根据 RFC 6901 定义)用于在 JSON 结构中定位所需元素。spring-doc.cadn.net.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."
  }
]

在这个例子中,如果JsonReader配置为“描述”作为jsonKeysToUse,它将创造公文其中内容是数组中每辆自行车“描述”字段的值。spring-doc.cadn.net.cn

笔记

文本

文本阅读器处理纯文本文档,将其转换为公文对象。spring-doc.cadn.net.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();
    }
}

制造商选项

文本阅读器提供两种构造器选项:spring-doc.cadn.net.cn

  1. TextReader(字符串资源URL)spring-doc.cadn.net.cn

  2. TextReader(资源资源)spring-doc.cadn.net.cn

参数

配置

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

  • getCustomMetadata()返回一个可变映射,你可以为文档添加自定义元数据。spring-doc.cadn.net.cn

行为

文本阅读器文本内容处理方式如下:spring-doc.cadn.net.cn

笔记

  • 文本阅读器它会将整个文件内容读取到内存中,因此可能不适合处理非常大的文件。spring-doc.cadn.net.cn

  • 如果你需要把文本拆分成更小的块,可以用像这样的文本分割器TokenTextSplitter阅读该文件后:spring-doc.cadn.net.cn

List<Document> documents = textReader.get();
List<Document> splitDocuments = new TokenTextSplitter().apply(this.documents);

HTML(JSoup)

Jsoup文档阅读器处理HTML文档,并将其转换为公文使用JSoup库的对象。spring-doc.cadn.net.cn

示例

@Component
class MyHtmlReader {

    private final Resource resource;

    MyHtmlReader(@Value("classpath:/my-page.html") Resource resource) {
        this.resource = resource;
    }

    List<Document> loadHtml() {
        JsoupDocumentReaderConfig config = JsoupDocumentReaderConfig.builder()
            .selector("article p") // Extract paragraphs within <article> tags
            .charset("ISO-8859-1")  // Use ISO-8859-1 encoding
            .includeLinkUrls(true) // Include link URLs in metadata
            .metadataTags(List.of("author", "date")) // Extract author and date meta tags
            .additionalMetadata("source", "my-page.html") // Add custom metadata
            .build();

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

JsoupDocumentReaderConfig允许你自定义Jsoup文档阅读器:spring-doc.cadn.net.cn

  • 字符集: 指定HTML文档的字符编码(默认为“UTF-8”)。spring-doc.cadn.net.cn

  • 选择器: 一个JSoup CSS选择器,用于指定从哪些元素中提取文本(默认为“正体”)。spring-doc.cadn.net.cn

  • 分隔符:用于连接多个选定元素文本的字符串(默认为“\n”)。spring-doc.cadn.net.cn

  • allElements(所有元素):如果true,从 中提取所有文本<身体>元素,忽略选择器(默认为false).spring-doc.cadn.net.cn

  • groupByElement:如果true,会创建独立的公文对于每个元素,均匹配选择器(默认为false).spring-doc.cadn.net.cn

  • includeLinkUrls:如果true,提取绝对链接URL并将其添加到元数据中(默认为false).spring-doc.cadn.net.cn

  • 元数据标签:一份列表<元论文>标签名称用于提取内容(默认为[“描述”、“关键词”]).spring-doc.cadn.net.cn

  • 附加元数据: 允许你为所有创建的自定义元数据添加公文对象。spring-doc.cadn.net.cn

示例文档:my-page.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Web Page</title>
    <meta name="description" content="A sample web page for Spring AI">
    <meta name="keywords" content="spring, ai, html, example">
    <meta name="author" content="John Doe">
    <meta name="date" content="2024-01-15">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header>
        <h1>Welcome to My Page</h1>
    </header>
    <nav>
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/about">About</a></li>
        </ul>
    </nav>
    <article>
        <h2>Main Content</h2>
        <p>This is the main content of my web page.</p>
        <p>It contains multiple paragraphs.</p>
        <a href="https://www.example.com">External Link</a>
    </article>
    <footer>
        <p>&copy; 2024 John Doe</p>
    </footer>
</body>
</html>

Jsoup文档阅读器处理HTML内容并创建公文基于配置的对象:spring-doc.cadn.net.cn

阅读器保留所选元素的文本内容,但去除其中的任何HTML标签。spring-doc.cadn.net.cn

折扣

Markdown文档阅读器处理 Markdown 文档,将其转换为公文对象。spring-doc.cadn.net.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();
    }
}

MarkdownDocumentReaderConfig允许您自定义 MarkdownDocumentReader 的行为:spring-doc.cadn.net.cn

  • horizontalRuleCreateDocument: 当设置为true,Markdown 中的水平规则将创造新的公文对象。spring-doc.cadn.net.cn

  • includeCodeBlock: 当设置为true,代码块将被包含在同一中公文就像周围的文字一样。什么时候false,代码块分别创建公文对象。spring-doc.cadn.net.cn

  • includeBlockquote: 当设置为true,块状引用将包含在同一条文中公文就像周围的文字一样。什么时候false,块引号单独生成公文对象。spring-doc.cadn.net.cn

  • 附加元数据: 允许你为所有创建的自定义元数据添加公文对象。spring-doc.cadn.net.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 内容,并根据配置创建文档对象:spring-doc.cadn.net.cn

阅读器保留了文档对象内容中的格式化,如内联代码、列表和文本样式。spring-doc.cadn.net.cn

PDF页面

PagePdf文档阅读器使用 Apache PdfBox 库来解析 PDF 文档spring-doc.cadn.net.cn

用 Maven 或 Gradle 把依赖添加到你的项目中。spring-doc.cadn.net.cn

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

或者去你的Gradlebuild.gradle构建文件。spring-doc.cadn.net.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文档阅读器利用 PDF 目录(例如目录)信息将输入的 PDF 拆分成文本段落,输出为单一公文每段。 注意:并非所有PDF文档都包含PDF目录。spring-doc.cadn.net.cn

依赖

用 Maven 或 Gradle 把依赖添加到你的项目中。spring-doc.cadn.net.cn

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

或者去你的Gradlebuild.gradle构建文件。spring-doc.cadn.net.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();
    }
}

Tika(DOCX、PPTX、HTML......)

Tika文档阅读器使用 Apache Tika 从多种文档格式中提取文本,如 PDF、DOC/DOCX、PPT/PPTX 和 HTML。有关支持格式的全面列表,请参阅 Tika 文档spring-doc.cadn.net.cn

依赖

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

或者去你的Gradlebuild.gradle构建文件。spring-doc.cadn.net.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();
    }
}

变形金刚

文本分配器

文本分配器一个抽象基类,帮助将文档划分为符合 AI 模型的上下文窗口。spring-doc.cadn.net.cn

TokenTextSplitter

TokenTextSplitter是 的实现文本分配器它根据Tokens数量将文本分割成块,使用CL100K_BASE编码。spring-doc.cadn.net.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);
    }
}

制造商选项

TokenTextSplitter提供两种构造器选项:spring-doc.cadn.net.cn

  1. Tokens文本分流器(): 创建一个默认设置的分线器。spring-doc.cadn.net.cn

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

参数

行为

TokenTextSplitter文本内容处理方式如下:spring-doc.cadn.net.cn

  1. 它将输入文本编码为符号,使用CL100K_BASE编码。spring-doc.cadn.net.cn

  2. 它会根据defaultChunkSize.spring-doc.cadn.net.cn

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

    1. 它会将该段落解码回文本。spring-doc.cadn.net.cn

    2. 它试图在minChunkSizeChars.spring-doc.cadn.net.cn

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

    4. 它会根据keepSeparator设置。spring-doc.cadn.net.cn

    5. 如果得到的块长于minChunkLengthToEmbed,它被添加到输出中。spring-doc.cadn.net.cn

  4. 该过程持续,直到所有Tokens被处理完毕或maxNumChunks到达。spring-doc.cadn.net.cn

  5. 如果剩余的文本长度超过,则作为最后一块添加minChunkLengthToEmbed.spring-doc.cadn.net.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());
}

笔记

  • TokenTextSplitter使用CL100K_BASE编码jtokkit该库与更新的OpenAI模型兼容。spring-doc.cadn.net.cn

  • 分割器试图通过在句子边界处打破,创造具有语义意义的片段。spring-doc.cadn.net.cn

  • 原始文档的元数据会被保存并复制到所有从该文档衍生出来的区块中。spring-doc.cadn.net.cn

  • 如果原始文档的内容格式化器(已设置)也会复制到派生的区块中copyContentFormatter设置为true(默认行为)。spring-doc.cadn.net.cn

  • 该分流器特别适合为有Tokens限制的大型语言模型准备文本,确保每个分块都在模型的处理能力范围内。spring-doc.cadn.net.cn

ContentFormatTransformer

确保所有文档内容格式统一。spring-doc.cadn.net.cn

KeywordMetadataEnricher

KeywordMetadataEnricherDocumentTransformer它利用生成式人工智能模型从文档内容中提取关键词并添加为元数据。spring-doc.cadn.net.cn

用法

@Component
class MyKeywordEnricher {

    private final ChatModel chatModel;

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

    List<Document> enrichDocuments(List<Document> documents) {
        KeywordMetadataEnricher enricher = KeywordMetadataEnricher.builder(chatModel)
                .keywordCount(5)
                .build();

        // Or use custom templates
        KeywordMetadataEnricher enricher = KeywordMetadataEnricher.builder(chatModel)
               .keywordsTemplate(YOUR_CUSTOM_TEMPLATE)
               .build();

        return enricher.apply(documents);
    }
}

制造商选项

KeywordMetadataEnricher提供两种构造器选项:spring-doc.cadn.net.cn

  1. KeywordMetadataEnricher(ChatModel chatModel, int keywordCount): 使用默认模板并提取指定数量的关键词。spring-doc.cadn.net.cn

  2. KeywordMetadataEnricher(ChatModel chatModel, PromptTemplate keywordsTemplate): 使用自定义模板进行关键词提取。spring-doc.cadn.net.cn

行为

KeywordMetadataEnricher文件处理方式如下:spring-doc.cadn.net.cn

  1. 对于每个输入文档,它会根据文档内容生成一个提示。spring-doc.cadn.net.cn

  2. 它会将此提示发送到所提供的聊天模型生成关键词。spring-doc.cadn.net.cn

  3. 生成的关键词会被添加到文档的元数据中,关键字为“excerpt_keywords”。spring-doc.cadn.net.cn

  4. 丰富的文件被归还。spring-doc.cadn.net.cn

定制

您可以使用默认模板,或通过 keywordsTemplate 参数自定义模板。 默认模板如下:spring-doc.cadn.net.cn

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

哪里{context_str}被替换为文档内容,且%s被指定的关键词数量取代。spring-doc.cadn.net.cn

示例

ChatModel chatModel = // initialize your chat model
KeywordMetadataEnricher enricher = KeywordMetadataEnricher.builder(chatModel)
                .keywordCount(5)
                .build();

// Or use custom templates
KeywordMetadataEnricher enricher = KeywordMetadataEnricher.builder(chatModel)
                .keywordsTemplate(new PromptTemplate("Extract 5 important keywords from the following text and separate them with commas:\n{context_str}"))
                .build();

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);

笔记

摘要MetadataEnricher

摘要MetadataEnricherDocumentTransformer它利用生成式人工智能模型为文档创建摘要并添加元数据。它可以生成当前文档以及相邻文档(上一页和下一页)的摘要。spring-doc.cadn.net.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);
    }
}

构造 函数

摘要MetadataEnricher提供两个构造子:spring-doc.cadn.net.cn

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

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

参数

行为

摘要MetadataEnricher文件处理方式如下:spring-doc.cadn.net.cn

  1. 对于每个输入文档,它会根据文档内容和指定的摘要模板生成一个提示。spring-doc.cadn.net.cn

  2. 它会将此提示发送到所提供的聊天模型生成摘要。spring-doc.cadn.net.cn

  3. 具体情况不同类型摘要它会为每个文档添加以下元数据:spring-doc.cadn.net.cn

  4. 丰富的文件被归还。spring-doc.cadn.net.cn

定制

摘要生成提示可以通过提供自定义提示来进行定制摘要模板.默认模板如下:spring-doc.cadn.net.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.cadn.net.cn

笔记

  • 摘要MetadataEnricher需要一个功能聊天模型生成摘要。spring-doc.cadn.net.cn

  • Enricher可以处理任意大小的文档列表,正确处理第一和最后文档的边缘情况。spring-doc.cadn.net.cn

  • 该增益器特别适合创建上下文感知摘要,有助于更好地理解序列中的文档关系。spring-doc.cadn.net.cn

  • 元数据模式参数允许控制现有元数据如何被纳入摘要生成过程。spring-doc.cadn.net.cn

作家

文件

文件文档编写器文档作者实现了写入列表内容的公文对象变成一个文件。spring-doc.cadn.net.cn

用法

@Component
class MyDocumentWriter {

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

构造 函数

文件文档编写器提供三个构造子:spring-doc.cadn.net.cn

  1. FileDocumentWriter(字符串文件名)spring-doc.cadn.net.cn

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

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

参数

行为

文件文档编写器文件处理方式如下:spring-doc.cadn.net.cn

  1. 它会为指定文件名打开一个文件编写器。spring-doc.cadn.net.cn

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

    1. 如果withDocumentMarkers是真的,它会写入包含文档索引和页码的文档标记。spring-doc.cadn.net.cn

    2. 它根据指定的格式化内容编写文档元数据模式.spring-doc.cadn.net.cn

  3. 所有文件写完后,档案即关闭。spring-doc.cadn.net.cn

文档标记

什么时候withDocumentMarkers设置为 true 时,写者会为每个文档添加以下格式的标记:spring-doc.cadn.net.cn

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

元数据处理

作者使用两个特定的元数据键:spring-doc.cadn.net.cn

这些标记用于书写文件标记。spring-doc.cadn.net.cn

示例

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

这将将所有文档写入“output.txt”,包括文档标记,使用所有可用的元数据,并在已有文件时附加到文件中。spring-doc.cadn.net.cn

笔记

VectorStore

提供与多种向量存储的集成。 完整列表请参见Vector数据库文档spring-doc.cadn.net.cn