Spring AI Alibaba 对话记忆使用

一、对话记忆 (ChatMemory)简介

1、对话记忆介绍

”大模型的对话记忆”这一概念,根植于人工智能与自然语言处理领域,特别是针对具有深度学习能力的大型语言模型而言,它指的是模型在与用户进行交互式对话过程中,能够追踪、理解并利用先前对话上下文的能力。

此机制使得大模型不仅能够响应即时的输入请求,还能基于之前的交流内容能够在对话中记住先前的对话内容,并根据这些信息进行后续的响应。

这种记忆机制使得模型能够在对话中持续跟踪和理解用户的意图和上下文,从而实现更自然和连贯的对话。

2、基于memory的对话记忆

spring-ai-alibaba支持基于chat memory的对话记忆,也就是不需要调用显示的记录每一轮的对话历史。而是将对话的上下文内容进行存储和记录。

开发者可以自行实现ChatMemory基于类似于文件、内存,MySQL,Redis等方式进行上下文内容的存储和记录。

二、对话记忆 (ChatMemory)使用

Spring AI Alibaba 对话记忆 (ChatMemory):https://java2ai.com/docs/1.0.0-M6.1/tutorials/memory/

Spring AI Alibaba 支持以上 Model 抽象与通义系列模型的适配,并通过 spring-ai-alibaba-starter AutoConfiguration 自动初始化了默认实例,因此我们可以在应用程序中直接注入 ChatModel、ImageModel 等 bean,当然在需要的时候也可以自定义 Model 实例。

1、基于内存存储的对话记忆实现

在普通 Controller Bean 中注入 ChatMemory 实例,实现下面几个功能:

  • 简单调用
  • 流式调用

由于 InMemoryChatMemory是内置支持,所以我们直接使用它。

编写 Controller接口

/*** 基于内存的对话记忆*/
@Slf4j
@RestController
@RequestMapping("/dashscope/chat-memory/inMemory")
public class DashScopeMemoryInMemoryController {//初始化基于内存的对话记忆private ChatMemory chatMemory = new InMemoryChatMemory();private final ChatClient dashScopeChatClient;public DashScopeMemoryInMemoryController(ChatModel chatModel) {this.dashScopeChatClient = ChatClient.builder(chatModel).build();}/*** 获取对话的唯一标识接口*/@GetMapping("/getChatId")public String getChatId() {//对话记忆的唯一标识String chatId = UuidUtils.generateUuid();return chatId;}/*** 简单调用*/@GetMapping("/simple/chat")public String simpleChat(@RequestParam(defaultValue = "你好,介绍下你自己!") String userInputPrompt,@RequestParam("chatId") String chatId) {//对话记忆的唯一标识if (StringUtils.isBlank(chatId)) {return "chatId is null";}String aiOutput = dashScopeChatClient.prompt(userInputPrompt).advisors(new MessageChatMemoryAdvisor(chatMemory)).advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)).call().content();log.info("simpleChat --> userInputPrompt = {}", userInputPrompt);return aiOutput;}/*** 流式调用。* 可以使大模型的输出信息实现打字机效果。*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response,@RequestParam(defaultValue = "你好,介绍下你自己!") String userInputPrompt,@RequestParam("chatId") String chatId) {// 避免接口返回乱码response.setCharacterEncoding("UTF-8");log.info("streamChat --> userInputPrompt ={}", userInputPrompt);Flux<String> aiOutput = dashScopeChatClient.prompt(userInputPrompt).advisors(new MessageChatMemoryAdvisor(chatMemory)).advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)).stream().content();return aiOutput;}}

启动项目,访问接口与 AI 大模型智能对话。

我们获取到对话id之后,进行下面多轮的对话,对话记忆机制生效。

