前提:前文实现了对话的记忆功能以及隔离功能,详见
【Springboot+LangChain4j】实现对话隔离功能-CSDN博客
但是将对话记忆保存在内存中肯定是不行的,多了就会造成OOM异常,最好还是存入数据库或者redis中,本文在之前代码基础上,增加持久化对话记忆的功能
1.配置类
新建类ChatMemoryDatabaseConfig,实现ChatMemoryStore接口中的增删查接口,具体方法中与数据库的交互操作不写了,已在注释中标出
public class ChatMemoryDatabaseConfig implements ChatMemoryStore {
@Override
public List<ChatMessage> getMessages(Object memoryId) {
/*
去数据库中根据memoryId查询记录
*/
return null;
}
@Override
public void updateMessages(Object memoryId, List<ChatMessage> list) {
/*
向数据库中更新查询记录
*/
}
@Override
public void deleteMessages(Object memoryId) {
/*
在数据库中根据memoryId删除记录
*/
}
}
2.聊天方法改写
在原来的ChatConfig中改写方法assistantUniqueDataBase,上篇文章中的assistantUnique就不要了,主要是chatMemoryProvider,增加了持久化功能
@Bean
public AssistantUnique assistantUniqueDataBase(
ChatModel chatModel, StreamingChatModel streamingChatModel) {
ChatMemoryDatabaseConfig dbStore = new ChatMemoryDatabaseConfig();
ChatMemoryProvider chatMemoryProvider =
memoryId ->
MessageWindowChatMemory.builder()
.maxMessages(20)
.id(memoryId)
.chatMemoryStore(dbStore)
.build();
AssistantUnique assistantUnique =
AiServices.builder(AssistantUnique.class)
.chatModel(chatModel)
.streamingChatModel(streamingChatModel)
.chatMemoryProvider(chatMemoryProvider)
.build();
return assistantUnique;
}
3.测试接口
注入AssistantUnique ,接口不用变
@Autowired ChatConfig.AssistantUnique assistantUnique;
@GetMapping("/ai/generate_memoryid")
public String generate_memoryid_db(
@RequestParam(value = "message", defaultValue = "Tell me a joke") String message,
int memoryId) {
// 传进来memoryId,这里仅测试,业务中可以是sessionId,用户token等等
return assistantUnique.chat(memoryId, message);
}