SpringAI系列---【多租户记忆和淘汰策略】

1.多租户工作原理

2.引入jdbc的pom

spring官网链接:https://docs.spring.io/spring-ai/reference/api/chat-memory.html,推荐使用官网的jdbc。

阿里巴巴ai链接:https://github.com/alibaba/spring-ai-alibaba/tree/main/community/memories

jdbc的依赖

        <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-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>

3.配置chatclient和编写测试类

@SpringBootTest
public class ChatMemoryTest {

    /**
     * 多租户记忆
     * 默认是存在jvm内存中:InMemoryChatMemoryRepository
     *
     * @param chatClientBuilder
     */
    @Test
    public void testMemory(@Autowired ChatClient.Builder chatClientBuilder, @Autowired ChatMemory chatMemory) {
        ChatClient chatClient = chatClientBuilder.defaultAdvisors(new SimpleLoggerAdvisor(),PromptChatMemoryAdvisor.builder(chatMemory).build())
                .build();

        String content1 = chatClient.prompt()
                .system("你是一个智能助手。")
                .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, "1"))
                .user("我叫张三")
                .call()
                .content();

        String content2 = chatClient.prompt()
                .system("你是一个智能助手。")
                .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, "1"))
                .user("我是谁?")
                .call()
                .content();

        String content3 = chatClient.prompt()
                .system("你是一个智能助手。")
                .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, "2"))
                .user("我是谁?")
                .call()
                .content();
    }


    /**
     * 多租户记忆
     * 默认是存在jvm内存中:InMemoryChatMemoryRepository
     *
     * @param chatClientBuilder
     */
    @Test
    public void testMemoryStore(@Autowired ChatClient.Builder chatClientBuilder, @Autowired ChatMemory chatMemory) {

        ChatClient chatClient = chatClientBuilder.defaultAdvisors(new SimpleLoggerAdvisor(),PromptChatMemoryAdvisor.builder(chatMemory).build())
                .build();

        String content1 = chatClient.prompt()
                .system("你是一个智能助手。")
                .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, "1"))
                .user("我叫张三")
                .call()
                .content();

        String content2 = chatClient.prompt()
                .system("你是一个智能助手。")
                .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, "1"))
                .user("我是谁?")
                .call()
                .content();

        String content3 = chatClient.prompt()
                .system("你是一个智能助手。")
                .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, "2"))
                .user("我是谁?")
                .call()
                .content();
    }

    @TestConfiguration
    static class ChatMemoryConfig {
        @Bean
        public ChatMemory chatMemory(JdbcChatMemoryRepository jdbcChatMemoryRepository) {
            return MessageWindowChatMemory.builder()
                    .chatMemoryRepository(jdbcChatMemoryRepository)
                    .maxMessages(10)
                    .build();
        }
    }
}

4.配置yml文件

spring:
  ai:
    ollama:
      base-url: http://localhost:11434
      embedding:
        options:
          model: nomic-embed-text
      chat:
        options:
          model: qwen3:8b
          temperature: 0.7
    chat:
      memory:
        repository:
          jdbc:
            initialize-schema: ALWAYS
            schema: classpath:db/schema.sql

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring-ai?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
    username: root
    password: root123
logging:
  level:
    #查看Rag查到的内容以及给大模型传递的内容
    org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor: debug

5.准备sql(连不上的话,手动创建库和表)

CREATE TABLE IF NOT EXISTS SPRING_AI_CHAT_MEMORY (
`conversation_id` VARCHAR(36) NOT NULL,
`content` TEXT NOT NULL,
`type` VARCHAR(10) NOT NULL,
`timestamp` TIMESTAMP NOT NULL,
INDEX `SPRING_AI_CHAT_MEMORY_CONVERSATION_ID_TIMESTAMP_IDX` (`conversation_id`, `timestamp`)
);

posted on 2025-09-02 01:58  少年攻城狮  阅读(25)  评论(0)    收藏  举报

导航