Un chat de personajes con memoria integrada a medio y largo plazo
¡Compruébalo aquí!
Recientemente he experimentado (y disfrutado) muchos servicios de inteligencia artificial de juegos de rol de personajes diferentes. Mis favoritos son Character.ai, Doppel.ai y Poly.ai de Cloud Whale Interactive Technology (no debe confundirse con poly.ai, los desarrolladores de chatbot de servicio al cliente).
Sin embargo, cada uno de estos sistemas tiene limitaciones que pueden resultar agravantes. He intentado abordar algunos de ellos en este proyecto.
Los chats basados en personajes son geniales y fascinantes, pero tienen poca memoria. A menudo pierden la noción del entorno, la situación y los acontecimientos anteriores importantes. Si bien el uso de ventanas de contexto más largas puede ayudar, ¡los tokens son caros! ¿Cómo podemos darle a un personaje una memoria larga, pero limitar la cantidad de tokens enviados para cada finalización? Doppel.ai, sin embargo, es mucho mejor en esto que el resto. Sus personajes tienen recuerdos más largos.
Los personajes pierden su personalidad con el tiempo o tienden a quedarse atrapados en ciclos de respuestas repetitivos. Algunos servicios son mejores que otros con esto, pero he visto que sucede hasta cierto punto con todos ellos.
Los personajes son estáticos una vez creados. Algunos servicios te permiten agregar 'recuerdos' adicionales a un personaje, pero todavía no he encontrado uno que te permita cambiar la personalidad base del personaje sin reiniciar la conversación.
El Agente cuenta con una "memoria" de varios niveles, o un mensaje del sistema que cambia dinámicamente, que incluye niveles de información de turnos de conversación anteriores que van desde muy específicos para los temas e información más recientes hasta más resumidos para la mayoría de los temas e información distantes.
Ventana de chat móvil de memoria a corto plazo Cada llamada al modelo incluye una lista bastante breve de mensajes anteriores palabra por palabra. Esto ayuda al modelo a realizar un seguimiento del contexto de la conversación actual y de los mensajes recientes.
Bloc de notas de Meory a medio plazo Además, creé un bloc de notas para que el agente de IA lo usara para tomar notas y realizar un seguimiento de los momentos destacados recientes de la conversación. Este bloc de notas se actualiza de forma continua con nueva información agregada o actualizada y la información antigua que ya no es relevante se descarta. Sin embargo, en realidad no se pierde ninguna información porque las instantáneas de su bloc de notas se guardan como entradas en la base de datos vectorial.
Debido a que esta información está resumida, comprime la información reciente, lo que permite que el modelo tenga los beneficios de una ventana de chat más larga y un contexto más amplio, al tiempo que minimiza los tokens reales incluidos en el mensaje.
Los nombres de los personajes (no solo "usuario" y "asistente") se incluyen en cada mensaje para ayudar con el resumen. Esto también ayuda al modelo a realizar un seguimiento de quién dice qué. Esto hace que sea mucho menos probable que el agente de IA se confunda entre quién dijo qué (lo que de otro modo sería un problema). También ayuda a mantener la etiqueta de turnos en el diálogo y evita que el agente hable en nombre del usuario (lo que también puede ser un problema).
Memoria de almacenamiento de vectores a largo plazo Utilizo resúmenes de conversaciones para extraer información importante de las conversaciones y luego los almaceno en una base de datos de vectores. Cada consulta de usuario desencadena una búsqueda semántica en la base de datos de vectores para recuperar información relevante de resúmenes de conversaciones anteriores. Esta información se incluye en el mensaje al modelo, así como en algunos de los mensajes más recientes.
De esta manera, la memoria de un agente de IA puede superar con creces su contexto. De hecho, como los almacenes de vectores pueden ocupar relativamente poco espacio en disco, el tamaño efectivo potencial de la memoria del agente es funcionalmente ilimitado.
Cuando se almacenan recuerdos, se almacenan con marcas de tiempo y cuando se recuerdan se ordenan cronológicamente. Se le indica al agente que prefiera información más reciente si los recuerdos son contradictorios.
Resultado El modelo es capaz de recordar con precisión información anterior en la conversación la mayor parte del tiempo. Las búsquedas en tiendas de vectores generalmente tienen éxito a la hora de recuperar la información relevante, pero el modelo no siempre utiliza la información en sus respuestas. Sin embargo, en general estoy satisfecho con los resultados.
Próximos pasos
Me gustaría que el modelo haga referencia de manera más proactiva a eventos anteriores. Tiene mayor éxito en recordar si le hago preguntas directamente sobre conversaciones anteriores, pero rara vez hace referencia espontánea a eventos anteriores. Vive mucho el momento. Estoy trabajando en ingeniería rápida para generar este comportamiento, pero aún está en proceso.
También estoy considerando utilizar el reconocimiento de entidades nombradas para permitir que el agente cree perfiles de personajes o lugares y almacene información relevante para entidades específicas. Esto ayudaría al modelo a organizar la información por entidad en lugar de ser simplemente instantáneas de conversaciones.
Me di cuenta de que, si bien los personajes a menudo comenzaban fuertes con un estilo de habla único, con el tiempo su estilo se desvaneció hasta volverse muy suave y sonar como su IA base. Experimenté con algunas soluciones, incluido hacer que escribiera su aviso en carácter. Sin embargo, esto desperdició una gran cantidad de tokens en la memoria al crear notas con menos densidad de tokens.
En su lugar, almaceno una muestra de la primera respuesta que proporciona el modelo como estilo de ejemplo. Luego, esta primera respuesta se pasa al agente en cada mensaje como ejemplo de estilo de habla para cada mensaje. He descubierto que esto es MUY eficaz para ayudar al modelo a mantener un estilo de habla consistente, incluso durante conversaciones largas (más de 100 respuestas).
Próximos pasos Si bien el tono de los mensajes es consistente, me gustaría darles a los modelos personalidades aún más fuertes, más matizadas y consistentes. Sospecho que esto puede requerir ajustes.
En muchos sistemas de juegos de rol de LLM, los personajes son estáticos una vez creados. Sin embargo, en mi implementación, las descripciones de los personajes e incluso los nombres se pueden cambiar sobre la marcha. De utilidad específica es la capacidad de cambiar la ubicación y el nombre de usuario.
Descripciones de personajes A veces quieres que tu cambio cambie por eventos recientes o que sus objetivos o motivaciones evolucionen con el tiempo. Esto es fácil de hacer ajustando directamente la descripción del personaje sobre la marcha.
Ubicación Las conversaciones y los juegos de roles a menudo pueden moverse en el mundo imaginario. Puedes ir de una ciudad a una mazmorra, de un dormitorio a una cafetería o de casa a trabajar. Mi sitio le permite cambiar la ubicación de la conversación sobre la marcha.
Nombre de usuario Otro desafío con la mayoría de los sistemas de juego de roles de personajes es incluir varios personajes. En mi sistema puedes cambiar el nombre del personaje por el que estás hablando sobre la marcha. Esto te permite simular varios personajes en una conversación o situación.
Nombre del personaje Cambiar esto en realidad no es muy útil. No funciona hacer que el personaje interprete personajes diferentes y causará confusión cuando el modelo intente relacionar conversaciones actuales con resúmenes de conversaciones anteriores.
Próximos pasos