Spring AI聊天记忆实战:如何用InMemoryChatMemory快速搭建多轮对话Demo

Java AI应用开发实战:Spring AI Alibaba与Langchain4j集成指南 如果你是一名Java开发者,最近一定被AI大模型的各种新闻和概念轰炸过。你可能尝试过Python的LangChain,觉得功能强大但生态陌生;或者看过一些Demo,感觉离企业级Java应用很远。一个现实的问题是: 在成熟的Java技术栈里,如何高效、稳定地集成AI能力,而不是为了用AI而重构整个技术体系? 这正是Spring AI、Spring AI Alibaba和Langchain4j要解决的核心痛点。它们不是简单的API封装,而是试图将大模型的“智能”以Spring开发者熟悉的方式——依赖注入、自动配 阅读详情

Spring AI聊天记忆实战:构建具备上下文感知能力的智能对话系统

在当今AI驱动的应用开发中,让对话系统具备"记忆"能力已成为提升用户体验的关键。本文将深入探讨如何利用Spring AI框架中的InMemoryChatMemory快速构建具备多轮对话能力的应用原型,并分析不同存储方案的适用场景。

1. 对话记忆的核心价值与技术挑战

对话记忆功能使AI应用能够:

  • 保持上下文连贯性:理解用户前序对话内容
  • 实现个性化交互:记忆用户偏好和历史行为
  • 处理复杂查询:基于多轮信息进行综合推理

典型应用场景:

  • 客服机器人(处理多步骤问题)
  • 教育辅导(跟踪学习进度)
  • 智能助手(记忆用户习惯)

技术实现面临三大挑战:

  1. 存储效率:平衡历史信息保留与资源消耗
  2. 隐私安全:敏感信息的存储与清理机制
  3. 性能优化:快速检索相关上下文
// 基础对话记忆接口定义
public interface ChatMemory {
    void add(String conversationId, List<Message> messages);
    List<Message> get(String conversationId, int lastN); 
    void clear(String conversationId);
}

2. InMemoryChatMemory快速入门

内存存储方案最适合原型开发和本地测试,具有以下特点:

优势对比表:

特性内存存储持久化存储
访问速度极快(纳秒级)中等(毫秒级)
数据持久性应用重启后丢失长期保留
适用场景开发测试生产环境
扩展性单机有效支持分布式

基础实现代码:

// 初始化内存存储
ChatMemory chatMemory = new InMemoryChatMemory();

// 添加对话消息
chatMemory.add("conv_123", Arrays.asList(
    new UserMessage("我想订去北京的机票"),
    new AssistantMessage("请问您想订哪天的机票?")
));

// 检索最近3条消息
List<Message> history = chatMemory.get("conv_123", 3);

注意:内存存储不适合生产环境,仅建议用于开发和测试阶段

3. 高级集成:Advisor模式实战

Spring AI通过Advisor机制将记忆功能无缝集成到对话流程中:

核心组件交互流程:

  1. 用户发起对话请求
  2. Advisor从ChatMemory检索历史
  3. 历史消息注入当前Prompt
  4. 模型生成响应
  5. 新消息存入ChatMemory
// 配置带记忆功能的ChatClient
@Bean
public ChatClient historyAwareClient(ChatModel chatModel) {
    ChatMemory memory = new InMemoryChatMemory();
    
    return ChatClient.builder(chatModel)
        .defaultAdvisors(
            new MessageChatMemoryAdvisor(memory)
        )
        .defaultSystem("你是一个专业的旅行顾问")
        .build();
}

// 使用示例
String response = historyAwareClient.prompt()
    .user("我上次问的航班还有票吗?")
    .advisors(a -> a
        .param("chat_memory_conversation_id", "user_123")
        .param("chat_memory_retrieve_size", 5))
    .call()
    .content();

Advisor类型对比:

类型数据格式适用场景
MessageChatMemoryAdvisor完整消息对象现代对话模型(推荐)
PromptChatMemoryAdvisor纯文本拼接简单对话场景
VectorStoreMemoryAdvisor向量化存储复杂语义检索

4. 生产级解决方案:持久化存储

对于需要长期保留对话记录的场景,Spring AI提供了多种持久化方案:

