प्रौद्योगिकी साझेदारी

3. LangChain4j की चैट स्मृति

2024-07-12

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

Chat Memory का परिचय

चट स्मृतिइदं चॅट् मेमोरी इति कथ्यते, यत् उपयोक्तृणां बृहत् मॉडल् च मध्ये ऐतिहासिकं वार्तालापं संगृह्णाति, येन बृहत् मॉडल् एतेषां ऐतिहासिकवार्तालापानां उपयोगं कृत्वा उपयोक्तारः अद्यतने किं उक्तवन्तः, तेषां किं अर्थं च अवगन्तुं शक्नुवन्ति

परन्तु यदि भवान् ऐतिहासिकवार्तालापं Chat Memory इत्यत्र संग्रहयति तर्हि तस्य अधिकाधिकं भण्डारणस्थानस्य आवश्यकता भविष्यति अतः ChatMemory इत्यनेन विण्डो सीमा, उन्मूलनतन्त्रम्, स्थायित्वतन्त्रम् इत्यादीनि विस्तारितानि कार्याणि अपि समर्थितानि सन्ति ।


ChatMemory इति एकं अन्तरफलकं यत् पूर्वनिर्धारितरूपेण द्वौ कार्यान्वयनवर्गौ प्रदाति:

  • सन्देशविण्डोचैटस्मृति

संग्रहस्य परिमाणानुसारं पुरातनसन्देशाः निराकृताः भवन्ति ।स्लाइडिंग् विण्डो इव, स्थापयन्तुN नवीनतमवार्ताः अपि च पुरातनवार्ताः निष्कासयन्तु ये पुनः न उपयुज्यन्ते।परन्तु प्रत्येकं सन्देशे भिन्नसङ्ख्यायां टोकन-सङ्ख्या भवितुम् अर्हति इति कारणतः ।MessageWindowChatMemory द्रुतप्रोटोटाइपिङ्ग् कृते अतीव उपयोगी।

  • टोकनविण्डोचैटस्मृति

टोकनस्य परिमाणानुसारं पुरातनसन्देशाः निराकृताः भवन्ति ।इदं स्लाइडिंग् विण्डो इव अपि चालयति परन्तु धारणं प्रति केन्द्रितं भवतिN नवीनतमं टोकनं आवश्यकतानुसारं पुरातनसन्देशान् निष्कासयन्तु। सूचना अविभाज्यम् अस्ति। यदि सन्देशः उपयुक्तः नास्ति तर्हि सः सम्पूर्णतया निष्कासितः भविष्यति। TokenWindowChatMemory इत्यस्य कृते कTokenizer प्रत्येकं गणयितुंChatMessage टोकन in .


TokenWindowChatMemory तथा MessageWindowChatMemory इत्येतयोः मध्ये अन्तरम्

TokenWindowChatMemory MessageWindowChatMemory इत्यस्य सदृशम् अस्ति यत् क्षमतायाः गणनायाः मार्गः भिन्नः अस्ति MessageWindowChatMemory प्रत्यक्षतया List गृह्णाति ।<ChatMessage> आकारः, तथा च TokenWindowChatMemory निर्दिष्टं Tokenizer to इत्यस्य उपयोगं करिष्यति<ChatMessage> तदनुरूपं Tokens संख्या अनुमानिता भवति, ततः सेट् maxTokens इत्यनेन सह तुलना क्रियते यदि संख्या maxTokens इत्यस्मात् अतिक्रमति तर्हि इदमपि समाप्तं भविष्यति, प्राचीनतमं ChatMessage अपि निराकृतं भविष्यति ।

Tokenizer एकः अन्तरफलकः अस्ति OpenAiTokenizer कार्यान्वयनवर्गः पूर्वनिर्धारितरूपेण प्रदत्तः अस्ति यत् एतत् अनुमानं कर्तुं भवति यत् अनेकेषां बृहत् मॉडल्-समूहानां चार्जं प्रयुक्तानां Tokens -सङ्ख्यायाः आधारेण भवति, अतः तस्य उपयोगः अनुशंसितः भवति cost संवेदनशीलं भवति TokenWindowChatMemory इत्यस्य उपयोगः सत्रे उपयुज्यमानानाम् Tokens इत्यस्य कुलसङ्ख्यां नियन्त्रयितुं भवति ।

उभयत्र कार्यान्वयनवर्गेषु अन्तः ChatMemoryStore विशेषता अस्ति ChatMemoryStore अपि पूर्वनिर्धारितरूपेण InMemoryChatMemoryStore कार्यान्वयनवर्गः अस्ति । कालान्तरे SQL आँकडाधाराः, दस्तावेजभण्डाराः इत्यादीनां लोकप्रियभण्डारस्य कृते बहिः-पेटी-कार्यन्वयनानि योजिताः भविष्यन्ति ।तावत्पर्यन्तं भवान् स्वपसन्दस्य कस्यापि भण्डारणस्य सङ्गतिं कर्तुं एतत् अन्तरफलकं कार्यान्वितुं शक्नोति


प्रकरण अभ्यास

प्रकरणम् १: 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: ChatMessage डिस्कं प्रति स्थातुं ChatMemoryStore अनुकूलितं कुर्वन्तु

मवेन् आश्रितानां परिचयं कुर्वन्तु

  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. }
प्रकरणम् ३: प्रत्येकस्य उपयोक्तुः कृते पृथक् पृथक् गपशप-अभिलेखान् संग्रहयन्तु
  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. }