文章目錄
- 1、需求
- 2、ChatMemory中消息的存儲位置
- 3、實現步驟
- 1、引入依賴
- 2、配置Spring AI
- 3、配置chatmemory
- 4、java層傳遞conversaionId
- 4、驗證
- 5、完整代碼
- 6、參考文檔
1、需求
我們知道大型語言模型 (LLM
) 是無狀態
的,這就意味著他們不會保存之前的交互信息。當我們希望在一次會話中,模型支持多次交互,那么我們該如何實現呢? 在 Spring AI
中提供了ChatMemory
功能,它允許我們在與LLM的多次交互中存儲與檢索信息。此處我們借助Spring AI的ChatMemory功能實現一個簡單的多輪對話。
-
- 集成ollama部署的本地模型
-
- 使用jdbc存儲聊天歷史信息(保存到mysql中)
2、ChatMemory中消息的存儲位置
默認
情況下是存儲在內存
中,但是它也提供了JDBC
、Cassandra
和Neo4j
的實現。
如果我們想自定義實現存儲該如何實現呢? 需要實現ChatMemoryRepository
接口。此處我們不自己實現,使用Spring AI
提供的 JDBC
存儲實現。
注意:使用Spring AI 提供的JDBC實現需要引入 spring-ai-starter-model-chat-memory-repository-jdbc 包
。
3、實現步驟
1、引入依賴
<properties><spring-ai.version>1.0.0</spring-ai.version><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target> <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 集成ollama --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency><!-- 使用jdbc存儲模型的聊天記錄 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
</dependencies>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
2、配置Spring AI
spring:application:name: spring-ai-advisor-chat-memoryai:ollama:base-url: http://localhost:11434 # 配置ollama的地址chat:model: deepseek-r1:14b # 配置模型的名稱options:temperature: 0.7 # 配置模型溫度chat:memory:repository:jdbc:initialize-schema: always# 配置初始化腳本的位置schema: classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-mariadb.sqlplatform: mariadbdatasource:url: jdbc:mysql://127.0.0.1:3306/temp_work?useUnicode=true&characterEncoding=utf8&autoReconnectForPools=true&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverlogging:level:# 用于支持llm模型輸入前和輸入后的日志打印org.springframework.ai.chat.client.advisor: debug
3、配置chatmemory
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.ChatMemoryRepository;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.memory.repository.jdbc.JdbcChatMemoryRepository;
import org.springframework.ai.chat.memory.repository.jdbc.JdbcChatMemoryRepositoryDialect;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;/*** ai 配置* @author huan.fu* @date 2025/6/8 - 08:44*/
@Configuration
public class AiConfiguration {@Beanpublic JdbcChatMemoryRepository jdbcChatMemoryRepository(JdbcTemplate jdbcTemplate, DataSource dataSource) {JdbcChatMemoryRepositoryDialect dialect = JdbcChatMemoryRepositoryDialect.from(dataSource);return JdbcChatMemoryRepository.builder().jdbcTemplate(jdbcTemplate).dialect(dialect).build();}@Beanpublic ChatMemory chatMemory(ChatMemoryRepository jdbcChatMemoryRepository){return MessageWindowChatMemory.builder().chatMemoryRepository(jdbcChatMemoryRepository)// 每個會話最多記錄20條信息.maxMessages(20).build();}@Beanpublic ChatClient chatClient(OllamaChatModel ollamaChatModel, ChatMemory chatMemory){// 配置模型 (因為我們使用的是 ollama, 所以此處寫的是 OllamaChatModel)return ChatClient.builder(ollamaChatModel)// 默認系統提示詞.defaultSystem("你是一個擁有豐富經驗的編程小助手,擅長編寫各種程序。")// 添加模型輸入前和輸入后日志打印.defaultAdvisors(new SimpleLoggerAdvisor(),// 配置 chat memory advisorMessageChatMemoryAdvisor.builder(chatMemory).build()).build();}
}
4、java層傳遞conversaionId
4、驗證
依次訪問如下2個http請求
http://localhost:8080/blockChat?prompt=介紹一下你自己&conversationId=123456789
http://localhost:8080/blockChat?prompt=我剛剛問的問題是什么&conversationId=123456789
會話id需保持一致
從上圖中可以,在第二次詢問模型時,模型知道上次的問題是什么。
5、完整代碼
https://gitee.com/huan1993/spring-cloud-parent/tree/master/spring-ai/spring-ai-advisor-chat-memory
6、參考文檔
1、https://docs.spring.io/spring-ai/reference/api/chat-memory.html