JDBC存储配置示例:

# application.yml
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/chat_db
    username: postgres
    password: secret
  ai:
    chat:
      memory:
        repository:
          jdbc:
            initialize-schema: always
// 配置JDBC存储的ChatMemory
@Bean
public ChatMemory jdbcChatMemory(DataSource dataSource) {
    return MessageWindowChatMemory.builder()
        .chatMemoryRepository(new JdbcChatMemoryRepository(dataSource))
        .maxMessages(100)
        .build();
}

存储方案选型指南:

  1. 关系型数据库(MySQL/PostgreSQL):

    • 优点:ACID特性,成熟稳定
    • 缺点:扩展性有限
  2. Redis:

    • 优点:高性能,支持TTL
    • 配置示例:
      @Bean
      public ChatMemory redisChatMemory(RedisTemplate<String, Object> redisTemplate) {
          return new RedisChatMemory(redisTemplate, Duration.ofDays(7));
      }
      
  3. MongoDB:

    • 优点:灵活Schema,适合非结构化数据
    • 适用场景:需要存储复杂对话元数据

5. 性能优化与最佳实践

记忆窗口管理策略:

// 混合策略配置示例
@Bean 
public ChatMemory optimizedMemory(ChatMemoryRepository repository) {
    return MessageWindowChatMemory.builder()
        .chatMemoryRepository(repository)
        .maxMessages(20)  // 固定消息数窗口
        .maxTokens(2000)  // 附加Token限制
        .build();
}

关键优化技巧:

  1. 动态上下文加载:

    // 根据对话阶段调整历史长度
    int historySize = isComplexQuestion(input) ? 10 : 3;
    List<Message> context = memory.get(convId, historySize);
    
  2. 消息压缩:

    // 对历史消息生成摘要
    String summary = summarizer.summarize(fullHistory);
    prompt.add(new SystemMessage("对话摘要:" + summary));
    
  3. 缓存策略:

    @Cacheable(value = "conversations", key = "#conversationId")
    public List<Message> getConversation(String conversationId) {
        return repository.findByConversationId(conversationId);
    }
    

监控指标建议:

  • 平均对话轮次
  • 记忆检索延迟
  • 存储空间使用率
  • 缓存命中率

在实际项目中,我们曾通过引入二级缓存(Caffeine + Redis)将高频对话的记忆检索性能提升了8倍,同时通过定时任务自动清理过期对话,将存储成本降低了60%。

Spring AI Alibaba:Java开发者集成大语言模型的统一框架实践 大语言模型(LLM)作为人工智能领域的核心技术,通过深度学习架构实现了对自然语言的深度理解与生成能力。其原理基于Transformer架构的海量参数训练,能够捕捉复杂的语言模式和语义关联。在技术价值层面,LLM为各类应用提供了强大的语义理解和内容生成能力,显著提升了人机交互的智能化水平。在应用场景上,LLM已广泛应用于智能客服、代码生成、内容创作和数据分析等领域。本文聚焦于Spring AI Alibaba框架,该框架通过提供统一的编程模型,解决了Java生态中集成不同厂商LLM API的标准化问题,并深度 阅读详情

相关推荐

SpringAI打造自己的AI应用

实现模型调用,当我们询问当前时间获取今天日期时,模型会调用我们提供的工具方法实现获取当前时间并返回结果,这个过程是调用完我们的工具方法得到结果后ai进行组织回答的结果,如果我们想直接得到原始结果则需要在@Tool注解中配置直接返回即可returnDirect=true,如:@Tool(description = "获取当前日期和时间", returnDirect = true)。实现RAG增强问答,这里使用RetrievalAugmentationAdvisor类来实现,当然网上也有基于提示词来实现的。

wjianwei666的专栏 645

Spring AI 对话记忆

对话记忆功能是一种技术,使得应用程序或智能助手能够在一段时间内“记住”用户提供的信息,以便在后续对话中参考和使用。这种记忆可以让对话更加连贯,并使助手能够理解用户的背景和偏好,从而提供更加个性化和精准的回复。ChatMemory作为一个内存管理容器,存储和管理多轮对话中的ChatMessage。

