此版本仍在开发中,尚未被视为稳定版本。最新的快照版本请使用 Spring AI 1.0.0-SNAPSHOT! |
聊天记忆
大型语言模型 (LLM) 是无状态的,这意味着它们不会保留有关以前交互的信息。当您希望在多个交互中维护上下文或状态时,这可能是一个限制。为了解决这个问题,Spring AI 提供了一个ChatMemory
抽象,允许您在与 LLM 的多次交互中存储和检索信息。
快速开始
Spring AI 会自动配置ChatMemory
可以直接在应用程序中使用的 bean。默认情况下,它使用内存中存储库来存储消息 (InMemoryChatMemoryRepository
) 和MessageWindowChatMemory
implementation 来管理对话历史记录。如果已经配置了不同的存储库(例如,Cassandra、JDBC 或 Neo4j),Spring AI 将改用该存储库。
@Autowired
ChatMemory chatMemory;
以下部分将进一步描述 Spring AI 中可用的不同内存类型和存储库。
内存存储
Spring AI 提供了ChatMemoryRepository
用于存储聊天内存的抽象。本节描述了 Spring AI 提供的内置存储库及其使用方法,但如果需要,您也可以实现自己的存储库。
内存存储库
InMemoryChatMemoryRepository
使用ConcurrentHashMap
.
默认情况下,如果尚未配置其他存储库,则 Spring AI 会自动配置ChatMemoryRepository
类型的 beanInMemoryChatMemoryRepository
可以直接在应用程序中使用。
@Autowired
ChatMemoryRepository chatMemoryRepository;
如果您更愿意创建InMemoryChatMemoryRepository
手动,您可以按如下方式执行此作:
ChatMemoryRepository repository = new InMemoryChatMemoryRepository();
JDBC 存储库
JdbcChatMemoryRepository
是使用 JDBC 在关系数据库中存储消息的内置实现。它适用于需要持久存储聊天内存的应用程序。
首先,将以下依赖项添加到您的项目中:
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-chat-memory-jdbc</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-chat-memory-jdbc'
}
Spring AI 为JdbcChatMemoryRepository
,您可以直接在应用程序中使用。
@Autowired
JdbcChatMemoryRepository chatMemoryRepository;
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(10)
.build();
如果您更愿意创建JdbcChatMemoryRepository
手动执行此作,您可以通过提供JdbcTemplate
实例:
ChatMemoryRepository chatMemoryRepository = JdbcChatMemoryRepository.builder()
.jdbcTemplate(jdbcTemplate)
.build();
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(10)
.build();
Schema 初始化
自动配置将自动创建ai_chat_memory
表目前仅支持 PostgreSQL 和 MariaDB。
您可以通过设置属性spring.ai.chat.memory.repository.jdbc.initialize-schema
自false
.
如果您的项目使用 Flyway 或 Liquibase 等工具来管理数据库架构,则可以禁用架构初始化,并参考这些 SQL 脚本来配置这些工具以创建ai_chat_memory
桌子。
聊天客户端中的内存
使用 ChatClient API 时,您可以提供ChatMemory
实现以在多个交互中维护对话上下文。
Spring AI 提供了一些内置的 Advisor,你可以使用它们来配置ChatClient
,具体取决于您的需求。
目前,在执行工具调用时与大型语言模型交换的中间消息不存储在内存中。这是当前实施的限制,将在将来的版本中得到解决。如果需要存储这些消息,请参阅 User Controlled Tool Execution 的说明。 |
-
MessageChatMemoryAdvisor
.此顾问使用提供的ChatMemory
实现。在每次交互时,它都会从内存中检索对话历史记录,并将其作为消息集合包含在提示中。 -
PromptChatMemoryAdvisor
.此顾问使用提供的ChatMemory
实现。在每次交互时,它都会从内存中检索对话历史记录,并将其作为纯文本附加到系统提示符中。 -
VectorStoreChatMemoryAdvisor
.此顾问使用提供的VectorStore
实现。在每次交互时,它都会从向量存储中检索对话历史记录,并将其作为纯文本附加到系统消息中。
例如,如果要使用MessageWindowChatMemory
使用MessageChatMemoryAdvisor
,您可以按如下方式对其进行配置:
ChatMemory chatMemory = MessageChatMemoryAdvisor.builder().build();
ChatClient chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
.build();
当调用ChatClient
,内存将由MessageChatMemoryAdvisor
.将根据指定的对话 ID 从内存中检索对话历史记录:
String conversationId = "007";
chatClient.prompt()
.user("Do I have license to code?")
.advisors(a -> a.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, conversationId))
.call()
.content();
聊天模型中的内存
如果您直接使用ChatModel
而不是ChatClient
中,您可以显式管理内存:
// Create a memory instance
ChatMemory chatMemory = MessageWindowChatMemory.builder().build();
String conversationId = "007";
// First interaction
UserMessage userMessage1 = new UserMessage("My name is James Bond");
chatMemory.add(conversationId, userMessage1);
ChatResponse response1 = chatModel.call(new Prompt(chatMemory.get(conversationId)));
chatMemory.add(conversationId, response1.getResult().getOutput());
// Second interaction
UserMessage userMessage2 = new UserMessage("What is my name?");
chatMemory.add(conversationId, userMessage2);
ChatResponse response2 = chatModel.call(new Prompt(chatMemory.get(conversationId)));
chatMemory.add(conversationId, response2.getResult().getOutput());
// The response will contain "James Bond"