当前位置: 首页 > news >正文

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;
http://www.lryc.cn/news/579747.html

相关文章:

  • Python入门Day2
  • 网络编程学习路线图
  • Windows 10 2016 长期服务版
  • 7.3实验部分
  • 工程化实践——标准化Eslint、PrettierTS
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DragNDrop(拖拽占用组件)
  • Selenium 自动化测试中跳过机器人验证的完整指南:能用
  • 供应链管理:采购与供应链管理中的核心分析工具
  • js代码中的作用域
  • Linux: perf report数据对比,python
  • ArcGISPro应用指南:ArcGISPro制图全流程详解
  • Java综合练习04
  • 优化Facebook广告投放的五大关键策略
  • 机器学习安装使用教程
  • SpringSecurity01
  • win11设置任务栏为顶部
  • 「Java流程控制」循环综合应用
  • oracle锁表,oracle解锁表,oracle用户连接数
  • [自然语言处理]计算语言的熵
  • [自然语言处理]汉语文本分词
  • 百战商店项目学习心得
  • Qt Creator自定义控件开发流程
  • visio画大括号和失败的大模型画图尝试
  • Doris 数据导入性能优化全攻略:深度诊断与全面提速指南
  • 冒泡排序及其优化方式
  • LED闪烁 + PWM呼吸灯
  • 【React Native原生项目不能运行npx react-native run-android项目】
  • Redis 持久化详解、使用及注意事项
  • 《C++MLpack库 聚类算法》实战指南
  • day15——Java常用API(二):常见算法、正则表达式与异常处理详解