- 项目依赖
<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>
- 创建配置类
@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
| Property | Description | Default Value |
|---|---|---|
spring.ai.chat.memory.repository.jdbc.initialize-schema | Controls when to initialize the schema. Values: embedded (default), always, never. | embedded |
spring.ai.chat.memory.repository.jdbc.schema | Location 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.platform | Platform to use in initialization scripts if the @@platform@@ placeholder is used. | au |
- 编写入口和测试,启动项目后登录数据库,发现有一个初始化表
/**
* 会话记忆
*/
@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对对话:我喜欢什么运动
- 总结 使用JdbcChatMemoryRepository十分容易上手,大家可以试试