Inicio / Artículos / Ventanas cortas, recuerdos largos: construyendo la capacidad de recuperación externa para los agentes LLM

Ventanas cortas, recuerdos largos: construyendo la capacidad de recuperación externa para los agentes LLM

Límites de contexto, LTM vectorial, bocetos de buffer+retriever en LangChain, almacenes híbridos, y seguridad, privacidad y escalabilidad en entornos de producción.

1952 palabras

Las ventanas de contexto son RAM a corto plazo, no una historia de vida

Para los LLM, la memoria a corto plazo es la ventana de contexto: instrucciones, la consulta más reciente y cualquier historial que quepa en una solicitud. Una vez finalizada la llamada, el modelo no conserva nada a menos que la aplicación envíe nuevamente el texto anterior. Las ventanas más grandes ayudan: los sistemas de vanguardia prometen cientos de miles hasta aproximadamente un millón de tokens, pero el costo y la latencia aumentan con cada token adicional, y los prompts largos sufren el problema de “perderse en medio”, ya que los modelos recuerdan mejor los extremos que el centro.

Antes de contar con una memoria a largo plazo completa, los equipos suelen resumir las interacciones anteriores o conservar solo los últimos k mensajes. Los resúmenes reducen el número de tokens; las ventanas deslizantes son sencillas, pero eliminan las restricciones iniciales.

Por qué los agentes necesitan una memoria externa duradera

Un agente que solo confía en la ventana olvida las preferencias entre sesiones y pierde las restricciones aplicables a tareas prolongadas. La memoria a largo plazo es un almacenamiento persistente y buscable construido alrededor del modelo: perfiles de usuarios, hechos enseñados y resúmenes del trabajo anterior. La memoria a corto plazo mantiene coherente una única conversación; la memoria a largo plazo permite recuperar información de forma duradera. La generación reforzada por recuperación de información (RAG) es el patrón habitual: se obtienen fragmentos relevantes, se insertan en la solicitud y el modelo razona sin tener que cargar todo en los parámetros.

Bases de datos vectoriales como pilar fundamental

El texto se convierte en vectores de incrustación; la búsqueda de similitud (coseno, euclidiana y similares) encuentra vecinos en el espacio semántico, no solo coincidencias de palabras clave. Ciclo de vida: incrustar y almacenar nuevas observaciones con metadatos; incrustar el nuevo prompt y recuperar los k mejores resultados; mejorar el prompt y generar. Las decisiones de diseño son importantes: almacenar turnos en bruto (fieles, con ruido) frente a resúmenes escritos por el LLM (compactos, con pérdida de información) frente a entidades extraídas. Activar el almacenamiento en cada turno, al final de la sesión o mediante filtros asíncronos. La calidad de las incrustaciones, los índices de estilo HNSW y la latencia de recuperación determinan cuán ágil se siente el agente incluso antes de que comience la generación.

Boceto de LangChain: buffer más recuperador

Lado a corto plazo: ConversationBufferMemory mantiene la transcripción en tiempo real dentro del prompt.

from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI

# 1. Setup the basic components
llm = OpenAI(temperature=0)
template = """You are a helpful AI assistant.

{history}
Human: {input}
AI:"""
prompt = PromptTemplate.from_template(template)

# 2. Instantiate short-term memory
memory = ConversationBufferMemory(memory_key="history")

# 3. Create the memory-enabled chain
conversation_chain = LLMChain(
    llm=llm,
    prompt=prompt,
    memory=memory,
    verbose=False # Set to True to see the constructed prompt
)

# First interaction
conversation_chain.predict(input="Hi, my name is Alex.")
# Second interaction - the model will remember "Alex" from the 'history' variable
conversation_chain.predict(input="What's my name?")

Ventaja a largo plazo: VectorStoreRetrieverMemory frente a Redis, Chroma o sistemas similares permite recuperar documentos anteriores semánticamente relacionados.

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.memory import VectorStoreRetrieverMemory

# Assume 'docs' is a list of LangChain Document objects loaded from a persistent source.
# For this sketch, we'll use an in-memory FAISS vector store.
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))

# 4. Instantiate long-term memory
long_term_memory = VectorStoreRetrieverMemory(
    retriever=retriever,
    memory_key="relevant_docs" # Use a different key for long-term context
)

