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`)
);
愿你走出半生,归来仍是少年!
浙公网安备 33010602011771号