SpingAI实现简单会话记忆的功能

xiaojiuaigc@163.com 发布于 2025-07-27 35 次阅读


本身大模型是没有记忆功能的,SpingAI中也提供了一种会话记忆的ChatMemory但是如果让我们自己来实现又应该怎么做呢?

定义聊天对话存储的容器

AI 大模型是没有记忆功能的! 要想后续的对话中,AI 大模型能够记得历史对话内容,就需要每次都将之前的 “聊天记录” 发送给它。

// 存储聊天对话 private Map<String, List<Message>> chatMemoryStore = new ConcurrentHashMap<>();

存储不同的角色

/**
* 普通对话
*
* @param message
* @return
*/
@GetMapping("/generate")
public String generate(@RequestParam(value = "message", defaultValue = "你是谁?") String message,
@RequestParam(value = "chatId") String chatId) {
//根据chatId获取对话记录
List<Message> messages = chatMemoryStore.get(chatId);
//messages可能为空如果不存在初始化一份
if (CollectionUtils.isEmpty( messages)){
messages=new ArrayList<>();
chatMemoryStore.put(chatId, messages);
}
//添加用户角色消息到聊天记录中去
messages.add(new UserMessage(message));
// 构建提示词
Prompt prompt = new Prompt(messages);
// 一次性返回结果
String responseText = chatModel.call(prompt).getResult().getOutput().getText();
//添加助手角色消息到聊天记录中去
messages.add(new AssistantMessage(responseText));
return responseText;
}

解释一下上述代码:

  • 接口入参中,添加 chatId 字段,用于区分不同对话;
  • 通过 chatId 从 chatMemoryStore 字典中,获取对应的聊天记录 List 集合;
  • 判断记录 List 集合是否存在,若不存在,则进行初始化操作,并放到 chatMemoryStore 字典中;
  • 接着,先新建一个 UserMessage 用户角色消息,将用户提问的内容,添加到 chatMemoryStore 字典中,存储聊天记录;
  • 构建提示词,并调用 AI 大模型;
  • 拿到响应结果后,再新建一个 AssistantMessage 助手角色消息,同样保存到 chatMemoryStore 字典中;
  • 返回响应结果;
  • 这样,每次的对话内容,都会被保存起来,每次调用 AI 大模型时,再统一发送给大模型,从而实现了聊天记忆功能;

简单测试一下http://localhost:8080/v5/ai/generate?message=你是谁&chatId=1

大模型回答:

再次向大模型提问,并进行Debug测试

成功获取到了之前的记录