📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第11章 庖丁解牛:RAG 源码全链路剖析
11.1 DocumentReader / Writer 的 SPI 扩展机制
11.1.1 DocumentReader 接口设计
DocumentReader 继承体系:
Supplier<List<Document>>
└── DocumentReader
├── TextReader (纯文本)
├── JsonReader (JSON)
├── PagePdfDocumentReader(PDF 按页)
├── TikaDocumentReader (万能解析,基于 Apache Tika)
└── 自定义 Reader...
/**
* DocumentReader 核心接口 —— 本质是 Supplier<List<Document>>
* Spring AI 用函数式接口实现 SPI 扩展
*/
public interface DocumentReader extends Supplier<List<Document>> {
// 继承 Supplier,调用 get() 即可获取文档列表
}
// 以 PagePdfDocumentReader 为例看实现
public class PagePdfDocumentReader implements DocumentReader {
private final Resource pdfResource;
private final PdfDocumentReaderConfig config;
@Override
public List<Document> get() {
// 1. 用 Apache PDFBox 解析 PDF
PDDocument pdDocument = PDDocument.load(pdfResource.getInputStream());
PDFTextStripper stripper = new PDFTextStripper();
List<Document> documents = new ArrayList<>();
for (int page = 1; page <= pdDocument.getNumberOfPages(); page++) {
stripper.setStartPage(page);
stripper.setEndPage(page);
String text = stripper.getText(pdDocument);
// 2. 每页生成一个 Document,附带元数据
Map<String, Object> metadata = Map.of(
"page_number", page,
"source", pdfResource.getFilename()
);
documents.add(new Document(text, metadata));
}
return documents;
}
}
11.1.2 自定义 Reader 扩展
/**
* 自定义 Confluence Reader —— 实现 DocumentReader 即可接入 RAG 管道
*/
public class ConfluenceDocumentReader implements DocumentReader {
private final String baseUrl;
private final String spaceKey;
private final RestTemplate restTemplate;
@Override
public List<Document> get() {
// 调用 Confluence REST API 获取页面内容
String url = baseUrl + "/rest/api/content?spaceKey=" + spaceKey + "&expand=body.storage";
JsonNode response = restTemplate.getForObject(url, JsonNode.class);
List<Document> docs = new ArrayList<>();
for (JsonNode page : response.get("results")) {
String title = page.get("title").asText();
String html = page.get("body").get("storage").get("value").asText();
// 用 Jsoup 清洗 HTML
String text = Jsoup.parse(html).text();
docs.add(new Document(text, Map.of(
"source", "confluence",
"title", title,
"pageId", page.get("id").asText()
)));
}
return docs;
}
}
11.2 DocumentTransformer 链式处理的管道模式
11.2.1 管道模式源码
处理管道:
🔒 解锁完整内容
本章剩余内容需要解锁后查看
以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。
加入知识星球你将获得:
- ✅ 全部 26 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。