上文讲了,用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.Driver
url: jdbc:mysql://XX:3306/ai?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
username: XX
password: XX
第三步调整chatClient,支持Memory存储
@Configuration
public class ChatClientConfig {
/**
* 初始化chatClient
* @param builder
* @param jdbcTemplate
* @return
*/
@Bean
public ChatClient chatClient(ChatClient.Builder builder,JdbcTemplate jdbcTemplate){
return builder
.defaultAdvisors(
MessageChatMemoryAdvisor.builder(mysqlJdbcMemory(jdbcTemplate))
.build())
.build();
}
/**
* 初始化memory
* @param jdbcTemplate
* @return
*/
@Bean
public 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": "你好呀!😊 有什么我可以帮你的吗?"
}
]