Java的SpringAI+Deepseek大模型实战之会话记忆

文章目录

  • 背景
  • 项目环境
  • 实现步骤
    • 第一步、定义会话存储方式
      • 方式一、定义记忆存储ChatMemory
      • 方式二、注入记忆存储ChatMemory
    • 第二步、配置会话记忆
      • 方式一、老版本实现
      • 方式二、新版本实现
    • 第三步、存储会话信息
  • 异常处理
    • 1、InMemoryChatMemory 无法解析

背景

前两期【环境搭建】和【交互对话】搭建起大模型对话的框架,如何进行会话记忆,记录过程,方便备查。

项目环境

Spring Ai 版本:1.0.0

实现步骤

第一步、定义会话存储方式

在配置类CommomConfiguration中定义记忆存储的方式,根据版本不同,可参考以下。

方式一、定义记忆存储ChatMemory

定义ChatMemory,并添加 环绕增强Advisors,代码如下所示。
适用于版本【SpringAi 1.0.0.0 M6】

// 记忆存储的方式
@Bean
public ChatMemory chatMemory(){return new InMemoryChatMemory();
}
// 添加会话记忆
@Bean
public ChatClient chatClient(OllamaChatModel model,ChatMemory chatMemory){return ChatClient.builder(model).defaultSystem("你是一个可爱热心的智能助手,你的名字叫小爱,请以小爱的口吻回答问题").defaultAdvisors(new SimpleLoggerAdvisor(),new MessageChatMemoryAdvisor(chatMemory)).build();
}

方式二、注入记忆存储ChatMemory

注入ChatMemory,并添加 环绕增强Advisors,代码如下所示。
适用于【SpringAi 1.0.0.0及以上版本】

// SpringAi 1.0.0 注入==ChatMemory==
@Autowired
private ChatMemory chatMemory;@Bean
public ChatClient chatClient(OllamaChatModel model){return ChatClient.builder(model).defaultSystem("你是一个可爱热心的智能助手,你的名字叫小爱,请以小爱的口吻回答问题").defaultAdvisors(new SimpleLoggerAdvisor(),MessageChatMemoryAdvisor.builder(chatMemory).build()).build();
}

第二步、配置会话记忆

在chatClient 客户端配置 会话增强,使用常量 【CHAT_MEMORY_CONVERSATION_ID_KEY】

方式一、老版本实现

@RequestMapping(value = "/chatting",produces = "text/html;charset=utf-8")public Flux<String> chatting(String str,String chatId){return chatClient.prompt().user(str).advisors(aa -> aa.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY,chatId)).stream().content();}

方式二、新版本实现

import static org.springframework.ai.chat.memory.ChatMemory.CONVERSATION_ID;@RequestMapping(value = "/chatting",produces = "text/html;charset=utf-8")public Flux<String> chatting(String str,String chatId){return chatClient.prompt().user(str).advisors(aa -> aa.param(CONVERSATION_ID,chatId)).stream().content();}

在这里插入图片描述

第三步、存储会话信息

@Component
public class InMemoryChatHisRepository  implements ChatHisRepository{private final Map<String,List<String>> chatHistoryMap = new HashMap<>();@Overridepublic void save(String type,String chatId){if(chatHistoryMap.containsKey(type)){chatHistoryMap.put(type,new ArrayList<>());}List<String> chatIds = chatHistoryMap.get(type);if(chatIds.contains(chatId)){return;}chatIds.add(chatId);}@Overridepublic List<String> getChatId(String type){List<String> chatIds = chatHistoryMap.get(type);return null == chatIds ? List.of() : chatIds;}
}

如下图所示
在这里插入图片描述

异常处理

1、InMemoryChatMemory 无法解析

原因:SpringAi 1.0.0 版本移除InMemoryChatMemory
直接注入

import org.springframework.ai.chat.memory.ChatMemory;@Autowired
private ChatMemory chatMemory;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87349.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RDS MySQL vs. Aurora MySQL:高需求工作负载的终极迁移指南