王小工小工历程 4554

【项目实战】SpringAI的InMemoryChatMemory 多轮对话为啥不生效??

ChatClient和。这些组件看起来是为了创建一个具有记忆功能的聊天机器人,以便在多轮对话中维持上下文。

奶爸的编程之路,也就一周冷个三天 706

Spring AI源码解读(三):ChatMemory

通俗易懂从源码讲解ChatMemory的实现过程!一文讲解明白!

qq_42068614的博客 938

Spring AI 实战(3):Alibaba 三行配置搞定 MySQL+Redis 记忆存储

本文介绍了解决Spring AI聊天机器人内存问题的两种零代码方案:MySQL和Redis存储。针对内存存储的三大缺陷(重启丢失、内存堆积、多实例不同步),Alibaba团队提供了开箱即用的解决方案: MySQL方案: 引入jdbc-starter依赖 配置数据库连接 自动建表+索引 支持多种数据库 Redis方案: 引入redis-starter依赖 支持单机/集群模式 可选多种客户端 无需建表 两种方案都只需配置+少量代码(约30行),比手写方案节省170+行代码,且自动处理序列化、清理等细节。通过co

不才不才不不才的博客 289

Spring AI 实战:通过 ChatMemory 构建有记忆的智能对话应用

随着大语言模型(LLM)的火热,聊天机器人、智能客服等对话式 AI 应用已经走进了我们的日常生活。但你可能不知道,大多数大模型本身是“健忘”的——它们每次接收请求都是独立的,并不会记住你和它之前聊了什么。为了让 AI 能够像人一样拥有“记忆”,我们需要在应用层面帮它存储和回顾历史对话。Spring AI 作为 Spring 生态中专为 AI 应用开发的利器,提供了一个叫做 ChatMemory 的组件,可以帮我们轻松管理对话历史。今天,我们就来手把手地学习如何使用它,打造一个真正有记忆的智能对话应用。

SmartSi 1339

Spring AI(5) :对话机器人-会话记忆

本文介绍了如何为AI聊天系统实现会话记忆功能及解决跨域问题。主要内容包括:1)通过将历史聊天内容与新提示词一起发送给大模型来实现记忆功能;2)配置Spring的跨域支持,允许前端访问后端接口;3)使用Spring AI提供的InMemoryChatMemory存储会话,并通过ChatMemoryAdvisor增强记忆功能;4)利用chatId区分不同会话;5)解决了开发中遇到的跨域问题。文中还提供了相关代码片段和测试效果截图,展示了不同会话间的记忆隔离效果。完整代码已分享至Gitee仓库。

不积跬步,无以至千里 465

操作系统知识点汇总(王道)

操作系统不论是就业还是升学都是核心的一门课程,对于大部分工科更是必修课程。本文章是对《王道操作系统》所有知识点的总结笔记,以供大家学习以及在备考期间复习使用。让我们一起把知识往脑子里旋好吗!!!......

S mile0804的博客 5万+

Spring AI与Ollama本地模型实战:从零构建AI代理助手

AI代理(AI Agent)作为大语言模型(LLM)应用的核心范式,通过工具调用(Tool Calling)和任务规划(Planning)能力,实现了从被动问答到主动执行任务的跨越。其技术价值在于将通用AI能力与具体业务逻辑解耦,使模型能够感知环境、使用外部工具并完成复杂目标。在应用场景上,AI代理广泛用于智能客服、自动化工作流、数据分析助手等领域。本文聚焦于利用Spring AI框架集成Ollama本地大模型,通过实战演示如何构建一个具备工具调用能力的AI代理助手,涵盖环境搭建、依赖配置、代理逻辑设计等关

weixin_34054931的博客 535

【参数不确定】敏感性分析(sensitivity analysis)

【运筹学】灵敏性分析

羊肉蛋花汤的博客 14万+

小样本学习概述

目录 前言 小样本学习存在的意义? 什么是小样本学习? 小样本学习的方法有哪些? 结语 前言 小样本学习(Few-Shot Learning)是近几年兴起的一个研究领域,小样本学习旨在解决在数据有限的机器学习任务。 小样本学习存在的意义? 近些年,以深度卷积神经网络为代表的深度学习方法在各类机器学习任务上取得了优异的成绩——很多任务上已经超越了人类表现。狂欢背后,危机四伏。因为这些深度学习方法work的关键之一是海量标注数据的支持。 但是在工业界,很多时候难以获得海量的训练数据,更.

