From 5ee2a0f11c5d899fd27bb4f284fb96ba937b2a3d Mon Sep 17 00:00:00 2001
From: Hanserwei <2628273921@qq.com>
Date: Fri, 31 Oct 2025 20:48:28 +0800
Subject: [PATCH] =?UTF-8?q?refactor(chat):=E9=87=8D=E6=9E=84AI=E5=8A=A9?=
=?UTF-8?q?=E6=89=8B=E5=8A=9F=E8=83=BD=E5=B9=B6=E9=9B=86=E6=88=90=E6=96=87?=
=?UTF-8?q?=E6=A1=A3=E8=AF=BB=E5=8F=96=E8=83=BD=E5=8A=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 移除原有的手机号识别与消息发送逻辑
- 删除RabbitMQ和邮件相关配置及代码
- 引入PDF、HTML、JSON等多种文档读取器
- 集成向量存储与检索功能支持问答
- 更新Spring AI依赖并调整内存存储方式
- 添加新的工具类用于保存文档到向量库- 修改提示词模板去除强制附加句规则
- 调整Cassandra和PgVector相关配置项- 新增多种文件格式读取组件实现类
---
pom.xml | 49 +++++---
.../chat/config/ChatClientConfiguration.java | 60 +++++-----
.../hanserwei/chat/config/RabbitMQConfig.java | 37 ------
.../hanserwei/chat/config/RedisConfig.java | 30 -----
.../chat/consumer/RabbitMQConsumer.java | 47 --------
.../chat/controller/AiChatController.java | 40 +++----
.../chat/publisher/RabbitMQPublisher.java | 29 -----
.../hanserwei/chat/reader/MyHtmlReader.java | 34 ++++++
.../hanserwei/chat/reader/MyJsonReader.java | 27 +++++
.../chat/reader/MyMarkdownReader.java | 33 ++++++
.../hanserwei/chat/reader/MyPdfReader.java | 28 +++++
.../hanserwei/chat/reader/MyTextReader.java | 48 ++++++++
.../chat/reader/MyTikaPptReader.java | 29 +++++
.../chat/reader/MyTikaWordReader.java | 28 +++++
.../chat/tools/SaveDocumentsTools.java | 33 ++++++
.../chat/tools/SendMQMessageTools.java | 105 ------------------
.../src/main/resources/config/application.yml | 47 ++++----
.../src/main/resources/prompt/aiAssistant.st | 14 +--
18 files changed, 363 insertions(+), 355 deletions(-)
delete mode 100644 snails-chat/src/main/java/com/hanserwei/chat/config/RabbitMQConfig.java
delete mode 100644 snails-chat/src/main/java/com/hanserwei/chat/config/RedisConfig.java
delete mode 100644 snails-chat/src/main/java/com/hanserwei/chat/consumer/RabbitMQConsumer.java
delete mode 100644 snails-chat/src/main/java/com/hanserwei/chat/publisher/RabbitMQPublisher.java
create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/reader/MyHtmlReader.java
create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/reader/MyJsonReader.java
create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/reader/MyMarkdownReader.java
create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/reader/MyPdfReader.java
create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/reader/MyTextReader.java
create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/reader/MyTikaPptReader.java
create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/reader/MyTikaWordReader.java
create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/tools/SaveDocumentsTools.java
delete mode 100644 snails-chat/src/main/java/com/hanserwei/chat/tools/SendMQMessageTools.java
diff --git a/pom.xml b/pom.xml
index 6a633c3..92a7cde 100644
--- a/pom.xml
+++ b/pom.xml
@@ -58,14 +58,6 @@
jasypt-spring-boot-starter
${jasypt-starter-version}
-
- com.alibaba.cloud.ai
- spring-ai-alibaba-starter-memory-redis
-
-
- org.springframework.boot
- spring-boot-starter-data-redis
-
org.postgresql
postgresql
@@ -83,18 +75,47 @@
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
-
- org.springframework.boot
- spring-boot-starter-amqp
-
com.fasterxml.jackson.core
jackson-databind
- org.springframework.boot
- spring-boot-starter-mail
+ org.springframework.ai
+ spring-ai-starter-vector-store-pgvector
+
+
+ org.springframework.ai
+ spring-ai-advisors-vector-store
+
+
+
+ org.springframework.ai
+ spring-ai-starter-model-chat-memory-repository-cassandra
+
+
+
+ org.springframework.ai
+ spring-ai-markdown-document-reader
+
+
+
+ org.springframework.ai
+ spring-ai-jsoup-document-reader
+
+
+
+ org.springframework.ai
+ spring-ai-pdf-document-reader
+
+
+
+ org.springframework.ai
+ spring-ai-tika-document-reader
+
+
+
+
diff --git a/snails-chat/src/main/java/com/hanserwei/chat/config/ChatClientConfiguration.java b/snails-chat/src/main/java/com/hanserwei/chat/config/ChatClientConfiguration.java
index e19ddd3..9154f57 100644
--- a/snails-chat/src/main/java/com/hanserwei/chat/config/ChatClientConfiguration.java
+++ b/snails-chat/src/main/java/com/hanserwei/chat/config/ChatClientConfiguration.java
@@ -1,15 +1,20 @@
package com.hanserwei.chat.config;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
-import com.alibaba.cloud.ai.memory.redis.BaseRedisChatMemoryRepository;
-import com.alibaba.cloud.ai.memory.redis.LettuceRedisChatMemoryRepository;
+import com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel;
import com.hanserwei.chat.tools.AiDBTools;
-import com.hanserwei.chat.tools.SendMQMessageTools;
+import com.hanserwei.chat.tools.SaveDocumentsTools;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
+import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
+import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
+import org.springframework.ai.chat.memory.repository.cassandra.CassandraChatMemoryRepository;
+import org.springframework.ai.vectorstore.SimpleVectorStore;
+import org.springframework.ai.vectorstore.VectorStore;
+import org.springframework.aot.hint.annotation.RegisterReflection;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -17,49 +22,46 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class ChatClientConfiguration {
- @Value("${spring.ai.memory.redis.host}")
- private String redisHost;
- @Value("${spring.ai.memory.redis.port}")
- private int redisPort;
- @Value("${spring.ai.memory.redis.password}")
- private String redisPassword;
- @Value("${spring.ai.memory.redis.timeout}")
- private int redisTimeout;
-
-
@Resource
private DashScopeChatModel dashScopeChatModel;
@Resource
private AiDBTools aiDBTools;
-
+ @Resource
+ private DashScopeEmbeddingModel dashScopeEmbeddingModel;
+ @Resource
+ private CassandraChatMemoryRepository chatMemoryRepository;
+ @Resource
+ private VectorStore vectorStore;
+
+
@Value("classpath:prompt/aiAssistant.st")
private org.springframework.core.io.Resource aiAssistantResource;
@Bean
- public BaseRedisChatMemoryRepository redisChatMemoryRepository() {
- // 构建RedissonRedisChatMemoryRepository实例
- return LettuceRedisChatMemoryRepository.builder()
- .host(redisHost)
- .port(redisPort)
- .password(redisPassword)
- .timeout(redisTimeout)
+ public ChatMemory chatMemory() {
+ return MessageWindowChatMemory.builder()
+ .maxMessages(50)
+ .chatMemoryRepository(chatMemoryRepository)
.build();
}
@Bean
- public ChatMemory chatMemory(BaseRedisChatMemoryRepository chatMemoryRepository) {
- return MessageWindowChatMemory
- .builder()
- .maxMessages(100000)
- .chatMemoryRepository(chatMemoryRepository).build();
+ public SimpleVectorStore simpleVectorStore() {
+ return SimpleVectorStore.builder(dashScopeEmbeddingModel)
+ .build();
}
@Bean
- public ChatClient dashScopeChatClient(ChatMemory chatMemory, SendMQMessageTools sendMQMessageTools) {
+ public ChatClient dashScopeChatClient(ChatMemory chatMemory,
+ SaveDocumentsTools saveDocumentsTools
+ ) {
+ PromptChatMemoryAdvisor chatMemoryAdvisor = PromptChatMemoryAdvisor.builder(chatMemory).build();
+ SimpleLoggerAdvisor simpleLoggerAdvisor = new SimpleLoggerAdvisor();
+ QuestionAnswerAdvisor questionAnswerAdvisor = new QuestionAnswerAdvisor(vectorStore);
return ChatClient.builder(dashScopeChatModel)
- .defaultTools(aiDBTools, sendMQMessageTools)
+ .defaultTools(aiDBTools, saveDocumentsTools)
.defaultSystem(aiAssistantResource)
- .defaultAdvisors(PromptChatMemoryAdvisor.builder(chatMemory).build())
+ .defaultAdvisors(chatMemoryAdvisor,simpleLoggerAdvisor,questionAnswerAdvisor)
.build();
}
}
\ No newline at end of file
diff --git a/snails-chat/src/main/java/com/hanserwei/chat/config/RabbitMQConfig.java b/snails-chat/src/main/java/com/hanserwei/chat/config/RabbitMQConfig.java
deleted file mode 100644
index 76aee93..0000000
--- a/snails-chat/src/main/java/com/hanserwei/chat/config/RabbitMQConfig.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.hanserwei.chat.config;
-
-import org.springframework.amqp.core.Binding;
-import org.springframework.amqp.core.BindingBuilder;
-import org.springframework.amqp.core.DirectExchange;
-import org.springframework.amqp.core.Queue;
-import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
-import org.springframework.amqp.support.converter.MessageConverter;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class RabbitMQConfig {
-
- @Bean
- public DirectExchange directExchange() {
- return new DirectExchange("chat.exchange");
- }
-
- @Bean
- public Queue queue() {
- return new Queue("chat.queue");
- }
-
- @Bean
- public Binding binding() {
- return BindingBuilder.bind(queue())
- .to(directExchange())
- .with("chat.routing.key");
- }
-
- @Bean
- public MessageConverter messageConverter() {
- return new Jackson2JsonMessageConverter();
- }
-
-}
diff --git a/snails-chat/src/main/java/com/hanserwei/chat/config/RedisConfig.java b/snails-chat/src/main/java/com/hanserwei/chat/config/RedisConfig.java
deleted file mode 100644
index 5af31dc..0000000
--- a/snails-chat/src/main/java/com/hanserwei/chat/config/RedisConfig.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.hanserwei.chat.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
-
-@Configuration
-public class RedisConfig {
- @Bean
- public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
- RedisTemplate redisTemplate = new RedisTemplate<>();
- // 设置 RedisTemplate 的连接工厂
- redisTemplate.setConnectionFactory(connectionFactory);
-
- // 使用 StringRedisSerializer 来序列化和反序列化 redis 的 key 值,确保 key 是可读的字符串
- redisTemplate.setKeySerializer(new StringRedisSerializer());
- redisTemplate.setHashKeySerializer(new StringRedisSerializer());
-
- // 使用 Jackson2JsonRedisSerializer 来序列化和反序列化 redis 的 value 值, 确保存储的是 JSON 格式
- Jackson2JsonRedisSerializer