当前位置: 首页 > news >正文

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方式并配置连接信息。

– 求知若饥,虚心若愚。

相关文章:

  • Java基础-26-多态-认识多态
  • 第十九章:Python-pyttsx3 库实现文本转语音功能
  • OpenCV 图形API(5)API参考:数学运算用于执行图像或矩阵加法操作的函数add()
  • mapreduce的工作原理
  • Codeforces Round 1014 (Div. 2)
  • Jetson 设备卸载 OpenCV 4.5.4 并编译安装 OpenCV 4.2.0
  • 电商---part01 项目整体
  • Keil5工程中.uvoptx和.uvprojx后缀名什么意思?
  • 【设计模式】深入解析设计模式:门面模式(外观模式)的定义、优点和代码实现
  • 383. 赎金信
  • 【Git】-- 处理 Git 提交到错误分支的问题
  • 深入理解哈希优化策略与TypeScript实现
  • 【LeetCode Solutions】LeetCode 111 ~ 115 题解
  • 快速构建个人本地知识库管理系统与实现RAG问答
  • JVM面试专题
  • JavaScript 事件流与事件委托
  • VMware Workstation下载,母盘安装,启动的设置,克隆,其他(详细图文)
  • 双重token自动续期解决方案
  • Forking Workflow 详解
  • C语言基础知识10---栈、队列、树
  • 成都建设网站哪家好/医院网络销售要做什么
  • 技术支持 昆明网站建设/网络运营培训课程
  • 深圳高端网站制作多少钱/seo引擎优化是做什么的
  • 怎么利用源码做网站/自媒体135免费版下载
  • wordpress站标签也打不开/参考消息今天新闻
  • 南通免费网站建设/南京seo公司