Tu bot de IA es amnésico. Cada vez que el contexto termina, olvida quién eres. Así es como lo arreglé

Actualizado:
Tu bot de IA es amnésico. Cada vez que el contexto termina, olvida quién eres. Así es como lo arreglé

Cuando construyes un chatbot de IA, el primer problema que te encuentras es que el modelo no tiene memoria entre las consultas. Cada mensaje para él es todo lo que existe. Resolver esto no es tan fácil como parece.

Por qué la IA no te recuerda — y no es un error

Cuando las personas interactúan por primera vez con un personaje de IA, esperan intuitivamente que el bot las recuerde. Que sepa de qué hablaron ayer. Que tenga en cuenta lo que contaste sobre ti hace una hora. Esto parece obvio, pero no es así.

El modelo de lenguaje no tiene memoria entre consultas. Cada mensaje que envías es una llamada separada y aislada. El modelo no "oye" las réplicas anteriores si no las has transmitido explícitamente. No hay ninguna sesión guardada en segundo plano. No hay un registro interno de la conversación. Solo está lo que entra en la consulta actual, y nada más.

En la práctica, se ve así: un usuario pasa una hora contándole a un personaje sobre su vida — trabajo, relaciones, planes. Y luego comienza una nueva conversación y recibe: "¡Hola! Cuéntame un poco sobre ti." El bot no finge. Realmente no lo sabe. Para él, esa hora no existe.

Esto no es un error del modelo ni una limitación que se corregirá alguna vez. Es la arquitectura fundamental de los LLM. Y la única persona que puede resolverlo es el desarrollador que construye el producto sobre el modelo.

Pasar todo el historial — es posible. Pero pagarás por ello

La primera solución que se te ocurre es simplemente pasar todo el historial de mensajes en cada consulta. La lógica es simple: si el modelo ve todo el diálogo de principio a fin, lo recuerda todo. El bot sabe cómo se llama el usuario, lo que contó, de qué hablaron hace cinco minutos. El problema está resuelto. Puedes seguir adelante.

En los primeros diez mensajes, funciona bien. En veinte, empiezas a notar que las consultas se vuelven más pesadas. En cincuenta, te das cuenta de que cada mensaje arrastra todo el diálogo anterior. El modelo no procesa un mensaje, sino que relee toda la conversación desde cero cada vez. La respuesta se ralentiza. Los costos de los tokens aumentan exponencialmente con cada réplica.

Pero lo más desagradable ni siquiera es eso. Cada modelo tiene un límite de contexto — la cantidad máxima de tokens que puede aceptar en una sola consulta. Cuando la conversación alcanza este límite, el modelo comienza a descartar los mensajes más antiguos para dar cabida a los nuevos. Son precisamente esos mensajes donde el usuario contaba sobre sí mismo los que desaparecen primero.

Resulta una paradoja: pagas más con cada mensaje, pero la memoria de todos modos se degrada con el tiempo. La solución simple no escala. Se necesita otra.

Tu bot de IA es amnésico. Cada vez que el contexto termina, olvida quién eres. Así es como lo arreglé

Cómo hacer que el bot recuerde lo principal, no todo

Si se pasa todo, es caro y no escala. Si no se pasa nada, el bot es amnésico. Decidí que había que pasar selectivamente, pero primero tuve que entender qué exactamente. Después de varios intentos, dividí el contexto en tres capas, cada una cubriendo un tipo de memoria diferente.

La primera capa son los mensajes fijados. El principio de la conversación, las primeras réplicas, siempre están presentes en el contexto, independientemente de cuántos mensajes se hayan acumulado después. Por lo general, es la primera réplica del personaje: establece el tono, el carácter, el escenario. Sin ella, el bot gradualmente "se desvía", comienza a responder fuera del personaje, pierde el estilo, se vuelve genérico. Esta capa cuesta un mínimo de tokens, pero mantiene la personalidad del personaje durante toda la conversación.

