Technology sharing

3. Chat Memoriae de LangChain4j

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Introductio ad Chat Memoria

Curabitur MemoriaCurabitur memoria dicitur, quae historica colloquia inter utentes et magna exempla reponit, ut magna exemplaria his colloquiis historicis uti possint ad intellegendum quid usores nuper dixerunt et quid significent.

Attamen, si historica colloquia in Chat Memoria servaveris, magis ac magis spatium repono.


ChatMemory est interface quae duas classes ex defalta praebet:

  • MessageWindowChatMemory

Secundum magnitudinem collectionis epistulae veteres eliminatae sunt.Sicut fenestra lapsus, servaN Tardus novi et evictus vetus nuntia non amplius convenit.Sed cum unusquisque nuntius alium numerum signorum continere possit;MessageWindowChatMemory Perutile ad celeri prototyping.

  • TokenWindowChatMemory

Secundum magnitudinem arrhae, nuntii veteris eliminantur.Etiam decurrit ut fenestra lapsus sed retinetN novissimum indicium et evictionis veteris nuntii sicut opus est. Indicium indivisibile est. Si nuntius idoneus non fuerit, penitus ejicietur. TokenWindowChatMemory requirit aTokenizer ratio cuiusqueChatMessage indicium in.


Discrimen inter TokenWindowChatMemory et MessageWindowChatMemory

TokenWindowChatMemory simile est cum MessageWindowChatMemory. Differentia est quia modus ad facultatem computandi differt.<ChatMessage> magnitudine, et TokenWindowChatMemory utetur ad certum Tokenizer<ChatMessage> Numerus signarum respondentium aestimatur, et tunc cum statuto maxTokens comparatus est.

Tokenizer interfacies est. The OpenAiTokenizer implementation class is provided by default Sumptus sensibilis est.

Utraeque exsequendae classes habent, ChatMemoryStore intus attributum. ChatMemoryStore etiam interfacies est. Subinde, ex-of-the-arcae additae sunt pro thesauris popularibus sicut SQL databases, documentorum thesaurorum, etc.Interim hoc interfacetum efficere potes ut cuilibet tuae electionis repono coniungi


Causa praxis

Causa I: crea popularis nomen domini secundum ChatMemory
  1. public class NameDemo {
  2. interface NamingMaster {
  3. String talk(String desc);
  4. }
  5. public static void main(String[] args) {
  6. ChatLanguageModel chatModel = ZhipuAiChatModel.builder()
  7. .apiKey("智普apikey")
  8. .build();
  9. ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
  10. NamingMaster namingMaster = AiServices.builder(NamingMaster.class)
  11. .chatLanguageModel(chatModel)
  12. .chatMemory(chatMemory)
  13. .build();
  14. System.out.println(namingMaster.talk("我姓李,帮我取一个好听的女孩名字,就一个你觉得最好的"));
  15. System.out.println("---");
  16. System.out.println(namingMaster.talk("换一个"));
  17. }
  18. }
Causam II: Mos ChatMemoryStore perseverare ChatMessage ad orbis

Maven inducere clientelas

  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>

 Mos ChatMemoryStore ad consequi pertinax repono

  1. public class PersistentChatMemoryStore implements ChatMemoryStore {
  2. private final DB db = DBMaker.fileDB("chat-memory.db").transactionEnable().make();
  3. private final Map<String, String> map = db.hashMap("messages", Serializer.STRING, Serializer.STRING).createOrOpen();
  4. @Override
  5. public List<ChatMessage> getMessages(Object memoryId) {
  6. String json = map.get((String) memoryId);
  7. return ChatMessageDeserializer.messagesFromJson(json);
  8. }
  9. @Override
  10. public void updateMessages(Object memoryId, List<ChatMessage> messages) {
  11. String json = ChatMessageSerializer.messagesToJson(messages);
  12. map.put((String) memoryId, json);
  13. db.commit();
  14. }
  15. @Override
  16. public void deleteMessages(Object memoryId) {
  17. map.remove((String) memoryId);
  18. db.commit();
  19. }
  20. }

  codice temptationis

  1. public class PersistentDemo {
  2. interface NamingMaster {
  3. String talk(String desc);
  4. }
  5. public static void main(String[] args) {
  6. ChatLanguageModel chatModel = ZhipuAiChatModel.builder()
  7. .apiKey("智普apikey")
  8. .build();
  9. ChatMemory chatMemory = MessageWindowChatMemory.builder()
  10. .chatMemoryStore(new PersistentChatMemoryStore())
  11. .maxMessages(10)
  12. .build();
  13. NamingMaster namingMaster = AiServices.builder(NamingMaster.class)
  14. .chatLanguageModel(chatModel)
  15. .chatMemory(chatMemory)
  16. .build();
  17. System.out.println(namingMaster.talk("我姓李,帮我取一个好听的女孩名字,就一个你觉得最好的"));
  18. System.out.println("---");
  19. System.out.println(namingMaster.talk("换一个"));
  20. }
  21. }
Causam III: Store chat per singula user records
  1. public class NameDemo {
  2. interface NamingMaster {
  3. String talk(@MemoryId Integer userId, @UserMessage String desc);
  4. }
  5. public static void main(String[] args) {
  6. ChatLanguageModel chatModel = ZhipuAiChatModel.builder()
  7. .apiKey("智普apikey")
  8. .build();
  9. NamingMaster namingMaster = AiServices.builder(NamingMaster.class)
  10. .chatLanguageModel(chatModel)
  11. .chatMemoryProvider(userId -> MessageWindowChatMemory.withMaxMessages(10))
  12. .build();
  13. System.out.println(namingMaster.talk(1, "我姓李,帮我取一个好听的女孩名字,就一个你觉得最好的"));
  14. System.out.println("---");
  15. System.out.println(namingMaster.talk(2, "我姓赵,帮我取一个好听的男孩名字,就一个你觉得最好的"));
  16. System.out.println("---");
  17. System.out.println(namingMaster.talk(1, "换一个"));
  18. }
  19. }