Spring AI (二)结合Mysql做聊天信息存储

发布于:2025-09-11 ⋅ 阅读:(15) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到