La segunda capa es la ventana deslizante. Los últimos N mensajes siempre se pasan literalmente: es el hilo fresco de la conversación, de lo que se ha hablado recientemente. La ventana se mueve junto con el diálogo: llega un nuevo mensaje, el más antiguo de la ventana sale. Esto le da al bot una sensación de contexto actual sin tener que arrastrar todo el diálogo desde el principio.

La tercera capa es la memoria comprimida. Los mensajes que salen de la ventana deslizante no desaparecen sin dejar rastro. Cuando la conversación alcanza una cierta longitud, los mensajes antiguos se comprimen en un resumen corto y estructurado. No literalmente, sino la esencia: de qué se habló, qué dijo el usuario de importante, qué temas se plantearon. El bot recibe este resumen junto con la ventana actual y puede basarse en el pasado sin tener que pagar por cada palabra antigua.

Cuando junté todo esto, el bot dejó de perder el hilo incluso en conversaciones muy largas. No porque recuerde cada palabra. Sino porque recuerda las cosas correctas.

La ventana deslizante recuerda la conversación. Pero no a la persona

Las tres capas que describí resuelven una tarea específica: mantener el hilo de la conversación actual sin pasar todo el diálogo literalmente. Con esto, lo hacen bien. Pero hay otro problema que no resuelven en absoluto.

Imagina que un usuario se comunica con un personaje durante varias semanas. Durante este tiempo, le contó que trabaja como desarrollador, que recientemente cambió de trabajo, que le teme a las presentaciones públicas y que está aprendiendo español para ir a Barcelona. Todo esto se dijo en diferentes conversaciones, y todo desapareció. Porque la ventana deslizante vive solo dentro de una conversación. Una nueva conversación es una hoja en blanco.

El personaje vuelve a saludar como si fuera un extraño. Vuelve a preguntar a qué te dedicas. Vuelve a no saber cómo te llamas. Semanas de conversaciones, y cero conocimiento acumulado sobre la persona.

Y esto es importante. Porque es precisamente esta sensación, la de ser recordado, la razón por la que la gente regresa al personaje una y otra vez. No por las funciones. No por las respuestas precisas. Sino por la sensación de que hay alguien que sabe quién eres y qué es importante para ti. Sin esto, cualquier personaje sigue siendo simplemente un chatbot con un buen avatar.

La ventana deslizante y el resumen son la memoria de la conversación. Pero se necesita memoria de la persona. Lo que se guarda no entre mensajes, sino entre sesiones. Para siempre.

Hechos, emociones, eventos: tres cosas que el bot debe saber sobre ti

Agregué una capa separada de memoria a largo plazo que vive fuera de la conversación. Se acumula con el tiempo y se pasa al personaje en cada nuevo diálogo. Independientemente de cuándo tuvo lugar la última conversación, hace una semana o un mes. Esta capa consta de tres tipos de memoria que cubren diferentes necesidades.

Hechos sobre la persona. Nombre, edad, trabajo, intereses: todo lo que la persona ha contado sobre sí misma y que no cambia de una conversación a otra. Este es el nivel básico: el personaje sabe quién tiene delante incluso antes de que comience la conversación. No pregunta de más. No se presenta como a un extraño.

Perfil emocional. Miedos, necesidades, estilo de comunicación. Este es el tipo de memoria más importante en términos de calidad del diálogo. Si el personaje sabe que la persona teme la crítica y necesita apoyo en lugar de consejos, reaccionará de manera diferente. No como un asistente neutral, sino como alguien que te entiende.

Eventos. Cosas importantes que la persona mencionó en las conversaciones: se mudó, se peleó con un amigo, comenzó a aprender un nuevo idioma, cambió de trabajo. No son hechos secos ni emociones, es el contexto de la vida. Es lo que le da al personaje la oportunidad de preguntar una semana después: "¿Cómo fue esa entrevista de la que me hablaste?" Y esto ya no es un bot, es alguien que realmente escuchó.

