第九模型介绍-聊天记录
官网
大型语言模型(LLMs)是无状态的,这意味着它们不会保留之前交互的信息。当您希望在多次交互中保持上下文或状态时,这可能是一个限制。为了解决这个问题,Spring AI 提供了聊天记忆功能,使您能够存储和检索在与 LLM 的多次交互中的信息。
spring-ai网址【https://docs.spring.io/spring-ai/reference/api/chat-memory.html】
核心架构分为两层
- ChatMemory(记忆管理层)
如果您需要维护所有消息交换的完整记录,您应该考虑使用其他方法,例如依赖于Spring Data以高效地存储和检索完整的聊天历史记录
Spring AI自动配置一个ChatMemory bean,您可以在应用程序中直接使用。默认情况下,它使用内存中的仓库来存储消息
| 策略类型 | 实现类 | 描述 |
|---|---|---|
| 消息窗口 | MessageWindowChatMemory |
维护一个固定大小的消息窗口,当消息数超过设定值(默认为20)时,自动移除最旧的消息。 |
| 摘要记忆 | ConversationSummaryChatMemory |
对超过Token限制的历史对话进行摘要,将摘要作为后续对话的上下文,节省Token用量。 |
| 时间窗口 | 需自定义 | 根据时间戳,只保留最近一段时间内的消息作为上下文。 |
- ChatMemoryRepository(存储层)
存储层负责将消息存储在持久化存储中,例如数据库或文件系统。
Spring AI 提供了以下几种开箱即用的实现:
- InMemoryChatMemoryRepository:
- 默认实现,消息存储在内存中,适合开发或测试,重启即丢失。
- JdbcChatMemoryRepository:
- 用于关系型数据库持久化。官方支持 MySQL、PostgreSQL、SQL Server、HSQLDB 等

关键差异:ChatMemory 与 ChatHistory
在使用 Spring AI 的记忆功能时,理解这两个概念的区别至关重要:
- ChatMemory:
专为维护当前对话的上下文感知而设计,用于提升模型回答质量。
- ChatHistory:
指代完整的、原始的对话记录。官方文档明确指出,ChatMemory 不适合存储完整历史,如需保存所有记录,应考虑使用 Spring Data 等其他方案。
基于内存存储进行演示
源码示例
https://gitee.com/kcnf_open/spring-ai-sample/tree/master/spring-ai/spring-ai-sample08
-
yaml配置
In application.yml
spring:
ai:
zhipuai:
api-key: ${ZHIPUAI_API_KEY}
chat:
options:
model: glm-4v-flash
datasource:
url: jdbc:h2:file:./data/chat_memory
username: sa
password:
driver-class-name: org.h2.Driver
h2:
console:
enabled: true
path: /h2-console
sql:
init:
mode: always
schema-locations: classpath:schema.sql -
测试代码
- 测试结果

数据库查询
-
本地数据位置

-
可视化客户端查询
登录信息:
JDBC URL: jdbc:h2:file:./data/chat_memory
Username: sa
Password: (留空,不填)
-
查询结果
SELECT * FROM SPRING_AI_CHAT_MEMORY;
