Java的SpringAI+Deepseek大模型实战之会话记忆
文章目录
- 背景
- 项目环境
- 实现步骤
- 第一步、定义会话存储方式
- 方式一、定义记忆存储ChatMemory
- 方式二、注入记忆存储ChatMemory
- 第二步、配置会话记忆
- 方式一、老版本实现
- 方式二、新版本实现
- 第三步、存储会话信息
- 异常处理
- 1、InMemoryChatMemory 无法解析
背景
前两期【环境搭建】和【交互对话】搭建起大模型对话的框架,如何进行会话记忆,记录过程,方便备查。
项目环境
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<>();@Overridepublic 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);}@Overridepublic 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;