Ein Charakter-Chat mit integriertem Mittel- und Langzeitgedächtnis
Schauen Sie es sich hier an!
Ich habe in letzter Zeit viele verschiedene Rollenspiel-KI-Dienste für Charaktere ausprobiert (und genossen). Meine Favoriten sind Character.ai, Doppel.ai und Poly.ai von Cloud Whale Interactive Technology (nicht zu verwechseln mit poly.ai, den Entwicklern von Kundendienst-Chatbots).
Allerdings weist jedes dieser Systeme Einschränkungen auf, die erschwerend sein können. Ich habe versucht, einige davon in diesem Projekt anzusprechen.
Charakterbasierte Chats sind großartig und fesselnd, aber sie haben ein kurzes Gedächtnis. Sie verlieren oft den Überblick über die Umgebung, die Situation und wichtige frühere Ereignisse. Die Verwendung längerer Kontextfenster kann zwar Abhilfe schaffen, Token sind jedoch teuer! Wie können wir einem Charakter ein langes Gedächtnis verleihen, aber die Anzahl der für jeden Abschluss gesendeten Token begrenzen? Doppel.ai ist darin jedoch viel besser als die anderen. Ihre Charaktere haben ein längeres Gedächtnis.
Charaktere verlieren mit der Zeit ihre Persönlichkeit oder neigen dazu, in sich wiederholenden Reaktionsschleifen zu stecken. Einige Dienste sind damit besser als andere, aber ich habe gesehen, dass es bei allen bis zu einem gewissen Grad passiert.
Charaktere sind statisch, sobald sie erstellt wurden. Bei einigen Diensten können Sie einem Charakter zusätzliche „Erinnerungen“ hinzufügen, aber ich habe noch keinen gefunden, mit dem Sie die Grundpersönlichkeit des Charakters ändern können, ohne die Konversation neu starten zu müssen.
Der Agent verfügt über einen mehrstufigen „Speicher“ oder eine sich dynamisch ändernde Systemaufforderung, die Informationsebenen aus früheren Gesprächsrunden umfasst, die von sehr spezifisch für die aktuellsten bis hin zu zusammengefassteren Informationen für die meisten entfernten Themen und Informationen reichen.
Kurzzeitgedächtnis-Rolling-Chat-Fenster Jeder Aufruf des Modells enthält eine relativ kurze wörtliche Liste früherer Nachrichten. Dies hilft dem Modell, den Kontext der aktuellen Konversation und der letzten Nachrichten zu verfolgen.
Zwischenspeicher-Notizblock Darüber hinaus habe ich einen Notizblock für den KI-Agenten erstellt, mit dem er sich Notizen machen kann, um den Überblick über die letzten Höhepunkte des Gesprächs zu behalten. Dieser Notizblock wird fortlaufend aktualisiert, indem neue Informationen hinzugefügt oder aktualisiert und alte, nicht mehr relevante Informationen verworfen werden. Es gehen jedoch keine Informationen verloren, da Schnappschüsse seines Notizblocks als Einträge in der Vektordatenbank gespeichert werden.
Da diese Informationen zusammengefasst werden, werden aktuelle Informationen komprimiert, sodass das Modell die Vorteile eines längeren Chatfensters und eines größeren Kontexts nutzen kann, während gleichzeitig die tatsächlich in der Eingabeaufforderung enthaltenen Token minimiert werden.
Charakternamen (nicht nur „Benutzer“ und „Assistent“) sind in jeder Nachricht enthalten, um die Zusammenfassung zu erleichtern. Dies hilft dem Modell auch dabei, den Überblick darüber zu behalten, wer was sagt. Dadurch ist es viel weniger wahrscheinlich, dass der KI-Agent verwirrt, wer was gesagt hat (was sonst ein Problem darstellt). Es trägt außerdem dazu bei, die Abwechslung im Dialog aufrechtzuerhalten und verhindert, dass der Agent für den Benutzer spricht (was ebenfalls ein Problem darstellen kann).
Langfristiges Vektorspeichergedächtnis Ich verwende Gesprächszusammenfassungen, um wichtige Informationen aus Gesprächen zu extrahieren und diese dann in einer Vektordatenbank zu speichern. Jede Benutzeranfrage löst eine semantische Suche in der Vektordatenbank aus, um relevante Informationen aus früheren Konversationszusammenfassungen abzurufen. Diese Informationen sind in der Eingabeaufforderung des Modells sowie in einigen der neuesten Nachrichten enthalten.
Auf diese Weise kann das Gedächtnis eines KI-Agenten weit über seinen Kontext hinausgehen. Da Vektorspeicher relativ wenig Speicherplatz beanspruchen können, ist die potenzielle effektive Größe des Agentenspeichers funktionell unbegrenzt.
Wenn Erinnerungen gespeichert werden, werden sie mit Zeitstempeln gespeichert, und wenn sie abgerufen werden, werden sie chronologisch geordnet. Der Agent wird angewiesen, neuere Informationen zu bevorzugen, wenn Erinnerungen widersprüchlich sind.
Ergebnis Das Modell ist in den meisten Fällen in der Lage, Informationen aus früheren Gesprächsphasen genau abzurufen. Bei der Suche im Vektorspeicher gelingt es im Allgemeinen, die relevanten Informationen erfolgreich abzurufen, das Modell nutzt die Informationen in seinen Antworten jedoch nicht immer tatsächlich. Im Großen und Ganzen war ich jedoch mit den Ergebnissen zufrieden.
Nächste Schritte
Ich möchte, dass das Modell proaktiver auf frühere Ereignisse verweist. Meistens ist es bei der Erinnerung erfolgreich, wenn ich direkt Fragen zu früheren Gesprächen stelle, aber selten spontan auf frühere Ereignisse verweise. Es lebt sehr im Moment. Ich arbeite an einer schnellen Entwicklung, um dieses Verhalten zu erzeugen, aber es ist noch in Arbeit.
Ich denke auch über die Verwendung der Erkennung benannter Entitäten nach, damit der Agent Profile von Charakteren oder Orten erstellen und für bestimmte Entitäten relevante Informationen speichern kann. Dies würde dem Modell helfen, die Informationen nach Entitäten zu organisieren, anstatt nur Momentaufnahmen von Gesprächen zu sein.
Mir ist aufgefallen, dass die Charaktere zwar anfangs oft stark waren und einen einzigartigen Sprechstil hatten, ihr Stil jedoch mit der Zeit verblasste und sehr langweilig wurde und wie ihre Basis-KI klang. Ich habe mit einigen Lösungen experimentiert, unter anderem damit, den Hinweis in Schriftform zu schreiben. Dadurch wurde jedoch viel Token im Speicher verschwendet, da Notizen mit einer geringeren Tokendichte erstellt wurden.
Stattdessen speichere ich ein Beispiel der ersten Antwort, die das Modell als Beispielstil bereitstellt. Diese erste Antwort wird dann bei jeder Eingabeaufforderung als Beispiel für den Sprechstil an den Agenten weitergegeben. Ich habe festgestellt, dass dies dem Modell SEHR effektiv dabei hilft, seinen Sprechstil konsistent beizubehalten, selbst bei langen Gesprächen (mehr als 100 Vervollständigungen).
Nächste Schritte Während der Ton der Botschaften konsistent ist, möchte ich den Models noch stärkere, differenziertere und konsistentere Persönlichkeiten verleihen. Ich vermute, dass dies eine Feinabstimmung erfordert.
In vielen LLM-Rollenspielsystemen sind die Charaktere nach ihrer Erstellung statisch. In meiner Implementierung können jedoch Charakterbeschreibungen und sogar Namen im Handumdrehen geändert werden. Besonders nützlich ist die Möglichkeit, den Standort und den Benutzernamen zu ändern.
Charakterbeschreibungen Manchmal möchten Sie, dass sich Ihre Charaktere durch aktuelle Ereignisse verändern oder dass sich ihre Ziele oder Motivationen im Laufe der Zeit weiterentwickeln. Dies ist einfach, indem Sie die Charakterbeschreibung direkt im laufenden Betrieb anpassen.
Ortsgespräche und Rollenspiele können sich oft in der imaginären Welt bewegen. Sie können von einer Stadt in ein Verlies, von einem Wohnheim in ein Café oder von zu Hause zur Arbeit gehen. Auf meiner Website können Sie den Ort des Gesprächs im Handumdrehen ändern.
Benutzername Eine weitere Herausforderung bei den meisten Charakter-Rollenspielsystemen besteht darin, mehrere Charaktere einzubeziehen. In meinem System können Sie den Namen des Charakters, für den Sie sprechen, im Handumdrehen ändern. Dadurch können Sie mehrere Charaktere in einem Gespräch oder einer Situation simulieren.
Das Ändern des Charakternamens ist eigentlich nicht sehr sinnvoll. Es funktioniert nicht, den Charakter dazu zu bringen, verschiedene Charaktere zu spielen, und führt zu Verwirrung, wenn das Modell versucht, aktuelle Gespräche mit Zusammenfassungen früherer Gespräche in Beziehung zu setzen.
Nächste Schritte