langchain4j实战:AiServices(chatMemory、chatMemoryProvider)的使用

本节主要介绍聊天对话内存ChatMemory,由于语言模型不保留对话的状态,因此有必要在与语言模型的每次交互中提供所有先前的消息。有助于跟踪对话并确保消息适合语言模型的上下文窗口。

以下示例与大模型交互中,先告诉他“你好,我是小橘”,然后再问他“我叫什么”,看他的问答完全不知道我的名字,明明前面已经告诉大模型了,为啥还不知道呢,这是因为每次执行model.generate方法与大模型交互,相当于打开了一个新的对话窗口,对于大模型来说,没法直接关联到上下文信息。

public static void main(String[] args) {
    ChatLanguageModel model = OpenAiChatModel.builder().baseUrl(OPEN_AI_BASE_URL)
            .apiKey(OPEN_AI_API_KEY).build();
    String result1 = model.generate("你好,我是小橘");
    String result2 = model.generate("我叫什么");
    System.out.println(result1);
    System.out.println("------------------------------");
    System.out.println(result2);
}
    
输出
E:\software\jdk-17.0.11\bin\java.exe.....
你好,小橘!有什么可以帮助你的吗?
------------------------------
您的名字我不知道,可以告诉我您的名字吗?

chatMemory使用

看到下面对话中,大模型可以关联到前后对话信息,能够正确回答我的名字了。主要用到了AiServices的chatMemory聊天上下文内存,和LLM大模型交互的所有信息都会缓存在该内存中。MessageWindowChatMemory.withMaxMessages(10):表示该内存最多缓存10条数据;如果超过10条,则会删除前面存储的最久远的数据。

public static void main(String[] args) {
    ChatLanguageModel model = OpenAiChatModel.builder().baseUrl(OPEN_AI_BASE_URL)
            .apiKey(OPEN_AI_API_KEY).build();
    UserService userService = AiServices.builder(UserService.class)
            .chatLanguageModel(model)
            .chatMemory(MessageWindowChatMemory.withMaxMessages(10))
            .build();
    String result1 = userService.sendMessage("你好,我是小橘");
    String result2 = userService.sendMessage("我叫什么");
    System.out.println(result1);
    System.out.println("------------------------------");
    System.out.println(result2);
}

输出
E:\software\jdk-17.0.11\bin\java.exe.....
你好小橘,有什么可以帮助你的吗?
------------------------------
您的名字是"小橘"。有什么其他问题我可以帮您解答吗?

chatMemoryProvider使用

上面chatMemory示例中,只适合单个聊天对话,多个用户和大模型对话时就不适用了,多用户对话则可以使用chatMemoryProvider,通过用户标识userId来区分,然后为每个用户创建各自的ChatMemory对象,避免出现对话混淆。
底层通过AiServiceContext中Map<Object, ChatMemory> chatMemories来存储的,其中key是通过@MemoryId注解的不同用户标识,value为用户对应的ChatMemory对象。

public interface UserService {
    String sendMessage(String desc);

    String sendMessage(@MemoryId String userId, @UserMessage String desc);

}
    
public static void main(String[] args) {
    ChatLanguageModel model = OpenAiChatModel.builder().baseUrl(OPEN_AI_BASE_URL)
            .apiKey(OPEN_AI_API_KEY).build();
    UserService userService = AiServices.builder(UserService.class)
            .chatLanguageModel(model)
            .chatMemoryProvider(userId -> MessageWindowChatMemory.withMaxMessages(10))
            .build();
    String result1 = userService.sendMessage("1", "你好,我是小橘");
    String result2 = userService.sendMessage("1", "我叫什么");
    String result3 = userService.sendMessage("2", "我叫什么");
    System.out.println(result1);
    System.out.println("------------------------------");
    System.out.println(result2);
    System.out.println("------------------------------");
    System.out.println(result3);
}

输出
E:\software\jdk-17.0.11\bin\java.exe.....
你好小橘,很高兴认识你。有什么需要帮忙的吗?
------------------------------
你叫小橘。很开心和你交流。有什么问题或者想聊的吗?
------------------------------
对不起,我不知道您叫什么。您可以告诉我您的名字吗? 我很乐意称呼您。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值