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接口

java 复制代码
/**
 * 基于内存的对话记忆
 */
@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方式并配置连接信息。

-- 求知若饥,虚心若愚。

相关推荐
学编程就要猛1 天前
使用Spring AI配置聊天大模型实现人机交互(初阶)
java·spring ai·advisor·chatclient·chatmodel
占星安啦3 天前
Spring AI 接入阿里云百炼模型内置工具
spring ai·联网搜索·内置工具·阿里云百炼模型·网页爬取
pnoker7 天前
IoT DC3 AI 能力:Agentic Center 的设计与边界
java·人工智能·物联网·大模型·spring ai
LayZhangStrive9 天前
Agent开发 - MCP Client使用MCP Server的几种方式(Spring AI)
java·spring ai·mcp
递归尽头是星辰14 天前
Spring AI 实战:Function Calling,Agent 的底层工具层工程化实践
agent·functioncalling·spring ai·java 大模型工程化
递归尽头是星辰15 天前
大模型 Agent 知识体系:Java 开发者视角下的原理、架构与选型边界
react·智能体·spring ai·java 后端·大模型 agent
TizzyGoodhealth17 天前
从零到一搭建Spring‑AI原生Tool‑Calling AI Agent|架构对比+完整实战源码+踩坑实录
java·ai·知识库·rag·ai agent·spring ai
中间件XL19 天前
ai-agent框架spring ai alibaba (三)外部调用II-2 分布式MCP
spring ai·springaialibaba·分布式mcp·nacos3
QCodingDev22 天前
Spring AI Alibaba ReAct Agent实战:从Tool Calling到Agent,企业AI复杂业务该如何设计?
java·人工智能·agent·ai编程·spring ai
还是鼠鼠1 个月前
Spring AI ChatClient详解:创建第一个AI客户端
java·springboot·spring ai·chatclient