Spring AI Alibaba 对话记忆使用

news2025/4/3 2:57:31

一、对话记忆 (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.coloradmin.cn/o/2326208.html

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

相关文章

Ubuntu24.04 离线安装 MySQL8.0.41

一、环境准备 1.1 官方下载MySQL8.0.41 完整包 1.2 上传包 & 解压 上传包名称是&#xff1a;mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundle.tar # 切换到上传目录 cd /home/MySQL8 # 解压&#xff1a; tar -xvf mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundl…

SOME/IP-SD -- 协议英文原文讲解10

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.5 Non…

Ubuntu上给AndroidStudio创建桌面图标

最近使用了Ubuntu开发了&#xff0c;默认的android studio没有桌面图标&#xff0c;还是很不方便&#xff0c;每次都要cd到bin目录启动studio.sh。 步骤1&#xff1a;cd /usr/share/applications linux系统里面&#xff0c;所有的应用启动入口都在 /usr/share/applications …

简单视图函数

视图函数 文章目录 视图函数[toc]一、什么是视图函数二、简单视图函数三、返回错误视图 一、什么是视图函数 所谓视图函数&#xff08;简称视图&#xff09;&#xff0c;本质上就是一个Python函数&#xff0c;用于接收Web请求并且返回Web响应。Web响应可以包含很多类型&#x…

蓝桥杯备考----》完全背包模板

其实这个完全背包的步骤和01背包也是差不多滴&#xff0c;不过他有一些优化是我们必须要说一说的 老样子&#xff0c;我们先定义一下状态表示 step1: f[i][j]表示从1到i个物品里选出体积不超过j的最大价值 step2:状态转移方程 写成一行就是 我们再写一下f[i][j-v[i]]的表达…

小白入门机器学习概述

文章目录 一、引言二、机器学习的基础概念1. 机器学习的定义2. 机器学习的类型&#xff08;1&#xff09;监督学习&#xff08;Supervised Learning&#xff09;&#xff08;2&#xff09;无监督学习&#xff08;Unsupervised Learning&#xff09;&#xff08;3&#xff09;半…

微软 GraphRAG 项目学习总结

微软2024年4月份发布了一篇《From Local to Global: A GraphRAG Approach to Query-Focused Summarization》&#xff08;GraphRAG&#xff1a;从局部到全局的查询式摘要方法&#xff09;论文&#xff0c;提出了一种名为GraphRAG的检索增强生成&#xff08;RAG&#xff09;方法…

C# dataGridView 自动生成几行几列及手动输入整型字符

C# dataGridView生成12号4列的表格 private void Form1_Load(object sender, EventArgs e) {// 清除默认列dataGridView1.Columns.Clear();// 添加4列&#xff08;首列为序号列&#xff09;dataGridView1.Columns.Add("ColIndex", "序号");dataGridView1.…

Day17 -实例:利用不同语言不同框架的特征 进行识别

前置&#xff1a;我们所需的web站点&#xff0c;都可以利用fofa去搜索&#xff0c;例如&#xff1a;app"flask"这样的语句去找对应的站点&#xff0c;找到后&#xff0c;我们模拟不知道是什么框架&#xff0c;再根据特征去判断它的框架。 ***利用工具可以再去结合大…

Pycharm(八):字符串切片

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

Mysql从入门到精通day5————子查询精讲

本文主要讲述子查询的几种方法&#xff0c;读者注意体会它们的不同场合的适用情况及功能&#xff0c;本篇文章也融入了小编实践过程遇到的坑&#xff0c;希望读者不要再踩坑 一.带IN关键字的子查询 in关键字可以检测结果集中是否存在某个特定的值&#xff0c;检测成功则执行外…

虫洞数观系列二 | Python+MySQL高效封装:为pandas数据分析铺路

目录 系列文章 1. 引言 2. 常规写法mysql 3. 封装设计接口mysql 3.1dbname.py文件 3.1.1. 导入和基类定义 3.1.2. 具体表定义类 3.1.3. 表定义整合函数 3.1.4. 全局字典和测试代码 3.2mysql_dao文件 3.2.1. 模块导入与配置 3.2.2. 数据库连接池初始化 3.2.3. Comm…

MySQl之Binlog

前言 Binlog&#xff08;Binary Log&#xff09;是MySQL中至关重要的日志模块&#xff0c;它直接关系到数据恢复、主从复制等高阶架构设计。无论你是刚入门的新手还是有一定经验的开发者&#xff0c;掌握Binlog的原理和应用都是进阶的必经之路。 BinLog是什么&#xff1f; Bin…

开源项目解读(https://github.com/zjunlp/DeepKE)

1.DeepKE 是一个开源的知识图谱抽取与构建工具&#xff0c;支持cnSchema、低资源、长篇章、多模态的知识抽取工具&#xff0c;可以基于PyTorch实现命名实体识别、关系抽取和属性抽取功能。同时为初学者提供了文档&#xff0c;在线演示, 论文, 演示文稿和海报。 2.下载对应的de…

「MethodArgumentTypeMismatchException:前端传递 ‘undefined‘ 导致 Integer 类型转换失败」

遇到的问题&#xff1a; Failed to convert value of type java.lang.String to required type java.lang.Integer; nested exception is java.lang.NumberFormatException: For input string: "undefined" 原因分析&#xff1a; 大致意思就是我传递的参数到后端没…

LabVIEW故障诊断数据处理方法

在LabVIEW故障诊断系统中&#xff0c;数据处理直接决定诊断的准确性和效率。工业现场常面临噪声干扰、数据量大、实时性要求高等挑战&#xff0c;需针对性地选择处理方法。本文结合电机故障诊断、轴承损伤检测等典型案例&#xff0c;详解数据预处理、特征提取、模式识别三大核心…

基于 SpringBoot 的火车订票管理系统

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…

Python的概论

免责声明 如有异议请在评论区友好交流&#xff0c;或者私信 内容纯属个人见解&#xff0c;仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示&#xff1a;&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c…

构建大语言模型应用:句子转换器(Sentence Transformers)(第三部分)

本系列文章目录 简介数据准备句子转换器&#xff08;本文&#xff09;向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 在之前的博客中&#xff0c;我们学习了为RAG&#xff08;检索增强生成&#xff0c;Retrieval Augmented Generati…

怎样提升大语言模型(LLM)回答准确率

怎样提升大语言模型(LLM)回答准确率 目录 怎样提升大语言模型(LLM)回答准确率激励与规范类知识关联类情感与语境类逆向思维类:为什么不,反面案例群体智慧类明确指令类示例引导类思维引导类约束限制类反馈交互类:对话激励与规范类 给予奖励暗示:在提示词中暗示模型如果回…