spring-ai 第十五一节 RAG(加更ETL)
官网
spring-ai网址【https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html】
提取、转换和加载(ETL)框架是数据处理的支柱
ETL管道协调从原始数据源到结构化向量存储的数据流,确保数据以最佳格式供AI模型检索
- ETL 管道创建、转换和存储Document 实例

ETL管道有三个主要组成部分
- DocumentReader (读取)
- DocumentTransformer (转换)
- DocumentWriter (写入)

DocumentReader
- json、text文本、html、pdf、markdown等
- json pom相关增加配置如下:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-jsoup-document-reader</artifactId>
</dependency>
- pdf pom相关增加配置如下:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-pdf-document-reader</artifactId>
</dependency>
DocumentTransformer
- TextSplitter
- TokenTextSplitter
相关参数
- chunkSize每个文本块的令牌目标大小(默认:800)
- minChunkSizeChars每个文本块的最小字符数(默认:350)
- minChunkLengthToEmbed: 包含的块的最小长度(默认:5)
- maxNumChunks从文本生成的最大块数(默认:10000)
- keepSeparator是否在块中保留分隔符(如换行符)(默认:true)
- punctuationMarks:用于分割句子的字符列表(默认: .,?,!,\n)
@Component
class MyInternationalTextSplitter {
public List<Document> splitChineseText(List<Document> documents) {
// Use Chinese punctuation marks
TokenTextSplitter splitter = TokenTextSplitter.builder()
.withChunkSize(800)
.withMinChunkSizeChars(350)
.withPunctuationMarks(List.of('。', '?', '!', ';')) // Chinese punctuation
.build();
return splitter.apply(documents);
}
public List<Document> splitWithCustomMarks(List<Document> documents) {
// Mix of English and other punctuation marks
TokenTextSplitter splitter = TokenTextSplitter.builder()
.withChunkSize(800)
.withPunctuationMarks(List.of('.', '?', '!', '\n', ';', ':', '。'))
.build();
return splitter.apply(documents);
}
}
DocumentWriter
将Document对象列表的内容写入文件
- FileDocumentWriter
List<Document> documents = // initialize your documents
FileDocumentWriter writer = new FileDocumentWriter("output.txt", true, MetadataMode.ALL, true);
writer.accept(documents);
完整源码示例(解析一个pdf文件知识文档)
https://gitee.com/kcnf_open/spring-ai-sample/tree/master/spring-ai/spring-ai-sample11-rag/spring-ai-sample11-rag-02-etl
http://127.0.0.1:8082/api/rag/search
{
"question": "spring ai"
}
验证结果

