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

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

相关推荐
_院长大人_13 小时前
开始构建 Spring AI Alibaba-智能体
spring ai
cab55 天前
【Spring AI】基于 sse 实现 MCP Server
spring ai
程序猿DD14 天前
如何在 Spring Boot 应用中配置多个 Spring AI 的 LLM 客户端
spring boot·llm·spring ai
XiaoLeisj15 天前
【SpringAI】第六弹:深入解析 MCP 上下文协议、开发和部署 MCP 服务、MCP 安全问题与最佳实践
阿里云·大模型·协议·spring ai·mcp
小许学java15 天前
Spring AI-流式编程
java·后端·spring·sse·spring ai
小许学java16 天前
Spring AI快速入门以及项目的创建
java·开发语言·人工智能·后端·spring·ai编程·spring ai
XiaoLeisj23 天前
【SpringAI】第四弹:深入解析 Rag 检索增强工作流程、最佳实践和调优
阿里云·原型模式·rag·spring ai·灵积大模型
慕木沐1 个月前
SpringAI工具调用原理解析
java·spring ai
uesowys1 个月前
Spring AI开发指导-对话存储
spring ai
J_bean2 个月前
Spring AI Alibaba 项目接入兼容 OpenAI API 的大模型
人工智能·spring·大模型·openai·spring ai·ai alibaba