Teknologian jakaminen

3. LangChain4j:n chat-muisti

2024-07-12

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

Chat-muistin esittely

Chat-muistiSitä kutsutaan chat-muistiksi, joka tallentaa historialliset keskustelut käyttäjien ja suurten mallien välillä, jotta suuret mallit voivat käyttää näitä historiallisia keskusteluja ymmärtääkseen, mitä käyttäjät ovat hiljattain sanoneet ja mitä he tarkoittavat.

Kuitenkin, jos jatkat historiallisten keskustelujen tallentamista Chat-muistiin, se vaatii yhä enemmän tallennustilaa. Siksi ChatMemory tukee myös laajennettuja toimintoja, kuten ikkunarajoituksia, poistomekanismia, pysyvyysmekanismia jne.


ChatMemory on käyttöliittymä, joka tarjoaa oletuksena kaksi toteutusluokkaa:

  • MessageWindowChatMemory

Kokoelman koon mukaan vanhat viestit poistetaan.Pidä liukuikkunanaN Viimeisimmät uutiset ja häädä vanhat uutiset, jotka eivät enää sovi.Koska jokainen viesti voi kuitenkin sisältää eri määrän tunnuksia,MessageWindowChatMemory Erittäin hyödyllinen nopeaan prototyyppien valmistukseen.

  • TokenWindowChatMemory

Tokenin koon mukaan vanhat viestit poistetaan.Se toimii myös liukuvana ikkunana, mutta keskittyy säilyttämiseenN uusin tunnus ja häätä vanhat viestit tarvittaessa. Tieto on jakamaton. Jos viesti ei ole sopiva, se häädetään kokonaan. TokenWindowChatMemory vaatii aTokenizer laskea jokainenChatMessage merkki sisään.


Ero TokenWindowChatMemoryn ja MessageWindowChatMemoryn välillä

TokenWindowChatMemory on samanlainen kuin MessageWindowChatMemory. Erona on, että MessageWindowChatMemoryn kapasiteetti on erilainen.<ChatMessage> kokoa, ja TokenWindowChatMemory käyttää määritettyä Tokenizeria<ChatMessage> Vastaava Tokenien määrä arvioidaan ja sitä verrataan asetettuihin maxTokeneihin.

Tokenizer on käyttöliittymä oletuksena. Sitä käytetään arvioimaan, kuinka monta merkkiä vastaa useiden suurten mallien sovellusliittymiä, joten on suositeltavaa käyttää sitä hinta on herkkä TokenWindowChatMemoryn avulla ohjaamaan istunnossa käytettyjen Tokenien kokonaismäärää.

Molemmissa toteutusluokissa on ChatMemoryStore-attribuutti, joka on myös InMemoryChatMemoryStore-toteutusluokka. Ajan myötä valmiita toteutuksia lisätään suosittuihin kauppoihin, kuten SQL-tietokantoihin, dokumenttivarastoihin jne.Sillä välin voit ottaa tämän käyttöliittymän käyttöön ja muodostaa yhteyden mihin tahansa valitsemaasi tallennustilaan


Tapauskäytäntö

Tapaus 1: Luo suosittu nimeämiskanta ChatMemoryn perusteella
  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. }
Tapaus 2: Mukauta ChatMemoryStore niin, että ChatMessage säilyy levyllä

Ota käyttöön hirveitä riippuvuuksia

  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>

 Mukauta ChatMemoryStorea jatkuvan tallennustilan saavuttamiseksi

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

  koodin testaus

  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. }
Tapaus 3: Tallenna chat-tietueet erikseen kullekin käyttäjälle
  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. }