Spring AI Chat Memory-JdbcChatMemoryRepository

0 阅读1分钟
  1. 项目依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>4.0.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
    <java.version>21</java.version>
    <spring-ai.version>2.0.0-M3</spring-ai.version>
</properties>

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>

  1. 创建配置类
@Bean
public ChatMemory chatMemory() {
    return MessageWindowChatMemory.builder()
            .chatMemoryRepository(chatMemoryRepository)
            .maxMessages(20) // 保留最近20条消息
            .build();
}


@Bean
ChatClient chatClient(ChatModel chatModel, ChatMemory chatMemory) {
    ChatClient chatClient = ChatClient.builder(chatModel).
            defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build(),
                    new SimpleLoggerAdvisor()).defaultSystem("我是的AI助手").build();
    return chatClient;
}

这里最好写spring.ai.chat.memory.repository.jdbc.platform=postgresql,其实也可以的不用写,官方的意思是根据数据库的类型会自动判断执行初始化sql,sql的位置官方也给出来了

spring.application.name=AI-Demo
spring.ai.openai.api-key=sk-
spring.ai.openai.base-url=https://api.deepseek.com
spring.ai.openai.chat.options.model=deepseek-chat
server.port=8080
management.endpoints.web.exposure.include=health,metrics,prometheus
spring.ai.chat.observations.log-completion=true
spring.ai.chat.observations.log-prompt=true
#????????SimpleLoggerAdvisor??????
logging.level.org.springframework.ai.chat.client.advisor=debug
spring.datasource.url=jdbc:postgresql://localhost:5432/
spring.datasource.username=postgres
spring.datasource.password=mysecretpassword
spring.datasource.driver-class-name=org.postgresql.Driver
# Spring AI JDBC Chat Memory ??
spring.ai.chat.memory.repository.jdbc.initialize-schema=always
spring.ai.chat.memory.repository.jdbc.platform=postgresql

Configuration Properties

PropertyDescriptionDefault Value
spring.ai.chat.memory.repository.jdbc.initialize-schemaControls when to initialize the schema. Values: embedded (default), alwaysnever.embedded
spring.ai.chat.memory.repository.jdbc.schemaLocation of the schema script to use for initialization. Supports classpath: URLs and platform placeholders.classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-@@platform@@.sql
spring.ai.chat.memory.repository.jdbc.platformPlatform to use in initialization scripts if the @@platform@@ placeholder is used.au

image.png

  1. 编写入口和测试,启动项目后登录数据库,发现有一个初始化表

image.png

/**
 * 会话记忆
 */
@RestController
@RequestMapping("/memory")
public class MemoryrController {

    @Autowired
    ChatClient chatClient;

    /**
     *
     * @param msg
     * @param sessionId
     * @return
     */
    @GetMapping("/chat")
    public String chat(@RequestParam("msg") String msg,@RequestParam("sessionId") String sessionId){

        String content = this.chatClient.prompt().user(msg).
                advisors(a -> a.param(ChatMemory.CONVERSATION_ID, sessionId))
                .call().content();
        return content;
    }
}

1.第一次和AI对话:我喜欢篮球 2.第二次和AI对对话:我喜欢什么运动

image.png

  1. 总结 使用JdbcChatMemoryRepository十分容易上手,大家可以试试