【LangChain4J】聊天数据持久化——Redis

git地址

第一步集成Redis

推荐本地安装Redis使用docker

pom文件添加
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置文件添加
spring:
  data:
    redis:
      # 连接地址
      host: 127.0.0.1
      # 端口
      port: 6379
      # 数据库
      database: 0
      password: 密码
      # 连接超时
      connect-timeout: 5s
      # 读超时
      timeout: 5s

第二步集成Redis组件序列化配置

@Configuration
public class RedisConfig {
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }
}

第三步实现ChatMemoryStore接口

@Component
public class RedisChatMemoryStore implements ChatMemoryStore {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private static final String REDIS_KEY = "chat_persistence:";

    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
        String value = redisTemplate.opsForValue().get(REDIS_KEY + memoryId);
        return ChatMessageDeserializer.messagesFromJson(value);
    }

    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> list) {
        redisTemplate.opsForValue().set(REDIS_KEY + memoryId, ChatMessageSerializer.messagesToJson(list));
    }

    @Override
    public void deleteMessages(Object memoryId) {
        redisTemplate.delete(REDIS_KEY + memoryId);
    }
}

第四步定义Assistant接口并且装配

public interface ChatPersistenceAssistant {

    String chatPersistenceAssistant(@MemoryId Long userId, @UserMessage String prompt);

}

@Bean
    public ChatPersistenceAssistant chatPersistenceAssistant(ChatModel chatModel,RedisChatMemoryStore redisChatMemoryStore){
        return AiServices.builder(ChatPersistenceAssistant.class)
                .chatModel(chatModel)
                .chatMemoryProvider(memoryId -> {
                    return MessageWindowChatMemory
                            .builder()
                            .id(memoryId)
                            .maxMessages(100)
                            .chatMemoryStore(redisChatMemoryStore)
                            .build();
                })
                .build();
    }

第五步实现Controller并查看写入Redis

@RestController
public class ChatPersistenceController {

    @Autowired
    private ChatPersistenceAssistant chatPersistenceAssistant;


    @GetMapping("/chat/persistence")
    public String chatPersistence(){
        String result1 = chatPersistenceAssistant.chatPersistenceAssistant(1L, "我的名字叫安静的狮子");
        System.out.println(result1);
        String result2 = chatPersistenceAssistant.chatPersistenceAssistant(1L, "你叫什么名字");
        System.out.println(result2);
        String result3 = chatPersistenceAssistant.chatPersistenceAssistant(2L, "你的名字叫CPDD");
        System.out.println(result3);
        String result4 = chatPersistenceAssistant.chatPersistenceAssistant(2L, "你叫什么名字");
        System.out.println(result4);
        return "OK";
    }
}

image

posted @ 2025-12-21 22:54  爱吃鱼的大灰狼  阅读(15)  评论(0)    收藏  举报