上文讲了,用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": "你好呀!😊 有什么我可以帮你的吗?"}
]