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。

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

相关推荐
Dcs1 小时前
还在用 Arrays.hashCode?Java 自己也能写出更快的版本!
java
fouryears_234173 小时前
Spring,Spring Boot 和 Spring MVC 的关系以及区别
java·spring boot·spring·mvc
阿葱(聪)4 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
路人蛃4 小时前
通过国内扣子(Coze)搭建智能体并接入discord机器人
人工智能·python·ubuntu·ai·aigc·个人开发
浮生带你学Java4 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
板板正4 小时前
SpringAI——提示词(Prompt)、提示词模板(PromptTemplate)
java·spring boot·ai·prompt
期待のcode5 小时前
图片上传实现
java·前端·javascript·数据库·servlet·交互
李长渊哦5 小时前
深入理解Java中的Map.Entry接口
java·开发语言
夜月蓝汐5 小时前
JAVA中的Collection集合及ArrayList,LinkedLIst,HashSet,TreeSet和其它实现类的常用方法
java·开发语言