2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Chat-SpeicherEs wird als Chat-Speicher bezeichnet, der die historischen Gespräche zwischen Benutzern und großen Modellen speichert, sodass die großen Modelle diese historischen Gespräche nutzen können, um zu verstehen, was die Benutzer kürzlich gesagt haben und was sie meinen.
Wenn Sie jedoch weiterhin historische Konversationen im Chat Memory speichern, wird immer mehr Speicherplatz benötigt. Daher unterstützt ChatMemory auch erweiterte Funktionen wie Fensterbegrenzung, Eliminierungsmechanismus, Persistenzmechanismus usw.
Je nach Umfang der Sammlung werden alte Nachrichten gelöscht.B. ein Schiebefenster, haltenN
die neuesten Nachrichten und entfernen Sie alte Nachrichten, die nicht mehr passen.Da jedoch jede Nachricht eine unterschiedliche Anzahl an Token enthalten kann,MessageWindowChatMemory
Sehr nützlich für Rapid Prototyping.
Je nach Größe des Tokens werden alte Nachrichten gelöscht.Es läuft auch als Schiebefenster, konzentriert sich aber auf das BeibehaltenN
Das neueste Token und alte Nachrichten nach Bedarf entfernen. Informationen sind untrennbar miteinander verbunden. Wenn die Nachricht nicht geeignet ist, wird sie vollständig entfernt. TokenWindowChatMemory erfordert aTokenizer
jeweils zu berechnenChatMessage
Token in .
TokenWindowChatMemory ähnelt MessageWindowChatMemory. Der Unterschied besteht darin, dass MessageWindowChatMemory direkt eine andere Methode zur Berechnung der Kapazität verwendet.<ChatMessage> Größe, und TokenWindowChatMemory verwendet den angegebenen Tokenizer, um<ChatMessage> Die entsprechende Anzahl an Token wird geschätzt und dann mit den festgelegten maxTokens verglichen. Wenn die Anzahl maxTokens überschreitet, wird sie ebenfalls eliminiert, und die älteste ChatMessage wird ebenfalls eliminiert.
Tokenizer ist eine Schnittstelle, die standardmäßig bereitgestellt wird. Sie wird verwendet, um anhand der Anzahl der verwendeten Token abzuschätzen, wie viele Tokens einer ChatMessage-API entsprechen Die Kosten sind empfindlich. TokenWindowChatMemory wird verwendet, um die Gesamtzahl der in einer Sitzung verwendeten Token zu steuern.
Beide Implementierungsklassen verfügen über ein ChatMemoryStore-Attribut. ChatMemoryStore ist ebenfalls eine Schnittstelle. Es gibt standardmäßig eine InMemoryChatMemoryStore-Implementierungsklasse. Im Laufe der Zeit werden vorkonfigurierte Implementierungen für beliebte Speicher wie SQL-Datenbanken, Dokumentenspeicher usw. hinzugefügt.Mittlerweile können Sie diese Schnittstelle implementieren, um eine Verbindung zu jedem Speicher Ihrer Wahl herzustellen
- public class NameDemo {
-
- interface NamingMaster {
- String talk(String desc);
- }
- public static void main(String[] args) {
- ChatLanguageModel chatModel = ZhipuAiChatModel.builder()
- .apiKey("智普apikey")
- .build();
- ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
-
- NamingMaster namingMaster = AiServices.builder(NamingMaster.class)
- .chatLanguageModel(chatModel)
- .chatMemory(chatMemory)
- .build();
-
- System.out.println(namingMaster.talk("我姓李,帮我取一个好听的女孩名字,就一个你觉得最好的"));
- System.out.println("---");
- System.out.println(namingMaster.talk("换一个"));
- }
- }
Führen Sie Maven-Abhängigkeiten ein
- <dependency>
- <groupId>org.mapdb</groupId>
- <artifactId>mapdb</artifactId>
- <version>3.0.9</version>
- <exclusions>
- <exclusion>
- <groupId>org.jetbrains.kotlin</groupId>
- <artifactId>kotlin-stdlib</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
Passen Sie ChatMemoryStore an, um dauerhaften Speicher zu erreichen
- public class PersistentChatMemoryStore implements ChatMemoryStore {
-
- private final DB db = DBMaker.fileDB("chat-memory.db").transactionEnable().make();
- private final Map<String, String> map = db.hashMap("messages", Serializer.STRING, Serializer.STRING).createOrOpen();
-
- @Override
- public List<ChatMessage> getMessages(Object memoryId) {
- String json = map.get((String) memoryId);
- return ChatMessageDeserializer.messagesFromJson(json);
- }
-
- @Override
- public void updateMessages(Object memoryId, List<ChatMessage> messages) {
- String json = ChatMessageSerializer.messagesToJson(messages);
- map.put((String) memoryId, json);
- db.commit();
- }
-
- @Override
- public void deleteMessages(Object memoryId) {
- map.remove((String) memoryId);
- db.commit();
- }
- }
Code-Tests
- public class PersistentDemo {
-
- interface NamingMaster {
- String talk(String desc);
- }
- public static void main(String[] args) {
- ChatLanguageModel chatModel = ZhipuAiChatModel.builder()
- .apiKey("智普apikey")
- .build();
-
- ChatMemory chatMemory = MessageWindowChatMemory.builder()
- .chatMemoryStore(new PersistentChatMemoryStore())
- .maxMessages(10)
- .build();
-
- NamingMaster namingMaster = AiServices.builder(NamingMaster.class)
- .chatLanguageModel(chatModel)
- .chatMemory(chatMemory)
- .build();
-
- System.out.println(namingMaster.talk("我姓李,帮我取一个好听的女孩名字,就一个你觉得最好的"));
- System.out.println("---");
- System.out.println(namingMaster.talk("换一个"));
- }
- }
- public class NameDemo {
-
- interface NamingMaster {
- String talk(@MemoryId Integer userId, @UserMessage String desc);
- }
-
- public static void main(String[] args) {
- ChatLanguageModel chatModel = ZhipuAiChatModel.builder()
- .apiKey("智普apikey")
- .build();
-
- NamingMaster namingMaster = AiServices.builder(NamingMaster.class)
- .chatLanguageModel(chatModel)
- .chatMemoryProvider(userId -> MessageWindowChatMemory.withMaxMessages(10))
- .build();
-
- System.out.println(namingMaster.talk(1, "我姓李,帮我取一个好听的女孩名字,就一个你觉得最好的"));
- System.out.println("---");
- System.out.println(namingMaster.talk(2, "我姓赵,帮我取一个好听的男孩名字,就一个你觉得最好的"));
- System.out.println("---");
- System.out.println(namingMaster.talk(1, "换一个"));
- }
- }