Un chat de personnages avec mémoire intégrée à moyen et long terme
Découvrez-le ici!
J'ai récemment expérimenté (et apprécié) de nombreux services d'IA de jeu de rôle de personnages. Mes favoris sont Character.ai, Doppel.ai et Poly.ai de Cloud Whale Interactive Technology (à ne pas confondre avec poly.ai, les développeurs de chatbots du service client)
Cependant, chacun de ces systèmes présente des limites qui peuvent être aggravantes. J'ai essayé d'en aborder quelques-uns dans ce projet.
Les discussions basées sur les personnages sont formidables et captivantes, mais elles ont la mémoire courte. Ils perdent souvent la trace du décor, de la situation et des événements antérieurs importants. Bien que l’utilisation de fenêtres contextuelles plus longues puisse y contribuer, les jetons coûtent cher ! Comment donner une longue mémoire à un personnage, tout en limitant le nombre de jetons envoyés à chaque achèvement ? Doppel.ai, cependant, est bien meilleur que les autres à ce sujet. Leurs personnages ont une mémoire plus longue.
Les personnages perdent leur personnalité avec le temps ou ont tendance à rester coincés dans des boucles de réponses répétitives. Certains services sont meilleurs que d’autres dans ce domaine, mais j’ai vu cela se produire dans une certaine mesure avec chacun d’entre eux.
Les personnages sont statiques une fois créés. Certains services vous permettent d'ajouter des « souvenirs » supplémentaires à un personnage, mais je n'en ai pas encore trouvé un qui vous permette de changer la personnalité de base du personnage sans redémarrer la conversation.
L'agent est doté d'une « mémoire » à plusieurs niveaux, ou d'une invite système à changement dynamique, qui comprend des niveaux d'informations sur les conversations précédentes, allant de très spécifiques pour les sujets les plus récents à plus résumés pour la plupart des sujets et informations à distance.
Fenêtre de discussion à mémoire à court terme Chaque appel au modèle comprend une liste assez courte de messages précédents textuellement. Cela aide le modèle à suivre le contexte de la conversation en cours et des messages récents.
Bloc-notes Meory à mi-parcours De plus, j'ai créé un bloc-notes que l'agent IA peut utiliser pour prendre des notes et suivre les faits saillants récents de la conversation. Ce bloc-notes est mis à jour régulièrement avec de nouvelles informations ajoutées ou mises à jour et les anciennes informations, qui ne sont plus pertinentes, sont supprimées. Cependant, aucune information n'est réellement perdue car des instantanés de son bloc-notes sont enregistrés en tant qu'entrées dans la base de données vectorielles.
Étant donné que ces informations sont résumées, elles compressent les informations récentes, permettant au modèle de bénéficier des avantages d'une fenêtre de discussion plus longue et d'un contexte plus large, tout en minimisant les jetons réels inclus dans l'invite.
Les noms des personnages (pas seulement « utilisateur » et « assistant ») sont inclus dans chaque message pour faciliter le résumé. Cela aide également le modèle à savoir qui dit quoi. Cela rend l'agent IA beaucoup moins susceptible de se tromper entre qui a dit quoi (ce qui autrement est un problème). Cela permet également de maintenir l'étiquette du tour de rôle dans le dialogue et empêche l'agent de parler au nom de l'utilisateur (ce qui peut également poser problème).
Mémoire de stockage vectoriel à long terme J'utilise des résumés de conversation pour extraire des informations importantes des conversations, puis les stocker dans une base de données vectorielle. Chaque requête utilisateur déclenche une recherche sémantique dans la base de données vectorielles pour rappeler les informations pertinentes des résumés de conversations précédentes. Ces informations sont incluses dans l'invite adressée au modèle, ainsi que dans quelques-uns des messages les plus récents.
De cette manière, la mémoire d'un agent IA peut largement dépasser son contexte. En fait, comme les magasins de vecteurs peuvent occuper relativement peu d'espace disque, la taille effective potentielle de la mémoire de l'agent est fonctionnellement illimitée.
Lorsque les mémoires sont stockées, elles sont stockées avec des horodatages et lorsqu'elles sont rappelées, elles sont classées par ordre chronologique. L'agent est invité à préférer les informations plus récentes si les souvenirs sont contradictoires.
Résultat Le modèle est capable de rappeler avec précision les informations du début de la conversation la plupart du temps. Les recherches dans les magasins vectoriels réussissent généralement à récupérer les informations pertinentes, mais le modèle n'utilise pas toujours réellement les informations dans ses réponses. En général, cependant, je suis satisfait des résultats.
Prochaines étapes
J'aimerais que le modèle fasse référence de manière plus proactive aux événements précédents. Il réussit surtout à se souvenir si je lui pose directement des questions sur des conversations antérieures, mais je fais rarement référence spontanément à des événements antérieurs. Il vit beaucoup dans l'instant présent. Je travaille sur l'ingénierie rapide pour générer ce comportement, mais c'est toujours en cours.
J'envisage également d'utiliser la reconnaissance d'entités nommées pour permettre à l'agent de créer des profils de personnages ou de lieux et de stocker des informations pertinentes pour des entités spécifiques. Cela aiderait le modèle à organiser les informations par entité plutôt que de simples instantanés de conversation.
J'ai remarqué que même si les personnages commençaient souvent fort avec un style de parole unique, au fil du temps, leur style s'est estompé pour devenir très fade et ressembler à leur IA de base. J'ai expérimenté quelques solutions, notamment en lui faisant écrire son caractère d'avis. Cependant, cela gaspillait beaucoup de jetons en mémoire en créant des notes moins denses en jetons.
Au lieu de cela, je stocke un échantillon de la première réponse fournie par le modèle comme exemple de style. Cette première réponse est ensuite transmise à l'agent à chaque invite comme exemple de style de parole pour chaque invite. J'ai trouvé que cela était TRÈS efficace pour aider le modèle à maintenir un style de parole cohérent, même lors de longues conversations (plus de 100 achèvements).
Prochaines étapes Même si le ton des messages est cohérent, j'aimerais donner aux modèles des personnalités encore plus fortes, plus nuancées et cohérentes. Je soupçonne que cela nécessitera peut-être un réglage fin.
Dans de nombreux systèmes de jeu de rôle LLM, les personnages sont statiques une fois créés. Cependant, dans mon implémentation, les descriptions des personnages et même les noms peuvent être modifiés à la volée. La possibilité de modifier l'emplacement et le nom d'utilisateur est particulièrement utile.
Descriptions des personnages Parfois, vous souhaitez que votre changement soit dû aux événements récents ou que leurs objectifs ou leurs motivations évoluent au fil du temps. C'est facile à faire en ajustant directement la description du personnage à la volée.
Lieu Les conversations et les jeux de rôle peuvent souvent se déplacer dans le monde imaginaire. Vous pouvez aller d'une ville à un donjon, ou d'un dortoir à un café, ou de chez vous au travail. Mon site vous permet de changer le lieu de la conversation à la volée.
Nom d'utilisateur Un autre défi de la plupart des systèmes de jeu de rôle avec personnages consiste à inclure plusieurs personnages. Dans mon système, vous pouvez modifier le nom du personnage pour lequel vous parlez à la volée. Cela vous permet de simuler plusieurs personnages dans une conversation ou une situation.
Nom du personnage Changer cela n'est en fait pas très utile. Cela ne fonctionne pas pour amener le personnage à jouer des personnages différents et cela entraînera de la confusion lorsque le modèle essaiera de relier les conversations en cours aux résumés de conversations précédentes.
Prochaines étapes