Spring AI 14 · metadata 富化与来源标注 📅 2026/8/26 1:24:57 14 · metadata 富化与来源标注 学完能做什么在 ETL 过程中为每个 chunk 补齐来源、分类、时间等 metadata让过滤检索和答案溯源真正可用。⏱️ 预计耗时35 分钟含动手 依赖前置第 09 章metadata 设计、第 11 章过滤、第 13 章分块 难度一句话metadata 富化就是给每个 chunk 贴标签标签贴得好后面才能按范围过滤第 11 章、给答案标出处第 21 章。1. 为什么要在 ETL 里富化 metadata分块后每个 chunk 只有文本光有文本你没法❌ 按「租户/分类/时间」过滤检索 ❌ 告诉用户「这个答案来自哪份文件第几页」 ❌ 更新时精准删除某来源的旧数据这些都依赖 metadata。而分块第 13 章常会丢失或稀释原文档的元信息所以要在 ETL 里主动补回来。2. metadata 的三类来源① 系统自动带的如 PagePdfDocumentReader 自动写入的 page 页码 ② 灌库时人工指定的source、category、tenantId、version ③ 从内容里提取的标题、日期、作者可用规则或让 LLM 抽取3. 手动富化给每个 chunk 打标ListDocumentchunkssplitter.apply(reader.get());Stringsource员工手册v3.pdf;for(Documentc:chunks){c.getMetadata().put(source,source);c.getMetadata().put(category,HR);c.getMetadata().put(tenantId,1001);c.getMetadata().put(ingestTime,Instant.now().toString());}vectorStore.add(chunks); 页码等 Reader 自动写入的字段要保留别覆盖掉——它是溯源到「第几页」的关键。4. 用 DocumentTransformer 做统一富化Spring AI 提供 Transformer 让富化步骤可插拔、可复用// KeywordMetadataEnricher让 LLM 为每个 chunk 抽取关键词并写入 metadataKeywordMetadataEnricherkeywordEnrichernewKeywordMetadataEnricher(chatModel,5);// 每块抽 5 个关键词ListDocumentenrichedkeywordEnricher.apply(chunks);// SummaryMetadataEnricher为每个 chunk 生成摘要写入 metadataSummaryMetadataEnrichersummaryEnrichernewSummaryMetadataEnricher(chatModel,List.of(SummaryMetadataEnricher.SummaryType.CURRENT));ListDocumentwithSummarysummaryEnricher.apply(enriched);⚠️ 这类 Enricher 会额外调用大模型灌库成本和耗时都会上升。海量数据要权衡第 32 章。5. 关键词/摘要富化能带来什么关键词可作为混合检索第 29 章的关键词侧输入提召回。摘要可用于「先粗筛摘要、再精排原文」的两阶段检索或直接展示给用户。6. 富化后的一条 chunk 长什么样{id:manual-v3-p12-c3,content:签收起 7 天内商品保持完好可无理由退货……,metadata:{source:员工手册v3.pdf,page:12,category:HR,tenantId:1001,excerpt_keywords:退货,7天,完好,无理由,ingestTime:2026-08-01T10:00:00Z}}有了这些第 11 章的过滤、第 21 章的溯源就都水到渠成。7. 富化设计清单灌库前先想清楚要支持的能力需要的 metadata多租户隔离tenantId按业务分类过滤category答案标注出处sourcepage/section按时间过滤/淘汰旧版version/ingestTime混合检索关键词excerpt_keywords 重申铁律第 09 章metadata 是灌库时注定的事后补要重灌。宁可多贴几个标签。8. 一句话总结metadata 富化在 ETL 里给每个 chunk 补齐来源/分类/时间/关键词等标签手动打标满足过滤与溯源LLM Enricher 可抽关键词与摘要提质——但会增成本按需使用。➡️ 下一章15-ETL管道批量灌库.md把 Reader→Splitter→富化→Embedding→VectorStore 串成一条可复用的灌库流水线。