spring-ai-alibaba 1.0.0.2 学习(十三)——重排序模型_retrievalrerankadvisor
什么是重排序?
重排序是RAG中用到的一种优化技术,是指从向量数据库中检索到相关文档后,并不直接附在提示词中传给大模型,而是先对文档相关性打个分,然后过滤掉低于指定分值的文档,最后将高相关性文档按相关性大小排序后,再传给大模型作参考的过程。
而重排序模型,就是大模型提供商提供的用来给文档相关性进行打分的模型,与文本模型、文生图模型等都属于一种模型分类。
spring-ai在0.8.0版本中删除了DocumentRanker接口,用户可以自行实现DocumentPostProcessor接口来实现重排序功能。
不过spring-ai-alibaba提供了一个重排序的Advisor,方便用户实现开箱即用。
简单样例
第一步:添加配置以启动自动装配
spring.ai.dashscope.rerank.enabled=true
注:在1.0.0.2版本中,将自动配置开关设置成了spring.ai.model.audio.speech=openai,我看了下,主干分支已经修复这个问题了(spring-ai-alibaba/auto-configurations/spring-ai-alibaba-autoconfigure-dashscope/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeRerankAutoConfiguration.java at main · alibaba/spring-ai-alibaba),1.0.0.2版本中目前建议手动添加bean,源代码中的问题代码如下:
手动添加bean:将DashScopeRerankAutoConfiguration代码中dashscopeRerankModel方法添加到自己的配置类中声明为@Bean即可。
第二步:代码调用
private ChatClient chatClient; public SpringAiAlibabaExample13Rerank(ChatClient.Builder builder, VectorStore vectorStore, RerankModel rerankModel) { chatClient = builder.defaultAdvisors( new RetrievalRerankAdvisor(vectorStore, rerankModel) ).build(); } @GetMapping(\"/rerank\") public String tool(String input) { return chatClient.prompt() .user(input) .call() .content(); }
关于VectorStore的自动装配,在前面的文章中提过了(spring-ai-alibaba 1.0.0.2 学习(十一)——向量存储扩展包-CSDN博客),这里就不再重复了
内部原理及相关接口和类
RetrievalRerankAdvisor:该类实现了Advisor接口,会在调用大模型前后进行增强。构造函数中必填项为向量存储VectorStore和重排序大模型RerankModel。
在调用大模型前:RetrievalRerankAdvisor会在VectorStore中检索相似文档,之后将检索结果和用户请求发送给重排序大模型,得到每个文档的得分。按照得分高低排序并过滤掉低于指定分值的文档后,将文档和用户请求封装到一起。
RerankModel接口:重排序大模型接口,继承了Model接口,仅提供call方法。
DashScopeRerankModel:百炼平台重排序大模型,实现了RerankModel接口。内部包含一个DashScopeApi,负责底层通信。
DocumentWithScore:带得分的文档,用来封装RerankModel返回的文档及得分,包含在RerankResponse中。(Document类中本身包含score字段,不太清楚为什么会添加这个类)