2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Mémoire de discussionC'est ce qu'on appelle la mémoire de discussion, qui stocke les conversations historiques entre les utilisateurs et les grands modèles, afin que les grands modèles puissent utiliser ces conversations historiques pour comprendre ce que les utilisateurs ont récemment dit et ce qu'ils veulent dire.
Cependant, si vous continuez à stocker les conversations historiques dans Chat Memory, cela nécessitera de plus en plus d'espace de stockage. Par conséquent, ChatMemory prend également en charge des fonctions étendues telles que la limitation de fenêtre, le mécanisme d'élimination, le mécanisme de persistance, etc.
Selon la taille de la collection, les anciens messages sont éliminés.En tant que fenêtre coulissante, gardezN
Les dernières nouvelles et expulsez les anciennes nouvelles qui ne correspondent plus.Cependant, comme chaque message peut contenir un nombre différent de jetons,MessageWindowChatMemory
Très utile pour le prototypage rapide.
Selon la taille du token, les anciens messages sont éliminés.Il fonctionne également comme une fenêtre coulissante mais se concentre sur la rétentionN
le dernier jeton et expulsez les anciens messages si nécessaire. Les informations sont indivisibles. Si le message ne convient pas, il sera complètement expulsé. TokenWindowChatMemory nécessite unTokenizer
calculer chacunChatMessage
jeton dans .
TokenWindowChatMemory est similaire à MessageWindowChatMemory. La différence est que la façon de calculer la capacité est différente. MessageWindowChatMemory prend directement la liste.<ChatMessage> taille, et TokenWindowChatMemory utilisera le Tokenizer spécifié pour<ChatMessage> Le nombre correspondant de Tokens est estimé, puis comparé au maxTokens défini. Si le nombre dépasse maxTokens, il sera également éliminé, et le ChatMessage le plus ancien sera également éliminé.
Tokenizer est une interface. La classe d'implémentation OpenAiTokenizer est fournie par défaut. Elle est utilisée pour estimer le nombre de jetons correspondant à un ChatMessage. Les API de nombreux grands modèles sont facturés en fonction du nombre de jetons utilisés. le coût est sensible. TokenWindowChatMemory est utilisé pour contrôler le nombre total de jetons utilisés dans une session.
Les deux classes d'implémentation ont un attribut ChatMemoryStore à l'intérieur. ChatMemoryStore est également une interface par défaut. Au fil du temps, des implémentations prêtes à l'emploi seront ajoutées pour les magasins populaires tels que les bases de données SQL, les magasins de documents, etc.En attendant, vous pouvez implémenter cette interface pour vous connecter à n'importe quel stockage de votre choix
- 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("换一个"));
- }
- }
Introduire les dépendances Maven
- <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>
Personnalisez ChatMemoryStore pour obtenir un stockage persistant
- 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();
- }
- }
test de code
- 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, "换一个"));
- }
- }