首页 / 资讯中心 / 文章详情

Spring AI RAG 从零落地:文档读取→切分→向量化→入库完整 ETL 管线图解

Spring AI RAG 从零落地:文档读取→切分→向量化→入库完整 ETL 管线图解 ★ FEATURED ARTICLE
Spring AI RAG 从零落地文档读取→切分→向量化→入库完整 ETL 管线图解系列Spring AI 深入浅出第 9 篇版本Spring AI 2.0.1 / Spring Boot 4.1.x / JDK 21标签#SpringAI #RAG #知识库 #ETL前置阅读第 2 篇《ChatClient 全拆解》预计字数6500 字可复制源码 ETL 流程图 踩坑 FAQ本文将解决RAG检索增强生成是先喂资料再问喂资料这条ETL 管线读取→切分→向量化→入库是知识库的地基。本文一步步拆给你看。你将学到为什么需要 RAG模型不知道你的私有知识ETL 管线五步读取 → 切分 → 向量化 → 入库 → 检索DocumentReader选型文本/PDF/网页Chunk 切分策略chunk size / overlapEmbedding 概念与模型选择端到端可运行的 ETL 代码一、版本标注本文基于 Spring AI 2.0.1 / Boot 4.1 / JDK 21。RAG 相关类DocumentReader/TextSplitter/VectorStore在 2.0 统一抽象VectorStore覆盖 20 数据库具体构造签名以 2.0.1 官方文档为准。二、为什么需要 RAG大模型的训练数据是过去的、也是通用的不知道你的私有知识公司文档、产品手册、内部制度。RAGRetrieval-Augmented Generation检索增强生成解决的就是这个问题Retrieval检索从你的知识库里找出相关内容Augmented增强把检索到的内容拼进 promptGeneration生成模型基于这些内容作答而检索的前提是先把资料处理好、入库——这就是 ETL 管线。三、ETL 管线五步①读取DocumentReader②清洗/切分DocumentTransformer③向量化EmbeddingModel④入库VectorStore⑤检索similaritySearch① 读取把各种来源文本、PDF、网页、数据库读成Document② 清洗/切分去噪、切块Chunk切分是效果关键③ 向量化把文本转成向量数字数组用于语义相似度计算④ 入库向量存进VectorStore⑤ 检索查询时把问题也向量化找最相似的 Chunk四、DocumentReader 选型DocumentReader负责把来源读成Document常见实现Reader用途说明TextReader纯文本最简单入门用PdfPageDocumentReaderPDF逐页读取TikaDocumentReaderWord/Excel/PPT/HTML 等依赖 Apache Tika格式全JsonReaderJSON结构化数据importorg.springframework.ai.reader.TextReader;importorg.springframework.core.io.ClassPathResource;importorg.springframework.ai.document.Document;TextReaderreadernewTextReader(newClassPathResource(product-manual.txt));ListDocumentdocumentsreader.get();五、Chunk 切分策略效果的关键文本不能整篇入库——太长超上下文、检索粒度太粗。要切成Chunk块importorg.springframework.ai.transformer.splitter.TokenTextSplitter;TokenTextSplittersplitterTokenTextSplitter.builder().withChunkSize(800)// 每块约 800 token.withChunkOverlap(100)// 相邻块重叠 100 token避免语义被切断.build();ListDocumentchunkssplitter.split(documents);两个参数的取舍经验值参数太小太大建议chunkSize语义破碎、检索碎片化超出检索精度、超上下文500~1000 token 起步chunkOverlap无重叠易切断关键句冗余、增加存储10%~20% 的 chunkSize切分粒度要和你的知识类型匹配FAQ 类可以按条切长文档按语义段切。切分策略是 RAG 效果的头号变量第 11 篇会展开讲。六、Embedding 概念Embedding向量化把一段文本映射成一个高维向量如 1024 维的浮点数组。语义相近的文本向量距离就近。查询时把用户问题也向量化和库里的 Chunk 算相似度取最相近的几条——这就是语义检索。Embedding 模型负责做向量化选择和向量库维度一致的模型第 10 篇展开。importorg.springframework.ai.embedding.EmbeddingModel;// 向量化一段文本具体用法以 2.0.1 文档为准float[]vectorembeddingModel.embed(text);七、端到端 ETL 代码把上面串起来一个完整的喂资料流程ComponentpublicclassDocumentIngestionService{privatefinalEmbeddingModelembeddingModel;privatefinalVectorStorevectorStore;publicDocumentIngestionService(EmbeddingModelembeddingModel,VectorStorevectorStore){this.embeddingModelembeddingModel;this.vectorStorevectorStore;}publicvoidingest(Resourceresource){// ① 读取TextReaderreadernewTextReader(resource);ListDocumentdocumentsreader.get();// ② 切分TokenTextSplittersplitterTokenTextSplitter.builder().withChunkSize(800).withChunkOverlap(100).build();ListDocumentchunkssplitter.split(documents);// ③ 向量化 ④ 入库VectorStore 内部会调用 embeddingModel 向量化vectorStore.add(chunks);}}说明多数VectorStore的add(Document)内部会调用EmbeddingModel完成向量化所以业务代码里常常不用手动调embed()具体以 2.0.1 实现为准。八、原理图解RAG 完整链路入库 查询查询阶段入库阶段文档切分 Chunk向量化VectorStore用户问题向量化相似度检索 TopK拼入 Prompt 增强模型生成答案入库只做一次或增量更新查询是高频路径。九、踩坑 FAQ坑 1chunk 太大超上下文 / 太小语义碎现象检索返回的内容要么塞不进 prompt要么答非所问。原因chunkSize 没调好。解决从 500~1000 token 起步按知识类型调配 overlap 避免切碎语义。坑 2embedding 维度与向量库不匹配现象入库报维度不一致错误。原因embedding 模型输出的维度和向量库建表/索引维度对不上。解决先定 embedding 模型维度再按此维度建库第 10 篇细讲。坑 3PDF 提取乱码现象PDF 读出来的文本是乱码或空。原因PdfPageDocumentReader对扫描件/复杂排版提取不佳。解决换TikaDocumentReader扫描件需 OCR。坑 4重复入库现象同一文档多次 ingest 后检索出重复内容。原因ETL 没有去重/更新逻辑。解决入库前按文档标识去重或用增量更新策略第 12 篇细讲。坑 5切分把关键上下文切断了现象一个完整定义被切到两块检索只命中半截。原因overlap 太小或切分点不合理。解决调大 overlap或按语义边界段落/标题切分。十、小结与合集导航本篇搭好了 RAG 的地基——ETL 管线五步读取 → 切分 → 向量化 → 入库 → 检索DocumentReader按来源选型TokenTextSplitter控 chunkEmbeddingModel向量化VectorStore入库chunkSize/overlap 是效果的头号变量下一篇《向量库选型与接入》——内存/Redis/PGVector/Milvus/ES 怎么选。十一、互动钩子投票你的知识库文档主要是什么格式PDFWord/Markdown网页/HTML结构化数据JSON/DB评论区聊聊你的文档类型和切分经验源码见置顶评论。
阅读完成 · 觉得有帮助?
咨询建站