文章目录
背景
前两期【环境搭建】和【交互对话】搭建起大模型对话的框架,如何进行会话记忆,记录过程,方便备查。
项目环境
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;