spring-ai-alibaba 1.0.0.2 学习(四)——语句切分器、文档检索拦截器
本文对比了spring-ai-alibaba的文本切分工具:SentenceSplitter和原生TokenTextSplitter的区别。TokenTextSplitter仅支持英文分隔符,不适合中文处理;而SentenceSplitter基于OpenNLP模型,能更准确识别中文语句。DocumentRetrievalAdvisor作为VectorStore的上层封装,提供了更灵活的检索功能,允
spring-ai-alibaba对spring-ai的很多模块进行了扩展增强,今天我们来看一下其中的语句切分器SentenceSplitter和文档检索拦截器DocumentRetrievalAdvisor
TextSplitter对比
TokenTextSplitter
spring-ai的文本切分工具目前还比较少,只有一个TokenTextSplitter
TokenTextSplitter的主要逻辑是先按最大token切分,然后再往前找最近的分隔符(英文的句号、问号、叹号、换行符)
由于TokenTextSplitter的分隔符是英文,且为硬编码无法自定义,所以该文本切分器并不适合用来处理中文
SentenceSplitter
spring-ai-alibaba提供的SentenceSplitter是基于opennlp的SentenceDetectorME实现的,其主要作用是将文本分割为句子。
SentenceDetectorME通过预先训练好的模型(spring-ai-alibaba-core包中opennlp目录下的bin文件),准确的识别出语句。
SentenceSplitter之后会将识别出的语句按最大token数进行聚合处理。
目前还没有对SentenceSplitter进行详细的测试,但是理论上对于中文,效果应该会比TokenTextSplitter好。
RecursiveCharacterTextSplitter
个人感觉SentenceSplitter效果可能会略差于python的递归字符分割器,递归字符分割器对段落的聚合可能会更好一些。
SentenceSplitter使用
使用比较简单,创建后调用split方法即可
List<Document> documentList = ...;
SentenceSplitter splitter = new SentenceSplitter(100);
List<Document> newDocuments = splitter.split(documentList);
DocumentRetrievalAdvisor
DocumentRetrievalAdvisor内部实现与spring-ai的QuestionAnswerAdvisor几乎一样,唯一区别在于QuestionAnswerAdvisor需要注入一个VectorStore,而DocumentRetrievalAdvisor需要注入一个DocumentRetriever
而两者的区别也很简单,DocumentRetriever是对VectorStore的检索功能的一个上层封装,相对于VectorStore一般是由第三方向量数据库提供,DocumentRetriever可以自行实现,更加灵活
如果想在检索前后添加一些自定义操作,DocumentRetrievalAdvisor更加方便一些
使用方法如下:
public SpringAiAlibabaExample04TextSplitterAndDocumentRetriever(ChatClient.Builder builder, VectorStore vectorStore) {
chatClient = builder.defaultAdvisors(
new DocumentRetrievalAdvisor(
VectorStoreDocumentRetriever.builder()
.vectorStore(vectorStore)
.build()
)
).build();
}
@GetMapping("/retriever")
public String retriever(String input) {
return chatClient.prompt()
.user(input)
.call()
.content();
}
这里我使用的是spring-ai的VectorStoreDocumentRetriever,可以根据自身需要实现一个DocumentRetriever
更多推荐
所有评论(0)