当前位置:   article > 正文

LangChain4j AiServices 实现聊天记忆_langchain4j chatglm

langchain4j chatglm

ChatMemory

上次说到ChatMessage手动的维护和管理是比较麻烦的,因此LangChain4j提出了ChatMemory的概念。它的本质是ChatMessage的容器。

可以看下ChatMemory这个接口的方法,它内部封装了一个List的ChatMessage。

要注意的是:

  • LLM的上下文窗口都是有一定限制的,针对不同的LLM可能限制的令牌数量有所不同,这意味着他们在任何给定时间可以处理的令牌数量都有上限,这可能会导致整个窗口对话超出限制。
  • 每个令牌都有成本,所以每次调用LLM的成本会逐渐增加。

通过ChatMemory可以结合ApiServices组件可以实现聊天记忆功能。

以下是官方提供的几个示例:

简单的聊天记忆

  1. package com.chatglm.demo;
  2. import dev.langchain4j.memory.ChatMemory;
  3. import dev.langchain4j.memory.chat.MessageWindowChatMemory;
  4. import dev.langchain4j.model.openai.OpenAiChatModel;
  5. import dev.langchain4j.service.AiServices;
  6. /**
  7. * 聊天记忆
  8. */
  9. public class ServiceWithMemoryExample {
  10. /**
  11. * 定义一个带有单个方法的接口
  12. */
  13. interface Assistant {
  14. String chat(String message);
  15. }
  16. public static void main(String[] args) {
  17. // 创建ChatLanguageModel组件作为AiServices的基础组件
  18. OpenAiChatModel openAiChatModel = OpenAiChatModel.withApiKey("demo");
  19. // 创建MessageWindowChatMemory充当滑动窗口
  20. ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
  21. // 利用Apiservices组件实现Assistant接口并接入chatMemory
  22. Assistant assistant = AiServices.builder(Assistant.class)
  23. .chatLanguageModel(openAiChatModel)
  24. .chatMemory(chatMemory)
  25. .build();
  26. String answer = assistant.chat("你好,我叫小A.");
  27. System.out.println(answer);
  28. String answerWithName = assistant.chat("我叫什么名字?");
  29. System.out.println(answerWithName);
  30. }
  31. }

AI回答:

多用户聊天记忆

  1. package com.chatglm.demo;
  2. import dev.langchain4j.memory.chat.MessageWindowChatMemory;
  3. import dev.langchain4j.model.openai.OpenAiChatModel;
  4. import dev.langchain4j.service.AiServices;
  5. import dev.langchain4j.service.MemoryId;
  6. import dev.langchain4j.service.UserMessage;
  7. /**
  8. * 每个用户单独的聊天内存
  9. */
  10. public class ServiceWithMemoryForEachUserExample {
  11. interface Assistant {
  12. String chat(@MemoryId int memoryId, @UserMessage String userMessage);
  13. }
  14. public static void main(String[] args) {
  15. Assistant assistant = AiServices.builder(Assistant.class)
  16. .chatLanguageModel(OpenAiChatModel.withApiKey(""))
  17. .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(10))
  18. .build();
  19. System.out.println(assistant.chat(1, "Hello, my name is Klaus"));
  20. // Hi Klaus! How can I assist you today?
  21. System.out.println(assistant.chat(2, "Hello, my name is Francine"));
  22. // Hello Francine! How can I assist you today?
  23. System.out.println(assistant.chat(1, "What is my name?"));
  24. // Your name is Klaus.
  25. System.out.println(assistant.chat(2, "What is my name?"));
  26. // Your name is Francine.
  27. }
  28. }

聊天记忆持久化

