Java的SpringAI+Deepseek大模型实战之会话记忆

发布于:2025-07-04 ⋅ 阅读:(15) ⋅ 点赞:(0)

背景

前两期【环境搭建】和【交互对话】搭建起大模型对话的框架,如何进行会话记忆,记录过程,方便备查。

项目环境

Spring Ai 版本:1.0.0

实现步骤

第一步、定义会话存储方式

在配置类CommomConfiguration中定义记忆存储的方式,根据版本不同,可参考以下。

方式一、定义记忆存储ChatMemory

定义ChatMemory,并添加 环绕增强Advisors,代码如下所示。
适用于版本【SpringAi 1.0.0.0 M6】

// 记忆存储的方式
@Bean
public ChatMemory chatMemory(){
	return new InMemoryChatMemory();
}
// 添加会话记忆
@Bean
public ChatClient chatClient(OllamaChatModel model,ChatMemory chatMemory){
    return ChatClient
            .builder(model)
            .defaultSystem("你是一个可爱热心的智能助手,你的名字叫小爱,请以小爱的口吻回答问题")
            .defaultAdvisors(
                    new SimpleLoggerAdvisor(),
                    new MessageChatMemoryAdvisor(chatMemory))
            .build();
}

方式二、注入记忆存储ChatMemory

注入ChatMemory,并添加 环绕增强Advisors,代码如下所示。
适用于【SpringAi 1.0.0.0及以上版本】

// SpringAi 1.0.0 注入==ChatMemory==
@Autowired
private ChatMemory chatMemory;

@Bean
public ChatClient chatClient(OllamaChatModel model){
    return ChatClient
            .builder(model)
            .defaultSystem("你是一个可爱热心的智能助手,你的名字叫小爱,请以小爱的口吻回答问题")
            .defaultAdvisors(
                    new SimpleLoggerAdvisor(),
                    MessageChatMemoryAdvisor.builder(chatMemory).build())
            .build();
}

第二步、配置会话记忆

在chatClient 客户端配置 会话增强,使用常量 【CHAT_MEMORY_CONVERSATION_ID_KEY】

方式一、老版本实现

@RequestMapping(value = "/chatting",produces = "text/html;charset=utf-8")
    public Flux<String> chatting(String str,String chatId){
        return chatClient
                .prompt()
                .user(str)
                .advisors(aa -> aa.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY,chatId))
                .stream()
                .content();
    }

方式二、新版本实现

import static org.springframework.ai.chat.memory.ChatMemory.CONVERSATION_ID;

@RequestMapping(value = "/chatting",produces = "text/html;charset=utf-8")
  public Flux<String> chatting(String str,String chatId){
      return chatClient
              .prompt()
              .user(str)
              .advisors(aa -> aa.param(CONVERSATION_ID,chatId))
              .stream()
              .content();
  }

在这里插入图片描述

第三步、存储会话信息

@Component
public class InMemoryChatHisRepository  implements ChatHisRepository{

    private final Map<String,List<String>> chatHistoryMap = new HashMap<>();

    @Override
    public void save(String type,String chatId){
        if(chatHistoryMap.containsKey(type)){
            chatHistoryMap.put(type,new ArrayList<>());
        }
        List<String> chatIds = chatHistoryMap.get(type);
        if(chatIds.contains(chatId)){
            return;
        }
        chatIds.add(chatId);
    }

    @Override
    public List<String> getChatId(String type){
        List<String> chatIds = chatHistoryMap.get(type);
        return null == chatIds ? List.of() : chatIds;
    }
}

如下图所示
在这里插入图片描述

异常处理

1、InMemoryChatMemory 无法解析

原因:SpringAi 1.0.0 版本移除InMemoryChatMemory
直接注入

import org.springframework.ai.chat.memory.ChatMemory;

@Autowired
private ChatMemory chatMemory;