Spring AI 2.0 开发Java Agent智能体 - 会话记忆(Chat Memory)

大家好,我是Java1234_小锋老师,最近更新《2027版本 Spring AI 2.0 开发Java Agent智能体 视频教程》专辑,感谢大家支持。

本课程主要介绍和讲解Spring AI 2.0简介,Spring AI 2.0 HelloWorld搭建,Advisors --- 拦截器模式增强AI能力,对话与提示词工程(Prompt),工具调用 (Function Calling / Tools) ,RAG(检索增强生成),MCP(模型 上下文协议)和多模态支持。

等这个Spring AI2.0基础课程录制完成,接下来要发布2个 企业级Java AI实战课程,RAG 企业知识库系统和AI智能客服系统。大家可以点点关注,后面更精彩。

视频教程+课件+源码打包下载:

链接:https://pan.baidu.com/s/1o-zRfndo1HHrS_uFroOiCw?pwd=1234

提取码:0000

Spring AI 2.0 开发Java Agent智能体 - 会话记忆(Chat Memory)

一、Chat Memory 核心概念

1.1 什么是 Chat Memory

大型语言模型 (LLMs) 本质是无状态 的,无法保留历史对话信息。Spring AI 2.0 提供的Chat Memory功能解决了这一问题,它能:

  • 存储历史对话:自动保存用户消息和 AI 响应到记忆仓库

  • 检索历史对话:新请求时自动提取相关历史消息注入当前 Prompt

  • 会话隔离 :通过conversationId区分不同用户 / 会话,确保上下文独立

  • 消息管理:提供灵活策略(如滑动窗口)控制保留哪些历史消息

1.2 核心组件架构
组件 作用 核心接口 / 类
ChatMemory 策略层,决定保留哪些消息 ChatMemory接口,默认实现MessageWindowChatMemory
ChatMemoryRepository 存储层,负责消息 CRUD ChatMemoryRepository接口,支持多种存储后端
ChatMemoryAdvisor 拦截器,自动处理记忆注入 MessageChatMemoryAdvisorVectorStoreChatMemoryAdvisor

二、内置 Chat Memory 类型与存储后端

2.1 内置记忆策略

Spring AI 2.0 提供两种主要记忆类型

  1. MessageWindowChatMemory(默认)

    • 核心机制:维护固定大小消息窗口,超出上限时淘汰最早消息永远保留 system 消息Spring

    • 默认窗口大小:20 条消息Spring

    • 适用场景:大多数简单多轮对话,平衡上下文完整性与 token 消耗

  2. VectorStoreChatMemory(语义记忆)

    • 核心机制:基于向量存储的语义检索,将对话内容向量化后存储,根据语义相似度召回相关历史

    • 适用场景:长对话、需要精准语义匹配的复杂场景

2.2 支持的存储后端
存储类型 实现类 特点 适用场景
内存存储 InMemoryChatMemoryRepository 基于ConcurrentHashMap,轻量快速 开发测试、演示环境
Redis RedisChatMemoryRepository 分布式、高性能、支持 TTL 生产环境、多实例部署
JDBC JdbcChatMemoryRepository 关系型数据库持久化 需要长期存储、事务支持
Cassandra CassandraChatMemoryRepository 分布式 NoSQL,高可用 大规模分布式系统

三、具体实例:构建有记忆的对话应用

我们先演示下没有以及的对话。

请求:http://localhost:8080/ai?question=我是小锋

我们再次请求:http://localhost:8080/ai?question=我是谁?

因为没有会话记忆,所以每次请求访问都是独立的。但是如果我们做聊天机器人,客服机器人,那肯定是不行的,我们需要让大模型记住历史会话上下文章。

我们来实现下吧。

首先在AiConfiguration里定义ChatMemory bean

复制代码
/**
     * 创建一个 ChatMemory 对象,用于存储聊天记录。
     *
     * @return ChatMemory 对象,用于存储聊天记录。
     */
    @Bean
    public ChatMemory chatMemory(){
        return MessageWindowChatMemory.builder()
                .maxMessages(10) // 设置消息窗口大小为 10
                .chatMemoryRepository(new InMemoryChatMemoryRepository()) // 内存存储
                .build();
    }

接着chatClient的advisors里加上chatMemory会话记忆

复制代码
/**
     * 创建一个 ChatClient 对象,用于处理聊天请求。
     *
     * @param model OpenAiChatModel 对象,用于处理聊天请求。
     * @return ChatClient 对象,用于处理聊天请求。
     */
    @Bean
    public ChatClient chatClient(OpenAiChatModel  model,ChatMemory chatMemory){
        return ChatClient
                .builder(model) // 创建 ChatClient 对象,并设置模型为 model
                // .defaultAdvisors(new MySimpleLoggerAdvisor()) // 添加一个 MySimpleLoggerAdvisor,记录请求日志
                .defaultAdvisors(
                        new SimpleLoggerAdvisor(), // 添加一个 SimpleLoggerAdvisor,记录请求日志
                        MessageChatMemoryAdvisor.builder(chatMemory).build() // 添加一个 MessageChatMemoryAdvisor,记录聊天记录
                )
                .build(); // 构建 ChatClient 对象
    }

然后MyAiChatController里加上一个会话ID设置,保证聊天上下文独立。

复制代码
@RequestMapping("/aiplus")
    public String aiplus(String question, String convId) {
        return chatClient.prompt() // 创建一个 Prompt 对象,用于构建聊天请求。
                .user( question) // 设置用户输入的文本。
                .advisors(a->a.param(ChatMemory.CONVERSATION_ID,convId)) // 设置会话 ID
                .call() // 调用 ChatClient 对象的 call() 方法,发送聊天请求给大模型并获取响应。
                .content(); // 获取响应的文本内容。
    }

我们再来测试下:

复制代码
http://localhost:8080/aiplus?question=我是锋哥&convId=001
http://localhost:8080/aiplus?question=我是谁&convId=001

已经带有记忆功能了。

相关推荐
Sylvia33.1 小时前
世界杯数据链路解析:从球场传感器到终端推送的毫秒级架构
java·前端·python·架构
数字护盾(和中)1 小时前
终端安全破局:银狐木马防御的 EDR 核心能力详解
网络·人工智能·安全
Royzst1 小时前
Lambda 算法基础 集合概述
java·开发语言
Promise微笑1 小时前
AI搜索时代的流量重构:Geo优化精细化运营标准与实战路径
大数据·人工智能·重构
SmallBambooCode1 小时前
【人工智能】【Python】离线环境下huggingface预训练权重导入流程
开发语言·人工智能·python
qiyongwork1 小时前
智能项目管理信息系统的未来图景:AI赋能下的全链路革新与生态重构
大数据·人工智能·重构
wanhengidc1 小时前
云手机的兼容性与稳定性
大数据·运维·服务器·网络·人工智能·智能手机
昇腾CANN1 小时前
5月12日直播丨Ascend 950 HiF8模型量化技术的训推实践
人工智能·昇腾·cann
winlife_1 小时前
AI 怎么验证 Unity PlayMode 行为:截图 + 输入模拟的完整闭环
人工智能·unity·游戏引擎·ai编程·claude·playmode