SpringAI 框架介绍 - 上下文记忆

张开发
2026/4/15 12:17:56 15 分钟阅读

分享文章

SpringAI 框架介绍 - 上下文记忆
目录Spring AI 框架介绍Spring AI 框架介绍 - AdvisorSpring AI 框架介绍 - 上下文记忆Spring AI 对话模型Spring AI 图像模型LLM 工具与 RAG 原理AI Code Review 工具大语言模型是无状态的这意味着它并不保留之前交互过程中的信息。换句话说大语言模型是没有记忆的。你在实际使用比如 APP、浏览器或者命令行中跟大语言模型对话时发现其有记忆这是外部系统在帮它“伪造记忆”。每次对话时系统都会将之前的历史对话重新拼进 prompt 中。对话记忆SpringAI 也提供对话记忆功能。在 SpringAI 中ChatMemory接口允许你实现多种不同类型的记忆以便适应不同的使用场景通过ChatMemoryRepository来存储和获取消息。消息的存储数量由ChatMemory决定比如说按时间存储最近 7 天、按数量存储最近 10000 条或者按 token 数存储。需要注意的是对话记录和对话历史是两个不同的概念对话记忆是指大语言模型为了理解上下文而保持的信息对话历史是整个对话过程中的所有消息。记忆存储SpringAI 通过ChatMemoryRepository接口来存储对话记忆其实现有多种。In-Memory RepositoryInMemoryChatMemoryRepository以ConcurrentHashMap这种数据结构将消息存储在内存中。默认情况下 Spring AI 中自动装配的ChatMemoryRepository即是InMemoryChatMemoryRepository可以直接使用AutowiredChatMemoryRepositorychatMemoryRepository;JdbcChatMemoryRepositoryJdbcChatMemoryRepository通过 JDBC 将消息存储在关系型数据库中查询时返回结果按照时间戳升序排列从旧到新。要想使用这个 repository需要引入依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-chat-memory-repository-jdbc/artifactId/dependency然后使用AutowiredJdbcChatMemoryRepositorychatMemoryRepository;ChatMemorychatMemoryMessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();当然你也可以手动创建ChatMemoryRepositorychatMemoryRepositoryJdbcChatMemoryRepository.builder().jdbcTemplate(jdbcTemplate).dialect(newPostgresChatMemoryRepositoryDialect()).build();ChatMemorychatMemoryMessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();SpringAI 支持多种关系型数据库如PostgreSQL、MySql/MariaDB、Sql Server、HSQLDB、Oracle Database并且能够根据 JDBC URL 自动检测数据库方言。配置项参数描述默认值spring.ai.chat.memory.repository.jdbc.initialize-schema控制什么时候初始化 schema取值embeded /always /neverembededspring.ai.chat.memory.repository.jdbc.schema需要初始化的 schema 脚本的位置classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-platform.sqlspring.ai.chat.memory.repository.jdbc.platform如果使用了平台替换符 platform用这个参数来替换自动检测Schema 初始化Spring AI 自动装配会在启动的时候通过一个特定于数据库供应商的 SQL 脚本来自动创建SPRING_AI_CHAT_MEMORY表。默认情况下模式初始化只针对内嵌的数据H2、HSQL、Derby 等生效。你也可以通过spring.ai.chat.memory.repository.jdbc.initialize-schema参数来控制模式初始化spring.ai.chat.memory.repository.jdbc.initialize-schemaembedded# Only for embedded DBs (default)spring.ai.chat.memory.repository.jdbc.initialize-schemaalways# Always initializespring.ai.chat.memory.repository.jdbc.initialize-schemanever# Never initialize (useful with Flyway/Liquibase)复写初始化脚本spring.ai.chat.memory.repository.jdbc.schemaclasspath:/custom/path/schema-mysql.sqlCassandraChatMemoryRepositoryCassandraChatMemoryRepository使用 Apache Cassandra 来存储消息适用于需要持久化存储的对话记忆。CassandraChatMemoryRepository有一个时间序列 schema保留所有过去的对话窗口的记录。先引入依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-chat-memory-repository-cassandra/artifactId/dependency然后使用AutowiredCassandraChatMemoryRepositorychatMemoryRepository;ChatMemorychatMemoryMessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();同样的你也可以手动创建ChatMemoryRepositorychatMemoryRepositoryCassandraChatMemoryRepository.create(CassandraChatMemoryRepositoryConfig.builder().withCqlSession(cqlSession));ChatMemorychatMemoryMessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(10).build();配置项属性描述默认值spring.cassandra.contactPointscassandra 集群的初始连接节点127.0.0.1spring.cassandra.portcassandra 连接端口9042spring.cassandra.localDatacentercassandra 数据中心datacenter1spring.ai.chat.memory.cassandra.time-to-livecassandra 中信息的有效期spring.ai.chat.memory.cassandra.keyspacekeyspacespringframeworkspring.ai.chat.memory.cassandra.messages-columncassandra column 名称springframeworkspring.ai.chat.memory.cassandra.tablecassandra table 名称ai_chat_memoryspring.ai.chat.memory.cassandra.initialize-schema是否在启动时初始化 schematrueSchema 初始化SpringAI 的自动装配会在系统启动的时候自动创建ai_chat_memory表用于存储对话记忆信息。如果不想让系统自动创建可以将spring.ai.chat.memory.cassandra.initialize-schema设置为 false。其他SpringAI 还支持Neo4jChatMemoryRepository来将对话消息存储到图数据库 Neo4jCosmosDBChatMemoryRepository将消息存储到非关系型数据库 Azure Cosmos DB以及MongoChatMemoryRepository将消息存储到 MongoDB。这里不详细介绍可以参考官方网站。ChatMemory API在使用 ChatClientAPI 时可以提供一个ChatMemory实现来维护对话上下文并且通过 Advisors 来配置记忆的行为。配置 Memory 行为的几个 advisors 在前文简单介绍过主要是MessageChatMemoryAdvisor获取对话记忆并以消息集合的方式添加到 prompt 中。需要注意的是不是所有的 AI 模型都支持。PromptChatMemoryAdvisor获取记忆并将其合并到系统 prompt 文本中。VectorStoreChatMemoryAdvisor从向量存储中获取记忆并将其添加到系统 prompt 文本中。使用示例ChatMemorychatMemoryMessageWindowChatMemory.builder().build();ChatClientchatClientChatClient.builder(chatModel).defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()).build();StringconversationId007;chatClient.prompt().user(Do I have license to code?).advisors(a-a.param(ChatMemory.CONVERSATION_ID,conversationId)).call().content();在这个例子中在与大模型交互时通过MessageChatMemoryAdvisor将对话记忆加入到 prompt 中。由于MessageWindowChatMemory默认的窗口大小为 20 因此每次交互时上文下只有 20 条消息。

更多文章