SpringAI——对话记忆

它指的是模型在与用户进行交互式对话过程中,能够追踪、理解并利用先前对话上下文的能力。就像我们人与人之间的对话一样,所有对话都是基于前面的对话,每一句交谈都有前面的对话作为基础,这样才不会牛头不对马嘴。那我们与AI之间的对话也是,我们希望AI可以记住我们之前的对话,而不是每次对话钱都要将之前的再重复一遍。

接下来我们通过代码来学习一下,前提已经创建好项目和配置好了环境看我之前的文章SpringAI------ChatClient的配置与运用

首先我们看一下没有记忆的对话:

复制代码
 @RequestMapping("/normal/chat")
    public String normalChat(String input) {
        UserMessage userMessage = new UserMessage(input);
        return chatModel.call(new Prompt(userMessage)).getResult().getOutput().getContent();
    }

那我再问他叫什么名字,正常来说它应该叫严珍,但是它是没有记忆的,所以:

那我们想,每次把每次对话(包括用户提问和AI回答)都存在一个列表里面,每次提问的时候都把列表传给大模型就可以了,这样它不就有记忆了,开干:

复制代码
private final static List<Message> messages = new ArrayList<>();


@RequestMapping("/memory/chat")
public String chat(String input) {
        UserMessage userMessage = new UserMessage(input);
        messages.add(userMessage);
        String content = chatModel.call(new Prompt(messages)).getResult().getOutput().getContent();
        AssistantMessage assistantMessage = new AssistantMessage(content);
        messages.add(assistantMessage);
        return content;
    }

结果:

但是这种手动添加上下文的聊天记忆太过于麻烦,聊天记录需要开发人员自己管理,不易于扩展,SpringAI 为我们提供了一个基于内存的对话记忆ChatMemory,请看Demo:

复制代码
 private final ChatClient chatClient;
 @Autowired
 public MemoryController(ChatClient.Builder builder) {
        ChatMemory chatMemory = new InMemoryChatMemory();
        this.chatClient = builder
                .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
                .build();
    }

    @RequestMapping("/memory/chat")
    public String chat(String input) {
        String content = chatClient.prompt()
                .user( input)
                .call().content();
        return content;
    }

它将一个 MessageChatMemoryAdvisor 注册到 ChatClient 中,这个 Advisor 的作用是在每次调用大模型时,自动将历史对话记录添加到 Prompt 中,从而让模型"记住"之前的对话内容。

我可以看到InMemoryChatMemory是通过一个Map来存储

原理简述:

  • 每次用户发送一条消息时,MessageChatMemoryAdvisor 会从 ChatMemory 中取出之前的历史对话。
  • 将历史对话插入到当前请求的 Prompt 中。
  • 发送给模型处理后,再把模型回复也保存进 ChatMemory。

这样就实现了带上下文记忆的连续对话。

相关推荐
Mahir085 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
魏杨杨6 小时前
一个程序员眼中的 AI 核心概念,讲透 LLM 、Agent 、MCP 、Skill 、RAG...
ai·.net·agent·claude code
RyFit6 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码6 小时前
C++ 内存分区 堆区
java·开发语言·c++
元拓数智7 小时前
智能分析落地卡壳?先补好「数据关系+语义治理」这层技术基建
大数据·分布式·ai·spark·数据关系·语义治理
绝知此事7 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
企学宝7 小时前
企学宝5月专题课程丨《OpenClaw AI 智能体实战营:从零基础部署到全场景自动化落地》
人工智能·ai·企业培训
无风听海7 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠7 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
德思特8 小时前
从 Dify 配置页理解 RAG 的重要参数
java·人工智能·llm·dify·rag