当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/263224.html

相关文章:

  • JavaEE初阶第五期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(三)
  • 区块链技术有哪些运用场景?
  • Nacos 3.0 架构全景解读,AI 时代服务注册中心的演进
  • SpringCloud微服务 Eureka服务注册与发现
  • python训练打卡DAY40
  • OpenCV计算机视觉实战(14)——直方图均衡化
  • 88.LMS当幅度和相位同时失配时,为啥最后权值w的相位angle(w(end))收敛到angle(mis)不是-angle(mis)
  • 【机器人】复现 HOV-SG 机器人导航 | 分层 开放词汇 | 3D 场景图
  • 洛谷 P1449:后缀表达式 ← 数组模拟栈
  • JAX study notes[11]
  • vue-32(部署一个 Nuxt.js 应用程序)
  • 【PaddleOCR】PP-OCRv5:通用 OCR 产线的卓越之选
  • 一文详解Modbus协议原理、技术细节及软件辅助调试
  • 2025 湖南大学程序设计竞赛(补题)
  • 基于F5TTS的零样本语音合成
  • 第9篇:Gin配置管理-Viper的实战使用
  • 《JMS 消息重试机制与死信队列配置指南:以 IBM MQ 与 TongLinkQ 为例》
  • Java中的锁思想
  • Java开发者转型AI时代的路径
  • js代码04
  • (LeetCode 面试经典 150 题) 135. 分发糖果 (贪心)
  • vue3 el-table 列增加 自定义排序逻辑
  • 青少年 Python AI 科普小游戏设计方案
  • 成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用
  • 【windows上VScode开发STM32】
  • 【Debian】2-1 frp内网穿透原理
  • 第25天:高级数据库学习笔记1
  • WTL 之trunk技术学习
  • Compose入门1 - 高仿抖音 上下滑动播放视频
  • 深入解析JADX:专业Android逆向工程的利器