Spring Ai超简单教程系列 - 06会话记忆
在网上找了一些Spring AI相关的教程,因为官方API更新较快的原因,大部分教程的内容都已过时。所以在参照官方参考文档学习的同时,沉淀每篇文章,为同样热爱学习的你,提供参考。
本系列教程参考Spring AI官方1.1.x版本文档:https://docs.spring.io/spring-ai/reference/1.1/index.html
会话记忆
会话记忆,也叫会话上下文。因为大语言模型(LLM)是无状态的,这意味着它们不会保留先前交互的信息。如果希望在多次交互中保持上下文或状态时,需要一套会话记忆功能。为了解决这一问题,Spring AI 提供了聊天记忆功能,可让您在与 LLM 的多次交互中存储和检索信息。
Spring AI提供的ChatMemory抽象层实现了多种类型的上下文持久化方式,以支持不同的使用场景。消息的底层存储由 ChatMemoryRepository负责存储和检索消息。具体保留哪些消息以及何时删除,则由ChatMemory的实现方式决定。例如,可以采用保留最近 N 条消息、在特定时间段内保留消息,或在达到一定令牌数量上限时保留消息等策略。
ChatMemory支持的的持久化方式:
- 内存
- JDBC
- PostgreSQL
- MySQL / MariaDB
- SQL Server
- HSQLDB
- Oracle Database
- Apache Cassandra
- Neo4j
- Azure Cosmos DB
- MongoDB
这里使用内存存储的方式简单展示会话记忆能力,其它持久化方案可以自行查阅Spring AI官方文档。
参考代码
@RestController
public class ChatMemoryController {
private final OpenAiChatModel chatModel;
private final ChatMemory chatMemory;
private final ChatClient chatClient;
public ChatMemoryController(@Autowired OpenAiChatModel chatModel) {
this.chatModel = chatModel;
this.chatMemory = MessageWindowChatMemory.builder().maxMessages(5).build();
this.chatClient = ChatClient.builder(chatModel).defaultAdvisors(
MessageChatMemoryAdvisor.builder(chatMemory).build()
).build();
}
@GetMapping("/ai/chat/memory")
String chatMemory(
@RequestParam("conversationId") String conversationId,
@RequestParam("message") String message
) {
return this.chatClient
.prompt()
.user(message)
.system("你的名字叫Codest,如果用户询问你的名字可以告诉他")
.advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, conversationId))
.call()
.content();
}
}
会话记忆验证
我们模拟两个用户会话,通过自我介绍的方式告诉大模型名字,并在后续对话中向大模型确认前面已经告诉他的名字。
- 会话1
- 第一轮对话:我的名字叫张三,你名字是什么?
- 第二轮对话:我的名字叫什么?
- 会话2
- 第一轮对话:我的名字是什么?(新一轮对话我们没有提及自己的名字,大模型会告诉我们他不知道)
- 第二轮对话:我的名字叫李四
- 第三轮对话:我的名字拼音怎么写?
效果
会话1 / 第一轮对话:

会话1 / 第二轮对话:

会话2 / 第一轮对话:

会话2 / 第二轮对话:

会话2 / 第三轮对话:


浙公网安备 33010602011771号