跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第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 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

11.2.2 TokenTextSplitter 切分算法

11.3 VectorStore 抽象层与适配器实现

11.3.1 VectorStore 接口

11.4 QuestionAnswerAdvisor 完整链路

11.4.1 Advisor 拦截链

11.5 Filter 表达式引擎

11.6 源码阅读路线图