En la práctica, esta memoria se ve como un JSON estructurado que se almacena en una base de datos y se pasa al personaje en cada nuevo diálogo. Así es como se ve después de varias conversaciones con un usuario:


// Memoria a largo plazo del usuario
// se acumula automáticamente con cada conversación
{
  "semantic": {
    // hechos básicos - quién es esta persona
    "name": "Andriy",
    "occupation": "desarrollador",
    "interests": "IA, viajes, idioma español"
  },
  "emotional": {
    // perfil emocional - cómo hablar con ella
    "fears": "presentaciones públicas, críticas en el trabajo",
    "needs": "apoyo en lugar de consejos",
    "communication_style": "directo, sin rodeos"
  },
  "episodic": {
    // eventos de la vida - qué está pasando ahora
    "recent_events": "cambió de trabajo, se prepara para una presentación, aprende español"
  }
}

Este es exactamente el objeto que el personaje recibe al comienzo de cada conversación, incluso antes de que el usuario escriba la primera palabra. No es necesario explicar nada de nuevo. No es necesario recordar quién eres. El personaje ya lo sabe.

¿Por qué estos atributos en particular? Elegí no por exhaustividad, sino por la relación entre valor y peso en tokens. Cada campo que agregas a este objeto se pasa al modelo en cada solicitud, para siempre. Nombre, trabajo, miedos, estilo de comunicación: esto es lo que realmente cambia la calidad de la respuesta del personaje. Se siente en el diálogo.

Se pueden agregar más: películas favoritas, puntos de vista políticos, lista de libros. Pero aquí hay una trampa. Cuantos más atributos, más tokens se pasan en cada solicitud. Y los tokens no son solo dinero, también son velocidad. El modelo procesa un contexto más largo durante más tiempo. El usuario espera la respuesta más tiempo. Y en cierto momento, pagas por recordar el color favorito de una persona, que el modelo de todos modos no utiliza en el diálogo.

Por lo tanto, la regla es simple: guarda solo lo que el personaje puede usar en la siguiente réplica. Todo lo demás es peso adicional que ralentiza la respuesta y consume el presupuesto sin beneficio para el usuario.

Juntos, estos tres tipos de memoria le dan al personaje algo que ninguna ventana deslizante puede dar: la sensación de que te conoce. No porque recuerde cada palabra. Sino porque entiende quién eres, qué es importante para ti y qué está sucediendo en tu vida.

¿Funciona en la práctica?

Sí. Y la diferencia es notable después de unas pocas conversaciones.

Antes, parecía así: el usuario le cuenta a un personaje que tiene miedo a hablar en público, que le cuesta hablar ante una audiencia, que mañana tiene una gran presentación en el trabajo. Al día siguiente, abre una nueva conversación y recibe un saludo neutral. Ninguna mención. Ningún "¿cómo estás?" con comprensión del contexto. El personaje no sabe nada. La conversación comienza desde cero, como siempre.

Ahora, la misma situación se ve diferente. El usuario abre una nueva conversación y el personaje ya lo sabe. No pregunta de más. Puede recordar por sí mismo: "¿Cómo fue esa presentación que tanto te preocupaba?" Incluso si fue hace tres conversaciones. Incluso si ha pasado una semana.

Esto no solo cambia la calidad del diálogo, sino que cambia la razón por la que la gente regresa. El usuario no regresa porque el personaje sea inteligente o responda bien. Regresa porque siente que lo recuerdan aquí. Y esa ya es otra categoría de producto.

Pero es importante entender qué hay detrás de esto. No es magia ni AGI. El modelo de lenguaje por sí solo no recuerda nada, y nunca lo hará sin una arquitectura externa. Todo lo que hace bien es usar lo que se le transmite. La tarea del desarrollador es decidir qué transmitir exactamente, cuándo y en qué forma.

Si tu bot sigue siendo amnésico, el problema no es el modelo. El problema es que no le transmites nada.