Spring AI 聊天记忆(Chat Memory)技术详解与最佳实践

本文围绕 Spring AI 的 Chat Memory 机制,结合名词解释、发展历史、架构原理、实战应用与 mermaid 流程图、状态图、时序图等可视化方式,系统性梳理 LLM 聊天记忆的原理与最佳落地方式。适合 AI 应用开发者、架构师、产品经理等技术人员速读速记。


一、概述

1.1 什么是 Chat Memory?

Chat Memory(聊天记忆)是指在与大语言模型(LLM)交互时,系统为每个会话维护的上下文信息,用以提升模型对多轮对话的理解能力。相比于 Chat History(聊天历史,完整记录所有消息),Chat Memory 关注于「对当前上下文有用的消息集合」,可根据策略裁剪、持久化或分布式存储。

1.2 为什么需要 Chat Memory?

大语言模型本身是无状态的(stateless),每次调用都无法自动记住历史对话内容。这导致:

  • 用户多轮提问时,模型无法回忆先前已知信息。
  • 复杂任务(如工具调用、流程管理)需要跨轮记忆。
  • 长对话可能超出模型输入长度(token limit),需要智能裁剪。

因此,Chat Memory 是 AI 应用开发的基础设施。


二、名词解释与架构原理

名词 解释
Chat Memory 用于维护 LLM 交互上下文的消息集合,支持裁剪、存储、检索等策略。
Chat History 完整的会话消息记录,通常用于审计、分析、回溯等场景。
ChatMemory Spring AI 的聊天记忆抽象接口,负责管理消息窗口与记忆操作。
ChatMemoryRepository 聊天记忆存储层抽象,支持多种后端(内存、JDBC、Mongo、Cassandra、Neo4j、CosmosDB等)。
MessageWindowChatMemory 基于消息窗口的记忆策略,只保留最近 N 条消息。
Advisor Spring AI 的记忆增强器,用于自动将记忆内容拼接到 Prompt 或消息流。
PromptTemplate 系统消息渲染模板,可自定义记忆内容与系统指令的拼接方式。

三、发展历史与项目背景

3.1 发展历程

  • 早期 LLM 无状态问题:GPT-3、ChatGPT 等模型无原生记忆,每次调用需传入完整上下文。
  • AI 应用开发痛点:多轮对话、工具调用、流程管理等场景需要记忆机制。
  • Spring AI 记忆系统:Spring AI 结合 Spring 生态,抽象出 ChatMemory 和 ChatMemoryRepository,实现灵活可插拔的记忆存储层。

3.2 相关权威资料


四、Chat Memory 结构与流程图解

4.1 架构总览(Flowchart)

flowchart TD
    subgraph 用户
        U1[用户输入]
    end
    subgraph 应用层
        A1[ChatClient/ChatModel]
        A2[Advisor(记忆增强器)]
    end
    subgraph 记忆层
        M1[ChatMemory]
        M2[ChatMemoryRepository]
    end
    subgraph 存储后端
        S1[InMemory]
        S2[JDBC]
        S3[MongoDB]
        S4[Cassandra]
        S5[Neo4j]
        S6[CosmosDB]
    end

    U1-->A1
    A1-->A2
    A2-->M1
    M1-->M2
    M2-->|自动装配|S1
    M2-->|可配置|S2
    M2-->|可配置|S3
    M2-->|可配置|S4
    M2-->|可配置|S5
    M2-->|可配置|S6
    M1-->|上下文|A1
    A1-->|Prompt|LLM[大语言模型]
    LLM-->A1
    A1-->U1

说明:用户输入经过应用层(ChatClient/ChatModel),由 Advisor 自动注入记忆内容,ChatMemory 管理消息窗口,ChatMemoryRepository 提供多后端存储,最终生成 Prompt 发给 LLM。


4.2 消息窗口记忆状态转移(StateDiagram)

用户发起对话
新增消息
新增消息
超出窗口大小
移除最早消息
会话关闭/超时/TTL到期
空闲
新会话
活跃
裁剪
结束

说明:记忆窗口随消息增加而扩展,超出最大消息数时自动裁剪,支持会话关闭或消息过期(TTL),保证资源可控。


4.3 多轮对话时序(SequenceDiagram)

sequenceDiagram
    participant User as 用户
    participant Client as ChatClient
    participant Advisor as MessageChatMemoryAdvisor
    participant Memory as ChatMemory
    participant Repo as ChatMemoryRepository
    participant LLM as 大语言模型

    User->>Client: 输入消息1
    Client->>Advisor: 请求记忆增强
    Advisor->>Memory: 获取会话记忆
    Memory->>Repo: 拉取消息窗口
    Repo-->>Memory: 返回消息列表
    Memory-->>Advisor: 提供消息窗口
    Advisor->>Client: 拼接上下文
    Client->>LLM: 发送消息+记忆
    LLM-->>Client: 回复
    Client->>Memory: 追加新回复
    Memory->>Repo: 持久化消息
    User->>Client: 输入消息2
    ...(重复流程)

说明:每次用户输入,ChatClient 调用 Advisor 拼接记忆窗口,Memory 负责拉取和追加消息,Repo 负责存储,LLM 获得完整上下文。


五、实践应用代码速记

5.1 自动装配与自定义

自动装配(默认内存存储)
@Autowired
ChatMemory chatMemory;

@Autowired
ChatMemoryRepository chatMemoryRepository;
自定义 JDBC 存储
@Autowired
JdbcChatMemoryRepository chatMemoryRepository;
ChatMemory chatMemory = MessageWindowChatMemory.builder()
    .chatMemoryRepository(chatMemoryRepository)
    .maxMessages(10)
    .build();
自定义 MongoDB 存储
@Autowired
MongoChatMemoryRepository chatMemoryRepository;
ChatMemory chatMemory = MessageWindowChatMemory.builder()
    .chatMemoryRepository(chatMemoryRepository)
    .maxMessages(10)
    .build();

5.2 ChatClient 结合记忆

ChatMemory chatMemory = MessageWindowChatMemory.builder().build();
ChatClient chatClient = ChatClient.builder(chatModel)
    .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
    .build();

String conversationId = "007";
chatClient.prompt()
    .user("Do I have license to code?")
    .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
    .call()
    .content();

六、系统性认知速记口

  1. Chat Memory 不是 Chat History,只保留对当前上下文有用的消息。
  2. Spring AI 提供 ChatMemory 抽象,支持多种存储后端,易于扩展与持久化。
  3. Advisor 自动拼接记忆窗口到模型输入,无需手动管理上下文。
  4. 记忆窗口可按消息数、时间、token 数量裁剪,灵活适配不同场景。
  5. 可自定义 PromptTemplate 合并系统消息与记忆内容,提升对话质量。
  6. 持久化后端支持分布式、审计、规模化应用需要(如 MongoDB、Cassandra)。
  7. 记忆机制是多轮对话、工具调用、上下文感知 AI 应用的核心基础设施

七、参考资料


八、总结与展望

Spring AI 的 Chat Memory 机制为 LLM 应用开发提供了高效、可扩展、易用的上下文管理能力。通过灵活配置存储后端、自动拼接记忆窗口、可插拔增强器(Advisor),开发者可轻松实现多轮对话、工具调用、流程管理等高级 AI 场景。未来,随着 LLM 生态发展,记忆机制将进一步支持更智能的裁剪、分布式协作与隐私保护,成为 AI 应用的基础设施之一。


本文如需转载,请注明出处。欢迎关注、交流 AI 应用开发相关问题!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