langchain4j集成QWen、Redis聊天记忆持久化

langchain4j实现聊天记忆默认是基于进程内存的方式,InMemoryChatMemoryStore是具体的实现了,是将聊天记录到一个map中,如果用户大的话,会造成内存溢出以及数据安全问题。位了解决这个问题 langchain4提供了ChatMemoryStore接口,让开发者可以灵活的选择存储策略,常用的可以使用mysql、redis、mongodb等,本文以redis为例,集成百炼平台通义千问实现大模型聊天记忆持久化。

一、引入依赖

具体详情可参考官网

复制代码
https://docs.langchain4j.dev/integrations/language-models/dashscope
XML 复制代码
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '3.4.0'
    // langchain4j AiService整合spring boot
    implementation group: 'dev.langchain4j', name: 'langchain4j-spring-boot-starter', version: '1.0.0-beta4'
    // langchain4j整合千问dashscope
    implementation group: 'dev.langchain4j', name: 'langchain4j-community-dashscope-spring-boot-starter', version: '1.0.0-beta4'

yaml配置

bash 复制代码
langchain4j:
  ## https://docs.langchain4j.dev/integrations/language-models/dashscope
  community:
    dashscope:
      chat-model:
        api-key: 百炼平台申请
        model-name: qwen-plus


spring:
  data:
    redis:
      host: server200
      port: 6379
      database: 3

二、持久化配置

官网参考地址https://docs.langchain4j.dev/tutorials/chat-memory/

java 复制代码
@Configuration
public class ChatMemoryConf {

    /**
     * 聊天记录持久化存储到redis中
     * @param redisTemplate
     * @return
     */
    public ChatMemoryStore chatMemoryStore(RedisTemplate<String,String>  redisTemplate){
        return  new ChatMemoryStore(){
            @Override
            public List<ChatMessage> getMessages(Object memoryId) {
                String value = redisTemplate.opsForValue().get("chat:" + memoryId.toString());
                if(value == null || value.isEmpty()){
                    return List.of();
                }
                return ChatMessageDeserializer.messagesFromJson(value);
            }

            @Override
            public void updateMessages(Object memoryId, List<ChatMessage> list) {
                String messages = ChatMessageSerializer.messagesToJson(list);
                redisTemplate.opsForValue().set("chat:" + memoryId.toString(), messages);
            }

            @Override
            public void deleteMessages(Object memoryId) {
                redisTemplate.delete("chat:" + memoryId.toString());
            }
        };
    }


    @Bean
    public ChatMemoryProvider chatMemoryProvider(RedisTemplate<String,String>  redisTemplate){
        return memoryId -> MessageWindowChatMemory.
                        builder().
                        maxMessages(10).
                        id(memoryId).
                        chatMemoryStore(chatMemoryStore(redisTemplate)).
                        build();
    }

}

三、创建AiService代理

AiService的具体功能,可以看官网(https://docs.langchain4j.dev/tutorials/ai-services),上面有很详细的解释和示例

java 复制代码
@AiService
public interface DashScopeAssistant {

    @SystemMessage("Answer using slang")
    String chat(@MemoryId String  chatId, @UserMessage  String userMessage);

}
java 复制代码
@Service
public class DashScopeChatMemoryService {

    private final static Logger LOGGER = LoggerFactory.getLogger(DashScopeChatMemoryService.class);

    private final DashScopeAssistant dashScopeAssistant;

    @Autowired
    public DashScopeChatMemoryService(QwenChatModel qwenChatModel,ChatMemoryProvider chatMemoryProvider) {
        dashScopeAssistant =  AiServices
                .builder(DashScopeAssistant.class)
                .chatMemoryProvider(chatMemoryProvider)
                .chatModel(qwenChatModel)
                .build();
    }

    public String persistentChat(String chatId, String userMessage){
        String chat = dashScopeAssistant.chat(chatId, userMessage);
        LOGGER.info("persistent chat output : {}" ,chat);
        return chat;
    }
}

四、测试持久化

java 复制代码
chatMemoryService.persistentChat("101", "我是赵光义");
chatMemoryService.persistentChat("101", "我是北宋的第二位皇帝,在高粱河被辽国打败了");
chatMemoryService.persistentChat("101", "你知道为为什么叫车神吗?");

通过断点观察,数据已经成功存入redis

相关推荐
爱丽_16 分钟前
Redis 分布式锁:SET NX、过期时间、续租、可重入、Redlock 与坑
数据库·redis·分布式
PacosonSWJTU1 小时前
(转)mybatis拦截器
数据库·redis·mybatis
曲幽2 小时前
FastAPI + Celery 实战:异步任务的坑与解法,我帮你踩了一遍
redis·python·fastapi·web·async·celery·background·task·queue
I'm Jie2 小时前
FastAPI 集成 Redis 开发手册
redis·fastapi
Barkamin2 小时前
LangChain简单介绍
langchain
keyborad pianist3 小时前
一篇文章学会Redis
数据库·redis·缓存
ok_hahaha3 小时前
java从头开始-黑马点评-分布式锁-redis实现基础版
java·redis·分布式
敢敢のwings3 小时前
智元 D1 强化学习sim-to-real系列 | Robot Lab 基于 Isaac Lab 的机器人强化学习使用(四)
数据库·redis·机器人
dovens4 小时前
GO 快速升级Go版本
开发语言·redis·golang
XDHCOM5 小时前
TP5框架Redis分布式缓存实战,解决高并发场景下的数据一致性问题
redis·分布式·缓存