当前位置: 首页 > ai >正文

Spring AI 之对话记忆(Chat Memory)

大型语言模型(LLMs)是无状态的,这意味着它们不会保留关于之前交互的信息。当想在多次交互中保持上下文或状态时,这可能会成为一个限制。为了解决这一问题,Spring AI 提供了对话记忆功能,允许你在与大型语言模型的多次交互中存储和检索信息。

“对话记忆”(ChatMemory)抽象类让你能够实现多种类型的记忆,以支持不同的使用场景。消息的底层存储由“对话记忆存储库”(ChatMemoryRepository)处理,其唯一职责就是存储和检索消息。具体保留哪些消息以及何时删除这些消息,则由“对话记忆”(ChatMemory)的具体实现来决定。策略示例可能包括保留最近的 N 条消息、保留一段时间内的消息,或者保留不超过一定令牌(token)数量限制的消息。

在选择记忆类型之前,了解对话记忆与对话历史记录之间的区别至关重要。

  • 对话记忆(Chat Memory):大型语言模型在对话过程中保留并用于维持上下文感知能力的信息。
  • 对话历史记录(Chat History):整个对话过程的全部记录,包括用户与模型之间交换的所有消息。

“对话记忆”(ChatMemory)抽象类旨在管理对话记忆。它允许你存储和检索与当前对话上下文相关的消息。然而,它并不适合用于存储对话历史记录。如果你需要保留所有交换消息的完整记录,应考虑采用其他方法,例如借助 Spring Data 来高效存储和检索完整的对话历史记录。

快速入门

Spring AI 会自动配置一个 ChatMemory bean,可以直接在应用程序中使用它。默认情况下,它使用一个内存存储库来存储消息(InMemoryChatMemoryRepository)以及一个 MessageWindowChatMemory 实现来管理对话历史记录。如果已经配置了不同的存储库(例如 Cassandra、JDBC 或 Neo4j),Spring AI 将会改用该存储库。

@Autowired
ChatMemory chatMemory;

接下来的将进一步介绍 Spring AI 中可用的不同记忆类型和存储库。

记忆类型

“对话记忆”(ChatMemory)抽象类允许实现各种类型的记忆,以适应不同的使用场景。记忆类型的选择会显著影响应用程序的性能和行为。本节将介绍 Spring AI 提供的内置记忆类型及其特性。

消息窗口对话记忆(Message Window Chat Memory)

MessageWindowChatMemory 会维护一个消息窗口,其中包含的消息数量不超过指定的最大值。当消息数量超过该最大值时,较旧的消息会被移除,但系统消息会得以保留。默认的窗口大小为 20 条消息。

MessageWindowChatMemory memory = MessageWindowChatMemory.builder().maxMessages(10).build();

这是 Spring AI 用于自动配置 ChatMemory bean 的默认消息类型。

记忆存储

Spring AI 提供了 ChatMemoryRepository 抽象类用于存储对话记忆。本节将介绍 Spring AI 提供的内置存储库及其使用方法,不过,如果有需要,也可以自行实现存储库。

内存存储库

InMemoryChatMemoryRepository 使用 ConcurrentHashMap 在内存中存储消息。

默认情况下,如果尚未配置其他存储库,Spring AI 会自动配置一个类型为 InMemoryChatMemoryRepository 的 ChatMemoryRepository bean,你可以直接在应用程序中使用它。

@Autowired
ChatMemoryRepository chatMemoryRepository;

也可以手动创建 InMemoryChatMemoryRepository,按照以下方式操作:

ChatMemoryRepository repository = new InMemoryChatMemoryRepository();

JdbcChatMemoryRepository

JdbcChatMemoryRepository 是一个内置实现,它使用 JDBC 将消息存储在关系型数据库中。它开箱即用地支持多种数据库,非常适合需要持久化存储对话记忆的应用程序。

首先,将以下依赖项添加到项目中:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId>
</dependency>

Spring AI 为 JdbcChatMemoryRepository 提供了自动配置功能,可以直接在应用程序中使用它。

@Autowired
JdbcChatMemoryRepository chatMemoryRepository;ChatMemory chatMemory = MessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();

如果更倾向于手动创建 JdbcChatMemoryRepository,可以通过提供一个 JdbcTemplate 实例和一个 JdbcChatMemoryRepositoryDialect 来实现:

ChatMemoryRepository chatMemoryRepository = JdbcChatMemoryRepository.builder().jdbcTemplate(jdbcTemplate).dialect(new PostgresChatMemoryDialect()).build();ChatMemory chatMemory = MessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();
支持的数据库与方言抽象

Spring AI 通过方言抽象支持多种关系型数据库。以下数据库是开箱即用地支持的:

  • PostgreSQL
  • MySQL / MariaDB
  • SQL Server
  • HSQLDB

当使用 JdbcChatMemoryRepositoryDialect.from(DataSource) 时,可以从 JDBC URL 中自动检测出正确的方言。可以通过实现 JdbcChatMemoryRepositoryDialect 接口来扩展对其他数据库的支持。