DwD-的博客 3万+

Spring AI Alibaba:Java开发者快速集成大模型与构建智能体工作流指南

在AI应用开发领域,大模型API集成与智能体工作流编排是核心技术挑战。其原理在于通过高层API抽象,封装HTTP通信、上下文管理与工具调用等底层细节,从而降低开发复杂度。这一技术的核心价值在于显著提升开发效率,使开发者能聚焦业务逻辑而非基础设施。其典型应用场景包括为现有Java应用快速添加对话能力、构建复杂决策链的智能体以及开发多步骤AI工作流。Spring AI Alibaba作为基于Spring AI构建的Java框架,正是这一理念的工程实践。它提供了与Spring Boot风格一致的高层次API,并深

weixin_33811539的博客 366

ACC自适应巡航系统

ACC自适应巡航系统可在高速驾驶情况下,自动控制纵向跟车距离,减轻驾驶员的工作量。该功能主要依靠安装在车辆前挡风玻璃上的摄像头和布置在格栅附近的雷达进行融合实现。

未知艺术家的博客 203

AI智能体开发实战:从概念到工程落地的完整指南

AI智能体作为一种能够感知环境、自主决策并执行动作的程序实体,其核心原理在于将大语言模型作为决策中枢,结合工具调用、状态记忆与规划循环,构建出具备连续性和多步骤问题解决能力的系统。这一技术范式为自动化工作流、复杂问题求解等场景带来了工程价值,能够将传统需要硬编码规则的复杂逻辑,转变为通过自然语言描述目标、由智能体自主拆解执行的模式。在实际应用中,开发者需要掌握大模型API调用、提示工程、工具封装等关键技术栈,并借助如Spring AI、LangChain等框架进行高效开发。本文聚焦于智能体的工程实践,通过具

weixin_30385925的博客 349

FM20S用户手册--Linux系统启动卡制作及系统固化

评估板出厂时,默认提供一张配套的Micro SD卡,此卡为可正常使用的Linux系统 启动卡。评估板断电,将Linux系统启动卡插入评估板Micro SD卡槽,根据评估底板丝印将 启动方式选择拨码开关拨为1010(1-4).此档位为Micro SD启动模式。使用Linux 系统启动卡启动系统时,将使用此目录的BOOTbn文件启动FSBL和U-Boot。Linux系统启动卡制作时,已将固化系统的脚本文件mkemmcboot.sh拷贝至Linux系 统启动卡文件系统的"/opt/tools/"目录下。

创龙,嵌入式一体化解决方案商 301

NSGA-II 多目标优化 —— 理论、案例与交互式 GUI 实现

本文详细介绍了 NSGA-II 多目标优化算法的基本原理、数学模型和实现流程。从非支配排序、拥挤距离计算到遗传操作,NSGA-II 通过对种群进行分层和排序,能够有效求解多目标优化问题,获得 Pareto 前沿解集。通过机械结构优化、资源分配和控制参数调优等典型案例,我们展示了 NSGA-II 在实际工程中的广泛应用。为帮助工程师和研究者更直观地理解算法求解过程,本文提供了基于 Python 与 PyQt6 的交互式 GUI 演示系统代码示例。

闲人编程的博客 2119

基于Spring AI与PgVector的Java RAG系统构建实践

检索增强生成(RAG)是一种将信息检索与大语言模型生成能力相结合的技术范式,其核心原理是通过向量化技术将非结构化文档转换为语义向量,并利用向量数据库进行高效相似度检索,从而为LLM提供精准、可追溯的上下文信息。这项技术的核心价值在于显著提升大模型回答的准确性、时效性并减少幻觉,广泛应用于企业知识库问答、智能客服和文档分析等场景。本文聚焦于在纯Java/Spring Boot技术栈中,利用Spring AI框架原生集成向量模型与PgVector数据库,手把手实现一个完整的RAG应用链路,其中涉及文档解析、文本

