моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Память чатаЭто называется памятью чата, в которой хранятся исторические разговоры между пользователями и большими моделями, так что большие модели могут использовать эти исторические разговоры, чтобы понять, что недавно сказали пользователи и что они имеют в виду.
Однако, если вы продолжаете хранить исторические разговоры в памяти чата, для этого потребуется все больше и больше места для хранения. Поэтому ChatMemory также поддерживает расширенные функции, такие как ограничение окон, механизм исключения, механизм сохранения и т. д.
В зависимости от размера коллекции старые сообщения удаляются.В качестве раздвижного окна держитеN
Последние новости и выселяем старые новости, которые уже не подходят.Однако, поскольку каждое сообщение может содержать разное количество токенов,MessageWindowChatMemory
Очень полезно для быстрого прототипирования.
В зависимости от размера токена старые сообщения удаляются.Он также работает как скользящее окно, но фокусируется на сохраненииN
последний токен и при необходимости удаляйте старые сообщения. Информация неделима. Если сообщение не подходит, оно будет полностью удалено. Для TokenWindowChatMemory требуетсяTokenizer
рассчитать каждыйChatMessage
токен в .
TokenWindowChatMemory аналогичен MessageWindowChatMemory. Разница в том, что способ расчета емкости другой. MessageWindowChatMemory напрямую использует список.<ChatMessage> размер, а TokenWindowChatMemory будет использовать указанный Tokenizer для<ChatMessage> Соответствующее количество токенов оценивается, а затем сравнивается с установленным maxTokens. Если число превышает maxTokens, оно также будет удалено, а также будет удалено самое старое сообщение ChatMessage.
Tokenizer — это интерфейс. Класс реализации OpenAiTokenizer предоставляется по умолчанию. Он используется для оценки количества токенов, соответствующих API-интерфейсам ChatMessage, взимаемых в зависимости от количества используемых токенов. Стоимость чувствительна. TokenWindowChatMemory используется для управления общим количеством токенов, используемых в сеансе.
Оба класса реализации имеют внутри атрибут ChatMemoryStore. По умолчанию существует класс реализации InMemoryChatMemoryStore. Со временем будут добавлены готовые реализации для популярных хранилищ, таких как базы данных SQL, хранилища документов и т. д.Между тем, вы можете реализовать этот интерфейс для подключения к любому хранилищу по вашему выбору.
- 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("换一个"));
- }
- }
Введение зависимостей 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>
Настройте ChatMemoryStore для обеспечения постоянного хранилища.
- 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();
- }
- }
тестирование кода
- 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, "换一个"));
- }
- }