【Springboot+LangChain4j】实现对话记忆的持久化功能

发布于:2025-06-12 ⋅ 阅读:(24) ⋅ 点赞:(0)

前提:前文实现了对话的记忆功能以及隔离功能,详见

【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);
}