925 字
约 3 分钟
6
Spring AI RAG 文档读取:把各种文件统一转换成 Document

Spring AI RAG 文档读取:把各种文件统一转换成 Document

在 RAG 中,第一步不是向量化,而是先把各种数据读取出来。

我们常见的数据可能是:

TXT
JSON
Markdown
HTML
PDF

这些文件格式不同,Spring AI 会先通过对应的 DocumentReader,统一转换成:

List<Document>

整体流程可以理解为:

文件
 ↓
DocumentReader
 ↓
Document
 ↓
文本分块
 ↓
Embedding
 ↓
向量数据库
 ↓
RAG 检索

一、Document 是什么?

Document 是 Spring AI 中非常核心的数据结构。

可以简单理解成:

Document
├── text        文本内容
└── metadata    元数据

例如读取 PDF 后:

Document
text = "第一章 Java 基础..."

metadata:
page = 1
source = Java面试手册.pdf

不管原始数据是 TXT、PDF 还是 HTML,进入 Spring AI 后都可以统一按照 Document 处理。


二、TXT:TextReader

TXT 文件使用:

TextReader textReader = new TextReader(resource);

List<Document> documents = textReader.read();

流程:

TXT
 ↓
TextReader
 ↓
Document

如果文件比较大,还需要进行文本分块。

List<Document> splitDocuments =
        TokenTextSplitter.builder()
                .withChunkSize(500)
                .build()
                .apply(documents);

TokenTextSplitter 的作用就是:

把一个大 Document 切成多个小 Document。

这一步也叫:

Chunking

它是 RAG 非常重要的一步。


三、JSON:JsonReader

JSON 可以使用:

JsonReader

例如:

JsonReader jsonReader =
        new JsonReader(
                resource,
                "description",
                "content",
                "title"
        );

List<Document> documents = jsonReader.get();

本质就是:

JSON
 ↓
提取指定字段
 ↓
Document

所以 JsonReader 的重点是:

指定哪些 JSON 字段需要进入知识库。


四、Markdown:MarkdownDocumentReader

Markdown 本身具有:

标题
分割线
代码块
引用

因此可以使用专门的:

MarkdownDocumentReader

例如:

MarkdownDocumentReaderConfig config =
        MarkdownDocumentReaderConfig.builder()
                .withHorizontalRuleCreateDocument(true)
                .withIncludeCodeBlock(false)
                .withIncludeBlockquote(false)
                .build();

可以控制:

--- 是否生成新 Document
代码块是否保留
引用块是否保留

相比普通 TextReader,它更了解 Markdown 的结构。


五、HTML:JsoupDocumentReader

HTML 页面中通常包含很多无用信息:

导航栏
菜单
广告
Footer
Script
CSS

真正需要的往往只有正文。

因此可以使用:

JsoupDocumentReader

并通过 CSS Selector:

.selector("article p")

只提取正文。

流程:

HTML
 ↓
JsoupDocumentReader
 ↓
CSS Selector
 ↓
正文
 ↓
Document

这在:

网页抓取 → 知识库

场景中非常实用。


六、PDF:PagePdfDocumentReader

PDF 可以使用:

PagePdfDocumentReader

例如:

PagePdfDocumentReader pdfReader =
        new PagePdfDocumentReader(
                "classpath:/document/profile.pdf",
                PdfDocumentReaderConfig.builder()
                        .withPagesPerDocument(1)
                        .build()
        );

其中:

.withPagesPerDocument(1)

表示:

PDF 每一页生成一个 Document。

例如 12 页 PDF:

PDF
├── 第1页 → Document
├── 第2页 → Document
├── 第3页 → Document
...
└── 第12页 → Document

这样做 RAG 检索时,可以直接找到最相关的页面,而不是把整本 PDF 都发送给大模型。


七、常用 Reader

文件 Reader
TXT TextReader
JSON JsonReader
Markdown MarkdownDocumentReader
HTML JsoupDocumentReader
PDF PagePdfDocumentReader

除此之外,还需要记住:

TokenTextSplitter

它负责:

大 Document
 ↓
多个小 Document

八、它在 RAG 中的位置

完整流程:

TXT / JSON / MD / HTML / PDF
              ↓
        DocumentReader
              ↓
           Document
              ↓
      TokenTextSplitter
              ↓
       多个小 Document
              ↓
         Embedding
              ↓
        向量数据库

用户提问时:

用户问题
 ↓
Embedding
 ↓
向量相似度检索
 ↓
找到相关 Document
 ↓
交给大模型
 ↓
生成答案

所以这一部分解决的核心问题就是:

知识库的数据怎么读取进 Spring AI?

记住一句话即可:

不同文件 → 对应 Reader → Document → 分块 → 向量化 → 存入向量数据库。

Spring AI RAG 文档读取:把各种文件统一转换成 Document
http://clxhxhhr.top/posts/630/
作者
clxstart
发布于
2026-09-15
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。