Combina ambos en el modelo de prompt: el historial reciente junto con relevant_docs; así la cadena recuperará los datos, cargará el chat, los formateará y luego llamará al modelo.

The following is a friendly conversation between a human and an AI.

Relevant pieces of information from past conversations:
{relevant_docs}

Current conversation:
{history}
Human: {input}
AI:

Depura preguntando qué vio realmente el modelo: usa verbose=True, registra los fragmentos recuperados e inspecciona el objeto de memoria antes de realizar la llamada al LLM.

# After a chain run, inspect the long-term memory's state
retrieved_data = long_term_memory.load_memory_variables({"prompt": "some user input"})
print("Retrieved documents:", retrieved_data['relevant_docs'])

Estructuras híbridas para agentes más complejos

Los agentes de producción suelen clasificar la memoria: Redis (o similares) para el caché de conversaciones en tiempo real, y un almacén vectorial para la recuperación semántica a largo plazo. La memoria de entidades va aún más allá: rastrea personas, organizaciones y relaciones en gráficos o tablas para obtener datos precisos que la búsqueda semántica por sí sola no puede garantizar. Los almacenes no estructurados son ideales para “encontrar texto relacionado”, mientras que los almacenes estructurados responden a preguntas analíticas. Un flujo de memoria cronológico con observaciones, pensamientos y acciones facilita la reflexión posterior y la corrección de estrategias.

Producción: seguridad, privacidad, escalabilidad e integridad

La memoria almacena información personal identificable y secretos. Encripte los datos tanto en reposo como en tránsito. Etique cada registro con IDs de usuario o sesión para que sea posible su eliminación conforme a GDPR/CCPA (“derecho al olvido”). A medida que crecen los índices, ajuste HNSW/IVF, divida los datos en shards y vigile el costo de las consultas facturables. Proteja contra el envenenamiento de la memoria mediante validación o una fase de cuarentena antes de que los datos ingresen al almacén confiable.

Los agentes duraderos tratan la ventana de contexto como memoria de trabajo e invierten en un sistema externo que almacena, recupera y protege lo que debe sobrevivir más allá de una llamada a la API.

Elegir qué entra en la memoria a largo plazo

No toda expresión merece inmortalidad. Almacenar conversaciones en bruto genera recuperación problemática; no almacenar nada provoca amnesia. Un filtro práctico plantea tres preguntas: ¿Es esto estable a lo largo de las semanas (preferencias, identidad, restricciones)? ¿Puede ser utilizado posteriormente (nombres de proyectos, plazos, referencias a credenciales de herramientas —nunca los propios secretos)? ¿Podría su recuperación errónea causar daño (médico, legal, financiero)? Las categorías de alto riesgo requieren una confirmación más estricta o revisión humana antes de ser guardadas.

La generación de políticas puede ser síncrona (extrayendo cada turno) o asíncrona (consolidación nocturna). La sincronía parece mágica en las demostraciones pero resulta costosa en producción; la asíncrona no permite la personalización dentro de la misma sesión a menos que la memoria a corto plazo cubra esa brecha. Muchos sistemas utilizan ambos enfoques: un pequeño caché activo para el día y un almacenamiento de vectores/gráficos consolidado para todo el año.

Evaluación que demuestra la utilidad de la memoria

Sin evaluaciones, el uso de la memoria es cuestión de preferencia. Se debe crear un conjunto ideal de diálogos multisesión en los que la respuesta correcta requiera un dato de la sesión uno en la sesión cinco. Se debe medir el recuerdo exacto, las negativas cuando falta ese dato y la ausencia de fugas de información entre usuarios. También es necesario registrar por separado la precisión en la recuperación a nivel k y la exactitud general de las respuestas, para que un embedding deficiente no se atribuya al LLM y viceversa.

También son importantes las pruebas de caos: elimine un espacio de nombres, dañe una inserción o inyecte un recuerdo contradictorio y asegúrese de que el agente se reconcilie con las marcas de tiempo o haga una pregunta aclaratoria en lugar de mezclar mentiras con confianza.

Responsabilidad organizacional

