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。

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

相关推荐
橘子编程14 分钟前
操作系统原理:从入门到精通全解析
java·linux·开发语言·windows·计算机网络·面试
飞Link22 分钟前
LangGraph 核心架构解析:节点 (Nodes) 与边 (Edges) 的工作机制及实战指南
java·开发语言·python·算法·架构
beyond阿亮24 分钟前
Claude Code零基础入门安装使用指南
人工智能·ai·claude code
xuhaoyu_cpp_java1 小时前
Boyer-Moore 投票算法
java·经验分享·笔记·学习·算法
JavaEdge.1 小时前
Chrome加载已解压的扩展程序-清单文件缺失或不可读取 无法加载清单
java
iReachers1 小时前
HTML打包EXE配置管理教程:多项目打包设置一键保存、加载与切换
java·前端·javascript
Agent产品评测局1 小时前
企业预算管理自动化落地,编制管控全流程实现方案 —— 2026企业级智能体选型与架构深度解析
运维·人工智能·ai·架构·自动化
XiYang-DING1 小时前
【Java】堆
java·开发语言
Lyyaoo.1 小时前
【Java基础面经】Java 反射机制
java·开发语言·python
YXWik61 小时前
Langchain4j(1)基础对话+连续对话+工具调用 + 流式响应+结构化 JSON 输出
java