ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Spring AI 12 · DocumentReader 读取多种格式

Spring AI 12 · DocumentReader 读取多种格式 12 · DocumentReader 读取多种格式 学完能做什么用 Spring AI 的 DocumentReader 把 TXT/PDF/Markdown/JSON 等真实文件读成 Document 列表为分块和灌库做准备。⏱️ 预计耗时40 分钟含动手 依赖前置第 09 章Document 难度一句话DocumentReader 是 ETL 的第一步「读」负责把各种格式的文件统一读成ListDocument屏蔽格式差异。1. ETL 全景Reader 在哪一环RAG 灌库其实是一条 ETL 流水线Reader读── Splitter切块── 富化 metadata ── Embedding ── VectorStore灌 ↑本章 第13章 第14章 第7章 第8/9章本章只管第一环把文件读进来。2. 各格式对应的 Reader 与依赖Spring AI 为不同格式提供了不同 Reader多数需额外加依赖格式Reader依赖 artifactTXT / 纯文本TextReader核心自带PDFPagePdfDocumentReader/ParagraphPdfDocumentReaderspring-ai-pdf-document-readerMarkdownMarkdownDocumentReaderspring-ai-markdown-document-readerJSONJsonReader核心自带Word/HTML 等TikaDocumentReaderspring-ai-tika-document-reader 拿不准格式或格式很杂时TikaDocumentReader是万金油底层用 Apache Tika支持几十种格式。3. TextReader读纯文本ComponentclassTxtIngest{Value(classpath:/docs/faq.txt)privateResourcefaq;ListDocumentread(){TextReaderreadernewTextReader(faq);reader.getCustomMetadata().put(source,faq.txt);// 给读出的 doc 打标returnreader.get();// 返回 ListDocument}}4. PDF按页 or 按段落// 依赖spring-ai-pdf-document-readerValue(classpath:/docs/manual.pdf)privateResourcepdf;ListDocumentreadPdf(){// 按页读每页一个 Documentmetadata 自动带 page 页码PagePdfDocumentReaderreadernewPagePdfDocumentReader(pdf);returnreader.get();}PagePdfDocumentReader每页一个 Document自动带页码 metadata利于溯源第 21 章。ParagraphPdfDocumentReader按 PDF 书签/段落结构切结构化更好但依赖 PDF 本身有目录结构。5. Markdown保留结构// 依赖spring-ai-markdown-document-readerValue(classpath:/docs/guide.md)privateResourcemd;ListDocumentreadMd(){MarkdownDocumentReaderConfigconfigMarkdownDocumentReaderConfig.builder().withHorizontalRuleCreateDocument(true)// 遇到 --- 分文档.withIncludeCodeBlock(false)// 是否把代码块并入.withIncludeBlockquote(false).build();returnnewMarkdownDocumentReader(md,config).get();}Markdown 的标题层级是天然的切分线索配合下一章的分块效果更好。6. Tika万能格式Word/PPT/HTML…// 依赖spring-ai-tika-document-readerValue(classpath:/docs/policy.docx)privateResourcedocx;ListDocumentreadAny(){returnnewTikaDocumentReader(docx).get();}7. 读取后先检查再进入下一环读出来别急着灌先看看质量避免「垃圾进垃圾出」ListDocumentdocsreader.get();System.out.println(读到 docs.size() 个文档);docs.stream().limit(2).forEach(d-{System.out.println(内容片段: d.getText().substring(0,Math.min(80,d.getText().length())));System.out.println(metadata: d.getMetadata());});常见问题PDF 扫描件是图片读出空文本需 OCR、编码乱码、页眉页脚噪音等。8. 常见坑现象原因 / 处理PDF 读出来是空的扫描版图片 PDF需先 OCR中文乱码文件编码问题TextReader 可指定 charset缺依赖ClassNotFound对应 Reader 的 artifact 没加一个大 PDF 读成一个巨长 Document正常交给下一章分块处理9. 一句话总结DocumentReader 是 ETL 的「读」TXT/JSON 核心自带PDF/Markdown 各有专用 Reader格式杂就用万能的 Tika读出ListDocument后先检查质量再交给分块。➡️ 下一章13-TextSplitter文档分块.md把读进来的长文档切成大小合适的 chunk这是检索质量的关键一环。
返回列表