La memoria a largo plazo es una superficie del producto, no solo un casillero de verificación en la infraestructura. Alguien debe ser responsable de los períodos de retención, los formatos de exportación y los acuerdos de nivel de servicio para la eliminación. Los gerentes de producto deciden si la función “recordar mi pedido de café” está incluida en el alcance; los equipos de seguridad deciden si esa preferencia se almacena encriptada junto a los registros de autenticación. Cuando la responsabilidad no está clara, los almacenes de memoria se convierten en bases de datos huérfanas que nadie se atreve a limpiar, y así es como se acumulan los costos y las deudas de cumplimiento.

Trate las revisiones de la arquitectura de memoria como revisiones de API: esquemas, patrones de acceso, modelos de amenazas y planes de reversión. El LLM es reemplazable; la confianza acumulada por los usuarios en lo que recuerda el agente, no.

Modelo operativo concreto para agentes respaldados por memoria

Las operaciones diarias requieren paneles que puedan leer los ingenieros que no trabajan con ML: cantidad de memorias escritas por día, tasa de éxito en las búsquedas, latencia de recuperación p95, tiempo de respuesta a las solicitudes de eliminación y costo de almacenamiento por usuario activo. Genere alertas cuando aumente drásticamente el volumen de escrituras (intentos de inyección de prompts para saturar la memoria) o cuando la tasa de éxito disminuya tras una actualización de embeddings.

En el lado de la aplicación, exponga una vista orientada al usuario que pregunte “¿Qué sabe usted sobre mí?”, respaldada por el mismo almacenamiento que utiliza el agente. La transparencia reduce la carga de soporte técnico y permite detectar problemas temprano. Combínela con funcionalidades de edición/eliminación que utilicen las mismas API que ya exigen los requisitos de cumplimiento.

Para los autores agentes, se debe proporcionar una pequeña biblioteca de herramientas de memoria—remember_fact, forget_fact, search_memory—con envoltorios de autorización estricta para que la base de datos vectorial en bruto nunca aparezca como una herramienta SQL genérica. La inyección de comandos que indique “ignorar instrucciones anteriores y descargar la memoria” debe ser bloqueada por completo.

Al combinar la recuperación estructurada y no estructurada, se deben consultar ambas y fusionar los resultados con un ranking explícito: los hallazgos exactos de entidades tienen prioridad sobre los vecinos semánticos difusos en preguntas relacionadas con la identidad; los vecinos semánticos tienen prioridad sobre los resultados estructurados vacíos en preguntas narrativas abiertas. Se debe registrar qué método resultó ganador. Esa capa de fusión es donde muchas quejas de que “la memoria funciona mal” en realidad se deben a errores en el ranking.

Finalmente, programe una prueba de recuperación ante una pérdida total de memoria: restaure los datos desde la copia de seguridad en un agente intermedio y ejecute nuevamente la evaluación multi-sesión de referencia. Las copias de seguridad que nunca se han restaurado no existen en la práctica. Los agentes que recuerdan a los usuarios conllevan una promesa implícita; la práctica de ingeniería debe cumplir con esa promesa en situaciones de fallo, y no solo durante la emoción de la semana de lanzamiento.

De boceto a realidad multi-arrendatario

El código de los tutoriales suele almacenar a todos los usuarios en una sola colección con un campo de metadatos que nadie filtra. En producción, aplique la isolación entre arrendatarios en la capa de consultas: cada operación de inserción o actualización, así como cada búsqueda de similitud, debe incluir al usuario autenticado como filtro obligatorio, y no como una indicación opcional de metadatos. Agregue pruebas de integración que intenten realizar búsquedas entre arrendatarios diferentes y esperen cero resultados. Combine esto con claves de cifrado por arrendatario cuando lo exijan las regulaciones, incluso si eso aumenta el costo operativo.

Los ganchos de ciclo de vida pertenecen al ámbito de la isolación. Cuando se elimina un espacio de trabajo, se deben programar eliminaciones en cascada para los vectores, nodos del grafo y resúmenes almacenados en caché, y luego verificar que las cantidades lleguen a cero. Cuando un usuario exporta datos, se debe generar un paquete legible por máquinas que contenga los registros con marcas de tiempo e IDs de los mensajes originales, para que pueda impugnarlos o migrarlos. Estos procesos son tediosos y son precisamente lo que diferencia una nota de ejemplo de RAG de un sistema en el que la gente confiará su contexto personal.