在 AWS 上&#xff0c;开发团队最常见且关键的决策之一就是选择合适的关系型数据库。通常&#xff0c;讨论会从 RDS for MySQL 这个可靠且熟悉的“老黄牛”开始。但很快&#xff0c;就会有人提到一个更强大、更云原生的选项&#xff1a;Aurora MySQL。 也许&#xff0c;就像最…

使用仓颉编程语言是一种怎样的体验?

2024年6月21日下午&#xff0c;华为终端BG软件部总裁龚体先生在华为开发者大会主题演讲《鸿蒙原生应用&#xff0c;全新出发&#xff01;》中向全球开发者介绍了华为自研仓颉编程语言&#xff0c;并发布了HarmonyOS NEXT仓颉语言开发者预览版。这是华为首次公开仓颉编程语言。 …

Qt Creator自定义控件开发流程

Qt Creator自定义控件开发流程 在 Qt 5.9 Creator 中开发自定义控件的完整流程如下&#xff0c;分为设计、实现、集成和测试四个阶段&#xff1a; 1. 创建自定义控件类 (1) 新建类文件 右键项目 → 添加新文件 → C Class基类选择 QWidget 或现有控件&#xff08;如 QPushBu…

翻译《The Old New Thing》- 如何创建一个与屏幕大小相同的窗口,而不会被当作全屏窗口处理?

How can I create a window the size of the screen without it being treated as a fullscreen window? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20250522-00/?p111211 问题描述 任务栏允许全屏窗口覆盖它。这样&#xff0c;当你在放映幻灯片或进行…

深分页末日救星:MySQL延迟关联原理与实战手册

MySQL 深分页&#xff08;如 LIMIT 100000, 10&#xff09;本质是 高代价的偏移量扫描&#xff0c;可通过以下方案优化&#xff0c;附核心原理和实操示例&#xff1a; 一、深分页为什么慢&#xff1f; SELECT * FROM orders ORDER BY id DESC LIMIT 100000, 10; 执行过程&…

前端技术栈 —— HTML、CSS和JavaScirpt执行环境

以下内容由GLM回答生成&#xff0c;不保证正确性。 前端技术栈 —— HTML、CSS和JavaScirpt执行环境 JavaScript 的执行环境HTML 和 CSS 的执行环境HTML 和 CSS 是否可以在其他环境中执行&#xff1f;总结 JavaScript 是一种 解释型语言&#xff0c;但它也可以被编译。JavaScr…

多项式带余除法——线性代数题目为例

一、多项式带余除法的定义 二、例题 使用方法将在例题中展示&#xff1a;

学习日记-spring-day40-7.3

知识点&#xff1a; 1.自动装配Resource&#xff08;3&#xff09; 知识点 核心内容 重点 Autowired与Resource注入规则 默认注入逻辑&#xff1a;未指定参数时&#xff0c;Resource优先按属性名匹配&#xff08;by name&#xff09;&#xff0c;失败后按类型匹配&#xf…

重新认识JNIEnv

引言 抛开一堆概念&#xff0c;我们从本质出发。 java 调用c 我们开发移动端或者后端服务 &#xff0c;都是用的java 或者kotlin 语言。有时候我们需要用c的一些库&#xff08;ocr识别/导航的算法/ 等&#xff09; 因为一些跟硬件相关的接口或者系统的api 都是c写的。 C调用J…

人工智能训练师——智能语音识别ASR

人机对话——ASR 概念 ASR&#xff08;Automatic Speech Recognition&#xff0c;自动语音识别&#xff09;是一种将人类语音转换为文本的技术。它使得计算机能够“听”懂人类的语音指令或对话&#xff0c;并将其转换成可读、可编辑的文本形式。ASR技术是人机交互领域中的一个…

Compose 常用命令详解——AI教你学Docker

