925 字
约 3 分钟
2
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 |
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://www.clxhxhhr.top/posts/630/ 评论
0 条
还没有评论,先写一条吧。