本身大模型是没有记忆功能的,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测试

成功获取到了之前的记录
Comments NOTHING