3.3 Compose 常用命令详解 Docker Compose 通过一系列命令高效管理多容器应用。理解这些命令&#xff0c;可以让你灵活地启动、停止、查看、调试、扩缩容和配置 Compose 项目。 一、核心命令详解 1. docker compose up 功能&#xff1a;启动并构建所有服务&#xff0c;生成网…

Mausezahn - 网络流量生成与测试工具(支持从链路层到应用层的协议模拟)

Mausezahn 是一个 网络流量生成与测试工具&#xff0c;主要用于模拟各种网络协议行为、测试网络设备性能、验证安全策略或进行故障排查。它支持从底层链路层&#xff08;如 Ethernet、VLAN&#xff09;到高层应用层&#xff08;如 HTTP、DNS&#xff09;的协议模拟&#xff0c;…

08-three.js Textures

Three.js Journey — Learn WebGL with Three.jsThe ultimate Three.js course whether you are a beginner or a more advanced developerhttps://threejs-journey.com/?c=p3 使用原生 JavaScript 首先是静态页面的放置位置,如果使用Vite模版配置,可以直接放在 /static/ …

git 仓库取消合并的分支

要取消 Git 仓库中某次特定的分支合并(例如第一次合并),同时保留其他分支的合并,需要通过 Git 的版本控制功能来操作。以下是具体的步骤和方法,假设你想撤销某次合并(例如某个提交),并确保其他合并不受影响: 背景假设 你有一个 Git 仓库,主分支(例如 main)上已经合…

【从历史数据分析英特尔该如何摆脱困境】

与大多数其他分析师不同&#xff0c;自2013年以来&#xff0c;笔者就一直在积极强调英特尔未来将遭遇冰山&#xff0c;最终我们预测英特尔将在试图执行其之前的战略时破产。尽管我们更愿意采用与英特尔不同的代工厂方法&#xff08;即与台积电成立合资企业&#xff09;&#xf…

【PyTorch】PyTorch中张量(Tensor)微分操作

PyTorch深度学习总结 第六章 PyTorch中张量(Tensor)微分操作 文章目录 PyTorch深度学习总结前言一、torch.autograd模块二、主要功能和使用方法1. 张量的 requires_grad 属性2. backward() 方法3. torch.no_grad() 上下文管理器三、函数总结前言 上文介绍了PyTorch中张量(Ten…

Rust 项目实战:Flappy Bird 游戏

Rust 项目实战&#xff1a;Flappy Bird 游戏 Rust 项目实战&#xff1a;Flappy Bird 游戏理解 Game loop开发库&#xff1a;bracket-libbracket-terminalCodepage 437导入 bracket-lib 创建游戏游戏的模式添加玩家添加障碍最终效果项目源码 Rust 项目实战&#xff1a;Flappy Bi…

Gin 中间件详解与实践

一、中间件的核心概念 定义 中间件是Web开发中非常重要的概念&#xff0c;它可以在请求到达最终处理函数之前或响应返回客户端之前执行一系列操作。Gin 框架支持自定义和使用内置的中间件&#xff0c;让你在请求到达路由处理函数前进行一系列预处理操作。 它是介于请求与响应处…

非接触式DIC测量系统:助力汽车研发与测试的创新技术应用

近年来&#xff0c;随着新能源汽车品牌的快速崛起&#xff0c;新车发布的节奏加快&#xff0c;层出不穷的新产品&#xff0c;给消费者带来了全新的使用体验。与此同时&#xff0c;变革的产品体验也让一些过往的汽车测试和评价标准变得不再适用&#xff0c;尤其是与过往燃油车型…

FOC学习笔记(7)锁相环(PLL)原理及其在电机控制中的应用

1. 锁相环(PLL)概述 锁相环&#xff08;Phase-Locked Loop, PLL&#xff09;是一种闭环控制系统&#xff0c;用于使输出信号的相位与输入参考信号的相位同步。PLL广泛应用于通信、电机控制、频率合成、时钟恢复等领域。在电机无传感器控制&#xff08;Sensorless Control&…