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