文章目录
- 背景
- 项目环境
- 实现步骤
- 第一步、定义会话存储方式
- 方式一、定义记忆存储ChatMemory
- 方式二、注入记忆存储ChatMemory
- 第二步、配置会话记忆
- 方式一、老版本实现
- 方式二、新版本实现
- 第三步、添加会话ID
- 异常处理
- 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();
}
第二步、配置会话记忆
方式一、老版本实现
@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();}
第三步、添加会话ID
异常处理
1、InMemoryChatMemory 无法解析
原因:SpringAi 1.0.0 版本移除InMemoryChatMemory
直接注入
import org.springframework.ai.chat.memory.ChatMemory;@Autowired
private ChatMemory chatMemory;