上文講了,用Spring ai做簡單的聊天功能,沒看過的可以查看下
Spring AI結合豆包模型
這里簡單結合下Jdbc做下聊天記錄的存儲和查詢,讓對話變的更智能。
首先是Pom的支持
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency>
第二步數據庫配置的支持
spring: datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://XX:3306/ai?useUnicode=true&characterEncoding=utf8&allowMultiQueries=trueusername: XXpassword: XX
第三步調整chatClient,支持Memory存儲
@Configuration
public class ChatClientConfig {/*** 初始化chatClient* @param builder* @param jdbcTemplate* @return*/@Beanpublic ChatClient chatClient(ChatClient.Builder builder,JdbcTemplate jdbcTemplate){return builder.defaultAdvisors(MessageChatMemoryAdvisor.builder(mysqlJdbcMemory(jdbcTemplate)).build()).build();}/*** 初始化memory* @param jdbcTemplate* @return*/@Beanpublic ChatMemory mysqlJdbcMemory(JdbcTemplate jdbcTemplate){ChatMemoryRepository chatMemoryRepository = JdbcChatMemoryRepository.builder().jdbcTemplate(jdbcTemplate).dialect(new MysqlChatMemoryRepositoryDialect()).build();return MessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();}
第四步調整聊天接口,存儲聊天數據
/*** 存儲聊天* @param msg* @param conversationId* @param response* @return*/@GetMapping("/chat/memory/steam")public Flux<String> chatStreamMemory(String msg,String conversationId, HttpServletResponse response){response.setCharacterEncoding("UTF-8");return chatClient.prompt().user(msg).advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId)).stream().content();}
第五步聊天數據查詢
/*** 獲取消息內容* @param conversationId* @return*/@GetMapping("/messages")public List<Message> messages(String conversationId) {return jdbcChatMemory.get(conversationId);}
表結構
CREATE TABLE `spring_ai_chat_memory` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`conversation_id` varchar(256) NOT NULL,`content` longtext CHARACTER SET utf8mb4 NOT NULL,`type` varchar(100) NOT NULL,`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
注意設置content未uft8mb4,支持表情等內容。
查詢的結果如下:
[{"messageType": "USER","metadata": {"messageType": "USER"},"media": [],"text": "你的優勢是啥"},{"messageType": "USER","metadata": {"messageType": "USER"},"media": [],"text": "你好"},{"messageType": "ASSISTANT","metadata": {"messageType": "ASSISTANT"},"toolCalls": [],"media": [],"text": "你好呀!😊 有什么我可以幫你的嗎?"}
]