Spring AI alibaba使用Redis Vector报错修改过程
spring-AI集成向量数据库redis使用实现RAG_让springai实现rag-CSDN博客
阅读官网示例代码
这里可以看spring ai alibaba的官网提供的示例使用源码,我是在官网示例代码基础上改的,pom文件看他的依赖

这里要用RedisStack,不能用之前用的Redis,会报错,也不需要RedisConfig(大概是自动装配了,不太清楚)RedisStack 是redis 的增强版
这个是用虚拟机配置的docker-compose.yml,因为我想快速测试,就没用服务器的了,也没密码,服务器上的最好设置密码,端口和原来的redis冲突了,改成6380了

xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>
这里自动注入,不需要用RedisVectorStore这个类
上面可以运行成功的

应用到项目里报错
Spring 容器中没有 VectorStore 类型的 Bean
在自己项目里面用报错,Spring 容器中没有 VectorStore 类型的 Bean
markdown
***************************
APPLICATION FAILED TO START
***************************
Description:
Field vectorStore in com.acecomp.ai.service.impl.DocumentProcessServiceImpl required a bean of type 'org.springframework.ai.vectorstore.VectorStore' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.springframework.ai.vectorstore.VectorStore' in your configuration.
已与地址为 ''127.0.0.1:63705',传输: '套接字'' 的目标虚拟机断开连接
这里上面的文章说是因为我项目里面引入了spring-boot-starter-data-redis, 会导致无法自动注入,但是没办法项目是基于这个写的,再改配置怕出问题

spring ai 会自动配置redis,现在Vector无法注入,需要现在手动配置 但是我Redis数据库连接池在 yml 里是用lettuce,这里用Jedis,真是神奇,能跑成功


依赖版本冲突导致的 `NoSuchFieldError: batchingStrategy
又报错,依赖版本冲突 导致的 NoSuchFieldError: batchingStrategy
, 版本M5+Jedis自配置后出现这个情况
ini
22:39:52.946 [http-nio-8080-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,168] - Initializing Spring DispatcherServlet 'dispatcherServlet'
22:39:53.076 [http-nio-8080-exec-1] INFO c.a.a.s.i.FileServiceImpl - [extractFromMultipartFile,56] - 开始提取文本,文件: AI智赛通测试文档.docx, 大小: 0.01681041717529297MB, 类型: application/octet-stream
22:39:53.192 [http-nio-8080-exec-1] INFO c.a.a.s.i.FileServiceImpl - [detectFileType,104] - 文件类型检测 - 文件名: AI智赛通测试文档.docx, 声明类型: application/octet-stream, 检测类型: application/vnd.openxmlformats-officedocument.wordprocessingml.document
22:39:55.015 [http-nio-8080-exec-1] ERROR c.a.f.w.e.GlobalExceptionHandler - [handleException,111] - 请求地址'/ai/doc/upload/vector',发生系统异常.
jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchFieldError: batchingStrategy
22:39:55.055 [http-nio-8080-exec-1] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - [logException,254] - Resolved [jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchFieldError: batchingStrategy]
关键修改步骤:
- spring ai alibaba和spring ai 的版本兼容
- spring ai alibaba 改成1.0.0.3
- spring ai为1.0.0
- AI聊天改成兼容的写法
spring ai alibaba依赖导入不再导入spring-ai-alibaba-starter
xml
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M5.1</version>
<dependency>
我的项目有父工程和子工程,下面是正确的导入
spring boot是3.5.4,这里用bom
xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version>
<lombok.version>1.18.30</lombok.version>
<!-- Spring AI -->
<spring-ai.version>1.0.0</spring-ai.version>
<!-- Spring AI Alibaba -->
<spring-ai-alibaba.version>1.0.0.3</spring-ai-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>${spring-ai-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
注意这里spring-ai-alibaba工件用dashcope,spring-ai-advisors-vector-store这个是AI对话记忆要用的包
xml
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>
之后根据版本改AI的写法
这里可以参考官网的example的例子,github.com/spring-ai-a...
scss
Flux<String> text = chatClient.prompt()
.user(inputMsg)
.advisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
.advisors(a -> a
.param(CONVERSATION_ID, conversationId)
.param(TOP_K, CHAT_HISTORY_SIZE)
)
.stream()
.content();
成功了!!!!

