ETL
ETL(Extract抽取,Transform转换,Load加载),宏观上看就是对知识库的文档进行处理,然后存储到向量数据库的过程。
文档Document
从源码可以看到,Document不只是有文档的内容,还可以包含一系列元信息和多媒体附件,可以使文档更方便地被搜索和排序。
在SpringAI中,对Document处理有三个步骤:
1. 抽取文档
2. 转换文档
3. 写入文档
SpringAI分别通过DocumentReader->DocumentTransformer->DocumentWriter三大组件实现ETL
接下来将要对其具体实现进行介绍。
抽取Extract
public interface DocumentReader extends Supplier<List<Document>> {
default List<Document> read() {
return get();
}
}
实现了 Supplier<List<Document>>接口,将各种数据源文件中的数据转换为Document
SpringAI提供了多种DocumentReader实现类来读取不同类型源文件的数据
转换Transform
public interface DocumentTransformer extends Function<List<Document>, List<Document>> {
default List<Document> transform(List<Document> documents) {
return apply(documents);
}
}
DocumentTransformer负责将一组Document转换为另一组Ducument
SpringAI提供了多种实现类
1. TextSplitter
是文本切割器的基类
TokenTextSplitter是其实现,基于token的文本切割器。考虑了语义边界来切割文档。
2. MetadataEnricher元数据增强器
为文档补充更多的元数据
- KeywordMetadataEnricher:使用AI提取关键词附加到元数据中
- SummaryMetadataEnricher:使用AI生成摘要添加到元数据,可以关联前后相邻的文档
3. ContentFormatter内容格式化工具
加载Load
通过DocumentWriter实现文档写入
1. FileDocumentWriter:将文档写入文件系统
2. VectorStoreWriter:将文档写入向量数据库