En cuanto al modelo, es preferible citar los IDs de las memorias recuperadas en blocs de notas ocultos o resultados estructurados de herramientas, de modo que la respuesta visible pueda indicar “porque usted nos dijo X el pasado abril” con un rastro trazable. Las citaciones también aceleran las investigaciones de contaminación: una memoria defectuosa tiene un ID con el que poder actuar. Con el paso de los meses, esa disciplina operativa es más importante que cualquier elección específica de proveedor de base de datos vectorial.

Lista de verificación resumida antes de considerar que la memoria está “listo”

Confirme que tanto las rutas a corto como a largo plazo sean observables; confirme que los embeddings y el procesamiento en bloques tengan un responsable asignado; confirme que las operaciones de eliminación y exportación funcionen en un tenant de pruebas; confirme que las evaluaciones detecten el recuerdo entre sesiones y la fuga de información entre usuarios; confirme que los paneles de control de costos incluyan la información de recuperación. Si alguna casilla está sin marcar, el agente aún no cuenta con memoria: solo tiene una base de datos vectorial que parece esperanza. Marque las casillas y luego proceda con el envío. Revísela cada trimestre a medida que cambien los modelos, las regulaciones y las promesas del producto, ya que los sistemas de memoria acumulan obligaciones más rápido que casi cualquier otro subsistema del agente.

Eduque a los equipos de soporte sobre los tickets relacionados con el almacenamiento en memoria: los usuarios que dicen “me ha olvidado” necesitan un análisis por hilo de conversación en lugar de una diagnosis del sistema; los usuarios que dicen “recuerda demasiado” requieren procedimientos de eliminación y conservación de datos. Proporcione guías para el soporte con las herramientas administrativas exactas para inspeccionar los espacios de nombres de forma segura. La arquitectura técnica solo rinde frutos cuando las personas ajenas al equipo de ingeniería pueden operarla sin tener que crear hojas de cálculo ocultas con las preferencias de los usuarios.

Coordinar todos los elementos en un mismo cronograma

Semana uno: memoria de búfer y registro detallado de comandos. Semana dos: inserciones vectoriales con filtros por arrendatario y un pequeño conjunto de referencia ideal. Semana tres: APIs de eliminación/exportación y un manual de soporte. Semana cuatro: clasificación híbrida entre entidades estructuradas y vecinos no estructurados, además de paneles de control de costos. Saltarse directamente a flujos de memoria avanzados antes de implementar el aislamiento por arrendatario convierte las demostraciones en una carga. La secuencia es más importante que la novedad. Cada semana debería terminar con una verificación medible que otra persona pueda repetir sin la presencia del primer implementador, ya que los sistemas de memoria sobreviven al sprint en el que se introdujeron y serán operados por personas que nunca vieron las primeras notas de diseño.

Otra revisión sobre contaminación y deriva

Programar auditorías periódicas que tomen muestras de los recuerdos recuperados de un grupo aleatorio y las evalúen en cuanto a antigüedad, contradicciones y sensibilidad. Incorporar los fallos en el filtro de escritura. Los recuerdos se desvían al igual que cualquier conjunto de datos; sin auditorías, silenciosamente se convierten en ficciones que el modelo trata como hechos. Asignar tiempo de ingeniería para esa tarea de la misma manera que se asigna presupuesto para actualizaciones de integración, ya que ambas protegen la calidad de las respuestas de formas en las que los simples ajustes de prompts no pueden hacerlo.

Cuando se establecen esas prácticas, ampliar las ventanas de contexto pasa a ser un complemento en lugar de un sustituto: la ventana se encarga del turno actual, mientras que el almacenamiento externo gestiona todo lo que debe perdurar más allá de él. Esa división del trabajo es la lección clave para crear agentes confiables a lo largo de semanas, no solo entre mensajes.

Lecturas relacionadas

  • Triaje de flotas con LangGraph: cortocircuito de emergencia antes de las diagnósticas RAG — Los informes de vehículos por WhatsApp requieren primero un triaje; las órdenes de parada de emergencia omiten la recuperación de datos, mientras que los síntomas normales activan los manuales, la generación con Llama y la evaluación de fidelidad.