Κοινή χρήση τεχνολογίας

3. Μνήμη συνομιλίας του LangChain4j

2024-07-12

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

Εισαγωγή στη μνήμη συνομιλίας

Μνήμη συνομιλίαςΟνομάζεται μνήμη συνομιλίας, η οποία αποθηκεύει τις ιστορικές συνομιλίες μεταξύ χρηστών και μεγάλων μοντέλων, έτσι ώστε τα μεγάλα μοντέλα να μπορούν να χρησιμοποιήσουν αυτές τις ιστορικές συνομιλίες για να κατανοήσουν τι είπαν πρόσφατα οι χρήστες και τι εννοούν.

Ωστόσο, εάν συνεχίσετε να αποθηκεύετε τις ιστορικές συνομιλίες στη Μνήμη συνομιλίας, θα απαιτεί όλο και περισσότερο χώρο αποθήκευσης, επομένως, το ChatMemory υποστηρίζει επίσης εκτεταμένες λειτουργίες όπως ο περιορισμός παραθύρου, ο μηχανισμός εξάλειψης, ο μηχανισμός εμμονής κ.λπ.


Το ChatMemory είναι μια διεπαφή που παρέχει δύο κλάσεις υλοποίησης από προεπιλογή:

  • MessageWindowChatMemory

Ανάλογα με το μέγεθος της συλλογής, τα παλιά μηνύματα εξαλείφονται.Ως συρόμενο παράθυρο, κρατήστεN Τα τελευταία νέα και έξωση παλιών ειδήσεων που δεν ταιριάζουν πλέον.Ωστόσο, δεδομένου ότι κάθε μήνυμα μπορεί να περιέχει διαφορετικό αριθμό διακριτικών,MessageWindowChatMemory Πολύ χρήσιμο για γρήγορη δημιουργία πρωτοτύπων.

  • TokenWindowChatMemory

Ανάλογα με το μέγεθος του διακριτικού, τα παλιά μηνύματα εξαλείφονται.Λειτουργεί επίσης ως συρόμενο παράθυρο, αλλά εστιάζει στη συγκράτησηN το πιο πρόσφατο διακριτικό και διώξτε τα παλιά μηνύματα όπως χρειάζεται. Η πληροφορία είναι αδιαίρετη. Εάν το μήνυμα δεν είναι κατάλληλο, θα αποβληθεί εντελώς. TokenWindowChatMemory απαιτεί αTokenizer για να υπολογίσετε το καθέναChatMessage token in .


Η διαφορά μεταξύ TokenWindowChatMemory και MessageWindowChatMemory

Το TokenWindowChatMemory είναι παρόμοιο με το MessageWindowChatMemory Η διαφορά είναι ότι ο τρόπος υπολογισμού της χωρητικότητας είναι διαφορετικός από το MessageWindowChatMemory.<ChatMessage> μέγεθος και το TokenWindowChatMemory θα χρησιμοποιήσει το καθορισμένο Tokenizer<ChatMessage> Ο αντίστοιχος αριθμός των Tokens υπολογίζεται και, στη συνέχεια, συγκρίνεται με το σύνολο maxTokens, εάν ο αριθμός υπερβαίνει τα maxTokens, θα εξαλειφθεί επίσης και το παλαιότερο μήνυμα συνομιλίας.

Το Tokenizer είναι μια διεπαφή Η κλάση υλοποίησης OpenAiTokenizer χρησιμοποιείται για να εκτιμήσει πόσα Tokens αντιστοιχούν σε ένα ChatMessage με βάση τον αριθμό των Tokens που χρησιμοποιούνται Το κόστος είναι ευαίσθητο Το TokenWindowChatMemory χρησιμοποιείται για τον έλεγχο του συνολικού αριθμού των Tokens που χρησιμοποιούνται σε μια περίοδο λειτουργίας.

Και οι δύο κλάσεις υλοποίησης έχουν μια ιδιότητα ChatMemoryStore στο εσωτερικό του. Με την πάροδο του χρόνου, θα προστεθούν εκ των υστέρων υλοποιήσεις για δημοφιλή καταστήματα όπως βάσεις δεδομένων SQL, καταστήματα εγγράφων κ.λπ.Εν τω μεταξύ, μπορείτε να εφαρμόσετε αυτήν τη διεπαφή για να συνδεθείτε σε οποιοδήποτε χώρο αποθήκευσης της επιλογής σας


Πρακτική υπόθεσης

Περίπτωση 1: Δημιουργήστε μια δημοφιλή κύρια ονομασία βασισμένη στο 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. }
Περίπτωση 2: Προσαρμόστε το ChatMemoryStore για να παραμείνει το ChatMessage στο δίσκο

Εισαγάγετε τις εξαρτήσεις maven

  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>

 Προσαρμόστε το ChatMemoryStore για να επιτύχετε μόνιμο χώρο αποθήκευσης

  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. }

  δοκιμή κώδικα

  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. }
Περίπτωση 3: Αποθηκεύστε τα αρχεία συνομιλίας ξεχωριστά για κάθε χρήστη
  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. }