配置属性以下是翻译结果,使用表格呈现:
属性描述默认值
spring.ai.chat.memory.repository.jdbc.initialize-schema控制何时初始化数据库模式。可选值:embedded(默认)、always、never。embedded
spring.ai.chat.memory.repository.jdbc.schema用于初始化的模式脚本位置。支持 classpath: URL 和平台占位符。classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-@@platform@@.sql
spring.ai.chat.memory.repository.jdbc.platform如果使用了 @@platform@@ 占位符,则在初始化脚本中使用的平台。自动检测
Schema 初始化

自动配置会在启动时,使用针对你数据库的供应商特定的 SQL 脚本,自动创建 SPRING_AI_CHAT_MEMORY 表。默认情况下,模式初始化仅针对嵌入式数据库(如 H2、HSQL、Derby 等)运行。

可以使用 spring.ai.chat.memory.repository.jdbc.initialize-schema 属性来控制模式初始化:

spring.ai.chat.memory.repository.jdbc.initialize-schema=embedded # 仅针对嵌入式数据库进行初始化(默认设置)spring.ai.chat.memory.repository.jdbc.initialize-schema=always # 总是进行初始化spring.ai.chat.memory.repository.jdbc.initialize-schema=never # 从不进行初始化(在与 Flyway/Liquibase 等数据库迁移工具一起使用时很有用)

若要覆盖模式脚本的位置,可以使用以下方式:

spring.ai.chat.memory.repository.jdbc.schema=classpath:/custom/path/schema-mysql.sql
扩展方言

若要为新数据库添加支持,需要实现 JdbcChatMemoryRepositoryDialect 接口,并提供用于选择、插入和删除消息的 SQL 语句。然后,你可以将自己的自定义方言传递给存储库构建器。

ChatMemoryRepository chatMemoryRepository = JdbcChatMemoryRepository.builder().jdbcTemplate(jdbcTemplate).dialect(new MyCustomDbDialect()).build();

CassandraChatMemoryRepository

CassandraChatMemoryRepository 使用 Apache Cassandra 来存储消息。它适用于需要持久化存储聊天记忆的应用程序,尤其是在需要高可用性、持久性、可扩展性以及利用生存时间(TTL,Time-To-Live)特性时。

CassandraChatMemoryRepository 采用时间序列模式,会记录所有过去的聊天窗口,这对于治理和审计非常有价值。建议将生存时间(TTL)设置为某个值,例如三年。

若要使用 CassandraChatMemoryRepository,首先需要在项目中添加相关依赖:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-chat-memory-repository-cassandra</artifactId>
</dependency>

Spring AI 为 CassandraChatMemoryRepository 提供了自动配置功能,可以直接在应用程序中使用它。

@Autowired
CassandraChatMemoryRepository chatMemoryRepository;ChatMemory chatMemory = MessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();

如果更倾向于手动创建 CassandraChatMemoryRepository,可以通过提供一个 CassandraChatMemoryRepositoryConfig 实例来实现:

ChatMemoryRepository chatMemoryRepository = CassandraChatMemoryRepository.create(CassandraChatMemoryConfig.builder().withCqlSession(cqlSession));ChatMemory chatMemory = MessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();
配置属性
http://www.xdnf.cn/news/9698.html

相关文章:

  • [网页五子棋][匹配模块]处理开始匹配/停止匹配请求(匹配算法,匹配器的实现)
  • python h5py 读取mat文件的<HDF5 object reference> 问题
  • StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
  • 【大模型】Bert变种
  • Kubernetes资源申请沾满但是实际的资源占用并不多,是怎么回事?
  • 微深节能 码头装卸船机定位与控制系统 格雷母线
  • WPF 按钮悬停动画效果实现
  • 【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN
  • 《AI大模型的开源与性能优化:DeepSeek R1的启示》
  • 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
  • 深入理解C#中的LINQ:数据查询的终极利器
  • 2013-2021年各省电子商务数据
  • 认识多系统萎缩:一种隐匿进展的神经退行性问题
  • spring IOC控制反转
  • 【春秋云镜】CVE-2022-26965 靶场writeup
  • 第一章 项目总览
  • 线性代数入门:轻松理解二阶与三阶行列式的定义与理解
  • Java消息队列与安全实战:谢飞机的烧饼摊故事
  • AI编程报错 API流式传输失败解决方案
  • 如何做好一个决策:基于 Excel的决策树+敏感性分析应用
  • 在ROS2(humble)+Gazebo+rqt下,实时显示仿真无人机的相机图像
  • WPF的UI交互基石:数据绑定基础
  • UDP编程
  • 设计模式之原型模式
  • [9-1] USART串口协议 江协科技学习笔记(13个知识点)
  • pycharm debug的时候无法debug到指定的位置就停住不动了
  • Spring Boot 3.0与Java 17:企业级应用开发的新范式
  • github.com/lib/pq 数据库链接完整示例方式
  • word文档格式规范(论文格式规范、word格式、论文格式、文章格式、格式prompt)
  • 【PhysUnits】15 完善的类型整数基本结构体(basic.rs)