Chat Memory
概述
大型语言模型 (LLMs) 是无状态的,这意味着它们不保留有关先前交互的信息。当您想要在多个交互中维护上下文或状态时,这可能是一个限制。为了解决这个问题,Spring AI 提供了 Chat Memory 功能,允许您存储和检索与 LLM 的多个交互中的信息。
ChatMemory 接口可以使用使用不同的存储介质实现 Chat Memory。Message 的底层存储由 ChatMemoryRepository 处理,其唯一职责是存储和检索 message。由 ChatMemory 实现决定保留哪些 message 以及何时删除它们。策略示例可能包括保留最后 N 条 message、保留特定时间段的 message 或保留达到特定令牌限制的 message。
在实现 Chat Memory 实现之前,了解 Chat Memory 和 Chat Hisroty 之间的区别很重要:
- Chat Memory:大型语言模型保留并用于在整个对话中保持上下文感知的信息。
- Chat History:整个对话历史,包括用户和模型之间交换的所有 message。
ChatMemory 抽象旨在管理聊天内存。它允许您存储和检索与当前对话上下文相关的 message。但是,它不适合存储聊天历史。如果您需要维护所有交换 message 的完整记录,您应该考虑使用不同的方法,例如依赖 Spring Data 来高效存储和检索完整的聊天历史。
快速开始
Spring AI 自动配置一个 ChatMemory bean,您可以直接在应用程序中使用它。默认情况下,它使用内存来存储 message(InMemoryChatMemoryRepository)和 MessageWindowChatMemory 实现来管理对话历史。如果已经配置了不同的持久层组建(例如 Cassandra、JDBC 或 Neo4j),Spring AI 将使用其存储。
@Autowired
ChatMemory chatMemory;
以下部分将详细描述 Spring AI 中可用的不同 Memory 存储策略和持久层。
Chat Memory Type
ChatMemory 抽象允许您实现各种类型的 Memory type 以适应不同的用例。Memory type 的选择会显著影响应用程序的性能和行为。本节描述了 Spring AI 提供的内置内存类型及其特性。
Message Window
MessageWindowChatMemory 维护一个最大指定大小的 message 窗口。当 message 数量超过最大值时,会删除较旧的 message,同时保留系统 message。默认窗口大小为 20 条 message。
MessageWindowChatMemory memory = MessageWindowChatMemory.builder()
.maxMessages(10)
.build();
这是 Spring AI 用于自动配置 ChatMemory bean 的默认 message 类型。
内存存储
Spring AI 提供 ChatMemoryRepository 抽象用于存储聊天内存。本节描述了 Spring AI 提供的内置存储组件以及如何使用它们,但您也可以根据需要 实现自己的存储组件。
内存实现
InMemoryChatMemoryRepository 使用 ConcurrentHashMap 在内存中存储 message。
默认情况下,如果没有配置其他存储组件,Spring AI 会自动配置一个类型为 InMemoryChatMemoryRepository 的 ChatMemoryRepository bean,您可以直接在应用程序中使用它。
@Autowired
ChatMemoryRepository chatMemoryRepository;
如果您想手动创建 InMemoryChatMemoryRepository,可以这样做:
ChatMemoryRepository repository = new InMemoryChatMemoryRepository();
JdbcChatMemoryRepository
JdbcChatMemoryRepository 是一个内置实现,使用 JDBC 在关系数据库中存储 message。它开箱即用地支持多个数据库,适合需要持久存储 Chat Memory 的应用。
依赖配置
Maven:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId>
</dependency>
Gradle:
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-chat-memory-repository-jdbc'
}