
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 串成一條可復用的灌庫流水線。