  1. 你是一个旅游规划师
  2. 我想去西安
  3. 能帮我推荐一些旅游景点吗?
  4. 那里的美食如何?
  5. 那里有什么样的历史文化?

在这里插入图片描述
在这里插入图片描述

基于 MySQL,Redis等方式进行上下文内容的存储和记录,需要我们引入官方依赖,然后将 InMemoryChatMemory替换为对应的MySQL,Redis方式并配置连接信息。

– 求知若饥,虚心若愚。

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

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

相关文章

vdi模式是什么

‌VDI模式&#xff08;Virtual Desktop Infrastructure&#xff09;是一种基于服务器的计算模型&#xff0c;其核心思想是将所有计算和存储资源集中在服务器上&#xff0c;用户通过前端设备&#xff08;如瘦客户机&#xff09;访问服务器上的虚拟桌面‌‌ VDI模式的工作原理 在…

【分布式】深入剖析 Sentinel 限流:原理、实现

在当今分布式系统盛行的时代&#xff0c;流量的剧增给系统稳定性带来了巨大挑战。Sentinel 作为一款强大的流量控制组件&#xff0c;在保障系统平稳运行方面发挥着关键作用。本文将深入探讨 Sentinel 限流的原理、实现方案以及其优缺点&#xff0c;助力开发者更好地运用这一工具…

c#winform,倒鸭子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果

不废话 直接上效果图 C# winform 开发抖音的瀑布流字幕。 也是typemonkey插件字幕效果 或者咱再网上常说的倒鸭子字幕效果 主要功能 1&#xff0c;软件可以自定义添加字幕内容 2&#xff0c;软件可以添加字幕显示的时间区间 3&#xff0c;可以自定义字幕颜色&#xff0c;可以随…

Pycharm(八):字符串切片

一、字符串分片介绍 对操作的对象截取其中一部分的操作&#xff0c;比如想要获取字符串“888666qq.com前面的qq号的时候就可以用切片。 字符串、列表、元组都支持切片操作。 语法&#xff1a;字符串变量名 [起始:结束:步长] 口诀&#xff1a;切片其实很简单&#xff0c;只顾头来…

图片解释git的底层工作原理

&#xff08;图片来源&#xff1a;自己画的&#xff09; 基于同一个commit创建新分支 &#xff08;图片来源&#xff1a;书籍《Linux运维之道》 ISBN 9787121461811&#xff09; 在新分支上修改然后commit一次 &#xff08;图片来源&#xff1a;书籍《Linux运维之道》 ISBN 978…

leetcode994.腐烂的橘子

思路源自 【力扣hot100】【LeetCode 994】腐烂的橘子&#xff5c;多源BFS 这里图中的腐烂的的橘子是同时对周围进行腐化&#xff0c;所以采用多源bfs就能解决 多源bfs与单源bfs的区别就在于队列取出时一轮是取出队列当中的全部元素 class Solution {public int orangesRotti…

【华为OD技术面试真题 - 技术面】- Java面试题(15)

华为OD面试真题精选 专栏:华为OD面试真题精选 目录: 2024华为OD面试手撕代码真题目录以及八股文真题目录 介绍下TCP/UDP TCP(传输控制协议)和 UDP(用户数据报协议) TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是两种常见的传输层协议,主要…

‌在 Fedora 系统下备份远程 Windows SQL Server 数据库的完整方案

‌一、环境准备与工具安装‌ ‌1. 安装 Microsoft SQL Server 命令行工具‌ Fedora 需安装 mssql-tools 和 ODBC 驱动&#xff1a; # 添加 Microsoft 仓库 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo# 安装工具包 …

DeepSeek:巧用前沿AI技术,开启智能未来新篇章

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;大模型成为全球科技竞争的核心赛道。在这场AI革命中&#xff0c;DeepSeek作为中国领先的大模型研发团队&#xff0c;凭借其创新的技术架构、高效的训练方法和广泛的应用场景&#xff0c;迅…

R语言实现轨迹分析--traj和lcmm包体会

R语言实现轨迹分析–traj和lcmm包体会 轨迹分析是对重复测量数据的一种归纳&#xff0c;转化为一种分类变量&#xff0c;比如手术后1&#xff5e;7天内的疼痛评分&#xff0c;可以形成术后急性痛轨迹。形成的轨迹作为一个分类变量&#xff0c;可以用于预测疾病的预后&#xff…

Vue 3 事件总线详解:构建组件间高效通信的桥梁

Vue 3 事件总线详解&#xff1a;构建组件间高效通信的桥梁 为什么需要事件总线&#xff1f;使用 mitt 实现事件总线1. 安装 mitt2. 创建事件总线3. 在组件中使用事件总线发送端组件&#xff08;例如 ComponentA.vue&#xff09;接收端组件&#xff08;例如 ComponentB.vue&…

MySQL的基础语法1(增删改查、DDL、DML、DQL和DCL)

目录 一、基本介绍 二、SQL通用语法 三、SQL分类(DDL、DML、DQL、DCL) 1.DDL 1.1数据库操作 1.2表操作 1.2.1表操作-查询创建 1.2.2表操作-数据类型 1&#xff09;数值类型 2&#xff09;字符串类型 3&#xff09;日期时间类型​编辑 4&#xff09;表操作-案例 1.2.3…

【NLP】15. NLP推理方法详解 --- 动态规划:序列标注,语法解析,共同指代

动态规划 (Dynamic Programming) 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种通过将问题分解为较小子问题来优化计算效率的技术。它特别适用于优化最优解问题&#xff0c;比如序列标注&#xff08;sequence tagging&#xff09;这类任务。…

JavaScript中的NaN、undefined和null 的区别

NaN代表"Not a Number",它是一种特殊的数值,用于表示非数字值。当一个操作无法返回有效的数值时,通常会得到NaN作为结果。 let result = 10 / abc; console.log(result); // 输出 NaN需要注意的是,NaN与自身不相等,我们无法通过简单的比较操作符(如==或===)来…

Turtle事件处理(键盘与鼠标交互)

Turtle 提供了 事件驱动编程,允许我们使用 键盘 和 鼠标 控制 Turtle,从而实现交互式绘图。例如,我们可以让 Turtle 响应 按键、鼠标点击 和 拖动 事件,使其根据用户的输入进行移动、旋转或绘制图形。 1. 事件机制概述 Turtle 的事件处理主要依赖 turtle.Screen() 提供的 …

【Keepalived】Keepalived-2.3.3明确结束对CentOS 7的支持

2025年3月30日&#xff0c;官方发布了Keepalived的最新版&#xff0c;版本号&#xff1a;2.3.3 而2024年11月3日发布的2.3.2版本&#xff0c;在CentOS 7.9上编译的时候&#xff0c;就出现了报错&#xff0c;但是在Alma Linux 8.10上&#xff0c;则可以成功编译安装&#xff0c…

PyTorch --torch.cat张量拼接原理

在 PyTorch 的 torch.cat 函数中&#xff0c;out 参数用于指定输出张量的存储位置。是否使用 out 参数直接影响结果的存储方式和张量的内存行为。以下是详细解释&#xff1a; 不使用 out 参数&#xff08;默认行为&#xff09; 含义&#xff1a;不提供 out 参数时&#xff0c;…

人工智能之数学基础:矩阵对角化的本质

本文重点 前面的课程中,我们学习了矩阵的对角化,基于对角化可以将矩阵A转变为对角矩阵D,但是你有没有想过,为什么要进行矩阵对角化,矩阵对角化究竟做了一件什么事情呢? 矩阵对角化的本质 几何解释: 从几何变换的角度看,矩阵对角化意味着我们找到了一组基,使得线性变…

ubuntu的ubuntu--vg-ubuntu--lv磁盘扩容

在我们安装ubuntu时&#xff0c;如果选择的是自动分区&#xff0c;就会按照逻辑卷的形式来分区&#xff0c;并且只分配100G其余的并不会被分配&#xff0c;这对我们大多数情况来说都是不合理的&#xff0c;所以&#xff0c;如何扩充呢 下面以一个小的案例来说明如何扩充 问题…

Redis BitMap 实现签到及连续签到统计

一、引言 用户签到功能是很多应用都离不开的一个板块&#xff0c;单词打开、QQ达人等等为我们所熟知&#xff0c;这项功能该如何实现呢&#xff0c;一些朋友可能想当然的觉得无非将每日的签到数据记录下来不就好了&#xff0c;不会去细想用谁记录&#xff0c;如何记录才合适。 …