weixin_33787529的博客 354

38、四旋翼无人机的机械建模、控制与仿真及小型无人机高度的最优鲁棒无模型控制

本文探讨了四旋翼无人机的机械建模、控制与仿真方法,采用基于PID控制器的分层控制策略实现稳定飞行与路径跟踪,并开发了结合CAD模型与MATLAB环境的飞行模拟器。同时,针对小型无人机高度控制问题,提出了一种基于粒子群优化(PSO)的最优鲁棒无模型控制(PSO-MFC)方法,有效解决了参数整定难题,实现了零稳态误差跟踪和强抗干扰能力。两种方法在仿真中均表现出良好性能,为无人机控制系统的设计与优化提供了理论与实践基础。

l6m7n8的博客 99

SpringAI系列|第5篇:RAG检索增强生成

本文深入解析了RAG(检索增强生成)技术在企业知识库中的应用。主要内容包括:1)RAG原理剖析,通过检索+生成两阶段解决AI幻觉问题,确保回答基于企业真实文档;2)Spring AI实现方案,包含离线索引(文档解析、分块、向量化存储)和在线查询(相似度检索、Prompt构建、LLM生成)全流程;3)实战演示,提供PDF/Markdown文档处理、PGvector集成、温度参数调优等具体代码实现。该方案能有效解决传统AI对话的知识局限性和不可溯源问题,适用于客服系统、内部知识库等场景。

weixin_45226411的博客 595

使用R语言获取泊松回归模型的事件密度比(Incidence Rate Ratio,IRR)的95%置信区间

在泊松回归模型中,我们通常关注的是自变量对事件发生率的影响,而事件密度比(Incidence Rate Ratio,IRR)可以帮助我们理解不同自变量对事件发生率的相对影响。在本文中,我们将使用R语言来获取泊松回归模型所有系数的事件密度比的95%置信区间。通过以上步骤,我们可以使用R语言获取泊松回归模型所有系数的事件密度比的95%置信区间。为了获取事件密度比的置信区间,我们将使用。使用R语言获取泊松回归模型的事件密度比(Incidence Rate Ratio,IRR)的95%置信区间。

BugCrusher的博客 1264

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

第八章:Advisor

Spring AI 2.0 的解决方案是 Advisor(顾问)​ 机制。Advisor 是一条责任链,位于 ChatClient.prompt() 和 ChatModel 之间,以洋葱模型的方式层层包裹请求和响应。本章将详细介绍 Advisor 的核心概念、内置实现以及自定义方法,为第九章的 ToolCallingAdvisor

onlylotus的博客 369

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LangChain4j系列:LangChain4j ChatMemory聊天记忆详解与实战

LangChain4j系列:LangChain4j ChatMemory聊天记忆详解与实战

优快云_224022的博客 4276

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring AI 1.0.0 M1版本新特性!

Spring AI 1.0.0-M1这个版本相对前一个版本增加了很多新特性,比如多模态的支持、模型结果评估机制、Fluent API等等,但其中觉得最有意思的是引入了Spring AOP中的Advisor机制。

qq1071643762的博客 2554

Spring AI中InMemoryChatMemory失效获取会话历史方法

IinMemeryChatMemory失效,获取会话历史方法

m0_56189764的博客 224

InMemoryChatMemory哪去了?:大模型聊天记忆功能的彻底重构与踩坑实录

摘要: Spring AI最新版本对聊天记忆功能进行了深度重构,导致旧版InMemoryChatMemory和相关配置方式失效。新版通过职责分离将存储层(InMemoryChatMemoryRepository)与滑动窗口管理层(MessageWindowChatMemory)解耦,避免Token爆炸问题;采用Builder模式强制规范拦截器创建;并重构常量体系,将CHAT_MEMORY_CONVERSATION_ID_KEY迁移至ChatMemory接口。虽然升级带来短期适配成本,但通过存储分离、接口优化

曦煜墨白的博客 1137
上一篇: 从零实现Android相机模块:基于V4L2的YUV数据采集与HAL层封装全流程
下一篇: 时间序列分析必看:DTW算法优化技巧与性能对比
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值