spring-ai-alibaba 1.0.0.2 学习(四)——语句切分器、文档检索拦截器
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