本节主要介绍聊天对话内存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.....
你好小橘,很高兴认识你。有什么需要帮忙的吗?
------------------------------
你叫小橘。很开心和你交流。有什么问题或者想聊的吗?
------------------------------
对不起,我不知道您叫什么。您可以告诉我您的名字吗? 我很乐意称呼您。