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 / 第一轮对话:
image

会话1 / 第二轮对话:
image

会话2 / 第一轮对话:
image

会话2 / 第二轮对话:
image

会话2 / 第三轮对话:
image

posted @ 2026-09-08 15:21  codest  阅读(7)  评论(0)    收藏  举报