依赖:

  1. <dependency>
  2. <groupId>org.mapdb</groupId>
  3. <artifactId>mapdb</artifactId>
  4. <version>3.0.9</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>org.jetbrains.kotlin</groupId>
  8. <artifactId>kotlin-stdlib</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
  1. package com.chatglm.demo;
  2. import dev.langchain4j.data.message.ChatMessage;
  3. import dev.langchain4j.memory.ChatMemory;
  4. import dev.langchain4j.memory.chat.MessageWindowChatMemory;
  5. import dev.langchain4j.model.openai.OpenAiChatModel;
  6. import dev.langchain4j.service.AiServices;
  7. import dev.langchain4j.store.memory.chat.ChatMemoryStore;
  8. import org.mapdb.DB;
  9. import org.mapdb.DBMaker;
  10. import java.util.List;
  11. import java.util.Map;
  12. import static dev.langchain4j.data.message.ChatMessageDeserializer.messagesFromJson;
  13. import static dev.langchain4j.data.message.ChatMessageSerializer.messagesToJson;
  14. import static org.mapdb.Serializer.STRING;
  15. /**
  16. * 持久的聊天记忆
  17. */
  18. public class ServiceWithPersistentMemoryExample {
  19. interface Assistant {
  20. String chat(String message);
  21. }
  22. public static void main(String[] args) {
  23. ChatMemory chatMemory = MessageWindowChatMemory.builder()
  24. .maxMessages(10)
  25. .chatMemoryStore(new PersistentChatMemoryStore())
  26. .build();
  27. Assistant assistant = AiServices.builder(Assistant.class)
  28. .chatLanguageModel(OpenAiChatModel.withApiKey("demo"))
  29. .chatMemory(chatMemory)
  30. .build();
  31. String answer = assistant.chat("你是什么智能");
  32. System.out.println(answer); // Hello Klaus! How can I assist you today?
  33. // Now, comment out the two lines above, uncomment the two lines below, and run again.
  34. // String answerWithName = assistant.chat("What is my name?");
  35. // System.out.println(answerWithName); // Your name is Klaus.
  36. }
  37. // You can create your own implementation of ChatMemoryStore and store chat memory whenever you'd like
  38. static class PersistentChatMemoryStore implements ChatMemoryStore {
  39. private final DB db = DBMaker.fileDB("chat-memory.db").transactionEnable().make();
  40. private final Map<String, String> map = db.hashMap("messages", STRING, STRING).createOrOpen();
  41. @Override
  42. public List<ChatMessage> getMessages(Object memoryId) {
  43. String json = map.get((String) memoryId);
  44. return messagesFromJson(json);
  45. }
  46. @Override
  47. public void updateMessages(Object memoryId, List<ChatMessage> messages) {
  48. String json = messagesToJson(messages);
  49. map.put((String) memoryId, json);
  50. db.commit();
  51. }
  52. @Override
  53. public void deleteMessages(Object memoryId) {
  54. map.remove((String) memoryId);
  55. db.commit();
  56. }
  57. }
  58. }

多用户聊天记忆持久化

  1. package com.chatglm.demo;
  2. import dev.langchain4j.data.message.ChatMessage;
  3. import dev.langchain4j.memory.chat.ChatMemoryProvider;
  4. import dev.langchain4j.memory.chat.MessageWindowChatMemory;
  5. import dev.langchain4j.model.openai.OpenAiChatModel;
  6. import dev.langchain4j.service.AiServices;
  7. import dev.langchain4j.service.MemoryId;
  8. import dev.langchain4j.service.UserMessage;
  9. import dev.langchain4j.store.memory.chat.ChatMemoryStore;
  10. import org.mapdb.DB;
  11. import org.mapdb.DBMaker;
  12. import java.util.List;
  13. import java.util.Map;
  14. import static dev.langchain4j.data.message.ChatMessageDeserializer.messagesFromJson;
  15. import static dev.langchain4j.data.message.ChatMessageSerializer.messagesToJson;
  16. import static org.mapdb.Serializer.INTEGER;
  17. import static org.mapdb.Serializer.STRING;
  18. /**
  19. * 每个用户持久的聊天记忆
  20. */
  21. public class ServiceWithPersistentMemoryForEachUserExample {
  22. interface Assistant {
  23. String chat(@MemoryId int memoryId, @UserMessage String userMessage);
  24. }
  25. public static void main(String[] args) {
  26. PersistentChatMemoryStore store = new PersistentChatMemoryStore();
  27. ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder()
  28. .id(memoryId)
  29. .maxMessages(10)
  30. .chatMemoryStore(store)
  31. .build();
  32. Assistant assistant = AiServices.builder(Assistant.class)
  33. .chatLanguageModel(OpenAiChatModel.withApiKey("demo"))
  34. .chatMemoryProvider(chatMemoryProvider)
  35. .build();
  36. System.out.println(assistant.chat(1, "Hello, my name is Klaus"));
  37. System.out.println(assistant.chat(2, "Hi, my name is Francine"));
  38. // Now, comment out the two lines above, uncomment the two lines below, and run again.
  39. // System.out.println(assistant.chat(1, "What is my name?"));
  40. // System.out.println(assistant.chat(2, "What is my name?"));
  41. }
  42. // You can create your own implementation of ChatMemoryStore and store chat memory whenever you'd like
  43. static class PersistentChatMemoryStore implements ChatMemoryStore {
  44. private final DB db = DBMaker.fileDB("multi-user-chat-memory.db").transactionEnable().make();
  45. private final Map<Integer, String> map = db.hashMap("messages", INTEGER, STRING).createOrOpen();
  46. @Override
  47. public List<ChatMessage> getMessages(Object memoryId) {
  48. String json = map.get((int) memoryId);
  49. return messagesFromJson(json);
  50. }
  51. @Override
  52. public void updateMessages(Object memoryId, List<ChatMessage> messages) {
  53. String json = messagesToJson(messages);
  54. map.put((int) memoryId, json);
  55. db.commit();
  56. }
  57. @Override
  58. public void deleteMessages(Object memoryId) {
  59. map.remove((int) memoryId);
  60. db.commit();
  61. }
  62. }
  63. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/787056
推荐阅读
相关标签
  

闽ICP备14008679号