Despliega Agentes de IA con memoria a largo plazo a Producción en 15 Minutos (Sin Docker, Sin Kubernetes, Sin Dolor de Cabeza)


🇻🇪🇨🇱 Dev.to LinkedIn GitHub Twitter Instagram YouTube

Parte 2 de la Serie AgentCore



🧠 El Problema de la Memoria Entre Sesiones

Desplegaste tu primer agente de IA en producción con AgentCore Runtime. Funciona perfectamente dentro de las conversaciones.

AgentCore Runtime ya proporciona memoria a corto plazo – tu agente recuerda el contexto dentro de la misma sesión (hasta 8 horas o 15 minutos de inactividad).

Pero esto es lo que pasa cuando los usuarios regresan:

  • Nueva sesión inicia → El agente olvida todo 😤
  • Preferencias del usuario perdidas → Sin personalización entre visitas 🤦
  • Insights previos desaparecidos → Cada interacción empieza desde cero 📝
  • Sin aprendizaje entre sesiones → Las mismas preguntas respondidas repetidamente 🔄

Tu agente tiene amnesia entre sesiones. Cada nuevo ID de sesión significa empezar de nuevo, incluso para el mismo ID de usuario.

Amazon Bedrock AgentCore Memory resuelve esto. Tus agentes recuerdan a los usuarios entre sesiones, aprenden de interacciones pasadas y proporcionan experiencias personalizadas que persisten más allá de los límites de sesión.

Este tutorial te muestra cómo agregar memoria inteligente a largo plazo a tus agentes.



🧠 Arquitectura de Memoria Explicada



AgentCore Runtime (Integrado)

  • Memoria de sesión – Contexto dentro de conversaciones (automático)
  • Persistencia de contenedor – Hasta 8 horas o 15 minutos de inactividad
  • Mismo ID de sesión – Historial completo de conversación mantenido



AgentCore Memory (Este Tutorial)

  • Persistencia entre sesiones – Recordar entre diferentes IDs de sesión
  • Extracción a largo plazo – Insights clave almacenados automáticamente
  • Almacenamiento centrado en el usuario – Mismo ID de usuario, diferentes sesiones
  • Recuperación inteligente – Contexto relevante cuando se necesita



Prerrequisitos

Antes de comenzar, verifica que tengas:

  • Cuenta de AWS con permisos apropiados
  • Entorno Python 3.10+
  • AWS CLI configurado con aws configure

Los nuevos clientes de AWS reciben hasta $200 en créditos

Comienza sin costo con AWS Free Tier. Obtén $100 USD al registrarte más $100 USD adicionales explorando servicios clave.



Agreguemos memoria entre sesiones a tus agentes. 🧠

Hoja de Ruta del Tutorial:

Configuración ⚙️ → Codificar Agente 💻 → Probar Memoria ✅ → Desplegar 🚀 → Validar 🔍

Tiempo estimado: 20 minutos



Instalar Dependencias

pip install -r requirements.txt
Enter fullscreen mode

Exit fullscreen mode

Paquetes requeridos:

bedrock-agentcore
strands-agents
strands-agents-tools
Enter fullscreen mode

Exit fullscreen mode



Implementación del Agente con Memoria Entre Sesiones



Configuración de Memoria y Creación del Agente

"""
Agente de IA Listo para Producción con Memoria
Recuerda conversaciones y preferencias del usuario entre sesiones
"""
import os
from strands import Agent
from strands_tools import calculator
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig, RetrievalConfig
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager

app = BedrockAgentCoreApp()

MEMORY_ID = os.getenv("BEDROCK_AGENTCORE_MEMORY_ID")
REGION = os.getenv("AWS_REGION", "us-west-2")
MODEL_ID = "us.anthropic.claude-3-7-sonnet-20250219-v1:0"

# Instancia global del agente
_agent = None

def get_or_create_agent(actor_id: str, session_id: str) -> Agent:
    """
    Obtener agente existente o crear uno nuevo con configuración de memoria.
    Como el contenedor está vinculado al ID de sesión, solo necesitamos un agente por contenedor.
    """
    global _agent

    if _agent is None:
        # Configurar memoria con recuperación para hechos y preferencias del usuario
        memory_config = AgentCoreMemoryConfig(
            memory_id=MEMORY_ID,
            session_id=session_id,
            actor_id=actor_id,
            retrieval_config={
                f"/users/{actor_id}/facts": RetrievalConfig(top_k=3, relevance_score=0.5),
                f"/users/{actor_id}/preferences": RetrievalConfig(top_k=3, relevance_score=0.5)
            }
        )

        # Crear agente con administrador de sesión de memoria
        _agent = Agent(
            model=MODEL_ID,
            session_manager=AgentCoreMemorySessionManager(memory_config, REGION),
            system_prompt="Eres un asistente útil con memoria. Recuerda las preferencias del usuario y hechos entre conversaciones. Usa la herramienta de cálculo para problemas matemáticos.",
            tools=[calculator]
        )

    return _agent
Enter fullscreen mode

Exit fullscreen mode



Punto de Entrada de AgentCore

@app.entrypoint
def invoke(payload, context):
    """Punto de entrada de AgentCore Runtime con agente de carga perezosa"""
    if not MEMORY_ID:
        return {"error": "Memoria no configurada. Establece la variable de entorno BEDROCK_AGENTCORE_MEMORY_ID."}

    # Extraer información de sesión y actor
    actor_id = context.request_headers.get('X-Amzn-Bedrock-AgentCore-Runtime-Custom-Actor-Id', 'user') if context.request_headers else 'user'
    session_id = context.session_id or 'default_session'

    # Obtener o crear agente (carga perezosa)
    agent = get_or_create_agent(actor_id, session_id)

    prompt = payload.get("prompt", "¡Hola!")
    result = agent(prompt)

    return {
        "response": result.message.get('content', [{}])[0].get('text', str(result))
    }

if __name__ == "__main__":
    app.run()
Enter fullscreen mode

Exit fullscreen mode



Estrategias de Memoria

AgentCore Memory proporciona tres estrategias integradas para diferentes casos de uso:



Estrategia de Preferencias del Usuario

Identifica y extrae automáticamente las preferencias, elecciones y estilos del usuario de las conversaciones. Esto crea un perfil persistente de cada usuario para interacciones personalizadas.

Ejemplo: Un agente de comercio electrónico recuerda las marcas favoritas del usuario y el tamaño preferido, ofreciendo recomendaciones de productos personalizadas en sesiones futuras.



Estrategia Semántica

Identifica y extrae información factual clave y conocimiento contextual de las conversaciones. Esto construye una base de conocimiento persistente sobre entidades importantes, eventos y detalles.

Ejemplo: Un agente de soporte al cliente recuerda que el pedido #ABC-123 se relaciona con un ticket de soporte específico, por lo que no necesitas proporcionar el número de pedido nuevamente.



Estrategia de Resúmenes de Sesión

Crea resúmenes condensados y continuos de conversaciones dentro de una sola sesión. Esto captura temas clave y decisiones para una rápida recuperación de contexto.

Ejemplo: Después de una sesión de resolución de problemas de 30 minutos, el agente accede a un resumen: “El usuario reportó un problema con el software v2.1, intentó un reinicio y se le proporcionó un enlace al artículo de la base de conocimientos.”

Para casos de uso avanzados, puedes configurar estrategias personalizadas con anulaciones para ajustar finamente la extracción de memoria con tus propios prompts y modelos de fundación.



Probar Memoria Localmente

Inicia tu agente habilitado con memoria:

python my_agent_memory.py
Enter fullscreen mode

Exit fullscreen mode

Prueba dentro de la sesión (Runtime maneja esto automáticamente):

curl -X POST http://localhost:8080/invocations \
  -H "Content-Type: application/json" \
  -d '{"prompt": "Mi nombre es Juan y me encanta la pizza"}'

curl -X POST http://localhost:8080/invocations \
  -H "Content-Type: application/json" \
  -d '{"prompt": "¿Qué recuerdas sobre mí?"}'
Enter fullscreen mode

Exit fullscreen mode



Desplegar con Memoria Entre Sesiones

Despliega tu agente habilitado con memoria:



Configurar Agente

agentcore configure -e my_agent_memory.py
Enter fullscreen mode

Exit fullscreen mode

Selecciona ‘sí’ para memoria cuando se te pregunte

Selecciona ‘sí’ para extracción de memoria a largo plazo



Lanzar a Producción

agentcore launch
Enter fullscreen mode

Exit fullscreen mode

AgentCore automáticamente:

  • Crea almacén de memoria entre sesiones
  • Configura pipelines de extracción a largo plazo
  • Establece persistencia centrada en el usuario
  • Proporciona endpoint de producción



Probar Memoria Entre Sesiones en Producción



Prueba de Memoria a Corto Plazo (Misma Sesión)

import json
import uuid
import boto3

def test_short_memory(agent_arn, region=None):
    """Probar memoria a corto plazo dentro de una sola sesión"""

    # Extraer región del ARN si no se proporciona
    if not region:
        region = agent_arn.split(':')[3]

    # Inicializar cliente
    client = boto3.client('bedrock-agentcore', region_name=region)

    # Generar ID de sesión
    session_id = str(uuid.uuid4())

    print(f"Probando memoria a corto plazo en sesión: {session_id}")
    print(f"Región: {region}")
    print("-" * 50)

    try:
        # Primer mensaje - establecer contexto
        print("Mensaje 1: Estableciendo contexto...")
        payload1 = json.dumps({"prompt": "Mi nombre es Alicia y me gusta el helado de chocolate"}).encode()

        response1 = client.invoke_agent_runtime(
            agentRuntimeArn=agent_arn,
            runtimeSessionId=session_id,
            payload=payload1,
            qualifier="DEFAULT"
        )

        content1 = []
        for chunk in response1.get("response", []):
            content1.append(chunk.decode('utf-8'))

        result1 = json.loads(''.join(content1))
        print(f"Agente: {result1.get('response', 'Sin respuesta')}")
        print()

        # Segundo mensaje - probar recuperación de memoria
        print("Mensaje 2: Probando recuperación de memoria...")
        payload2 = json.dumps({"prompt": "¿Cuál es mi nombre y qué me gusta?"}).encode()

        response2 = client.invoke_agent_runtime(
            agentRuntimeArn=agent_arn,
            runtimeSessionId=session_id,  # Misma sesión
            payload=payload2,
            qualifier="DEFAULT"
        )

        content2 = []
        for chunk in response2.get("response", []):
            content2.append(chunk.decode('utf-8'))

        result2 = json.loads(''.join(content2))
        print(f"Agente: {result2.get('response', 'Sin respuesta')}")

        print("\n✓ Prueba de memoria a corto plazo completada")

    except Exception as e:
        print(f"Error: {e}")
Enter fullscreen mode

Exit fullscreen mode

Ejecuta la prueba:

python test_short_memory.py "AGENT_ARN"
Enter fullscreen mode

Exit fullscreen mode



Prueba de Memoria a Largo Plazo (Diferentes Sesiones)

import json
import uuid
import boto3
import time

def test_long_memory(agent_arn, region=None):
    """Probar memoria a largo plazo entre diferentes sesiones"""

    # Extraer región del ARN si no se proporciona
    if not region:
        region = agent_arn.split(':')[3]

    # Inicializar cliente
    client = boto3.client('bedrock-agentcore', region_name=region)

    # Generar IDs de sesión
    session_1 = str(uuid.uuid4())
    session_2 = str(uuid.uuid4())

    print(f"Probando memoria a largo plazo entre sesiones")
    print(f"Región: {region}")
    print("-" * 50)

    try:
        # Sesión 1: Almacenar información del usuario
        print(f"Sesión 1: {session_1}")
        print("Almacenando preferencias del usuario...")

        payload1 = json.dumps({"prompt": "Mi nombre es Sara y soy ingeniera de software. Prefiero Python sobre JavaScript."}).encode()

        response1 = client.invoke_agent_runtime(
            agentRuntimeArn=agent_arn,
            runtimeSessionId=session_1,
            payload=payload1,
            qualifier="DEFAULT"
        )

        content1 = []
        for chunk in response1.get("response", []):
            content1.append(chunk.decode('utf-8'))

        result1 = json.loads(''.join(content1))
        print(f"Agente: {result1.get('response', 'Sin respuesta')}")
        print()

        # Esperar extracción de memoria a largo plazo
        print("Esperando 25 segundos para extracción de memoria a largo plazo...")
        time.sleep(25)

        # Sesión 2: Probar recuperación de memoria
        print(f"Sesión 2: {session_2}")
        print("Probando recuperación de memoria entre sesiones...")

        payload2 = json.dumps({"prompt": "¿Qué recuerdas sobre mí? ¿Cuál es mi nombre y qué prefiero?"}).encode()

        response2 = client.invoke_agent_runtime(
            agentRuntimeArn=agent_arn,
            runtimeSessionId=session_2,  # Sesión diferente
            payload=payload2,
            qualifier="DEFAULT"
        )

        content2 = []
        for chunk in response2.get("response", []):
            content2.append(chunk.decode('utf-8'))

        result2 = json.loads(''.join(content2))
        print(f"Agente: {result2.get('response', 'Sin respuesta')}")

        print("\n✓ Prueba de memoria a largo plazo completada")

    except Exception as e:
        print(f"Error: {e}")
Enter fullscreen mode

Exit fullscreen mode

Ejecuta la prueba:

python test_long_memory.py "AGENT_ARN"

# O usando variables de entorno
export AGENT_ARN="tu-agent-arn"
python test_long_memory.py
Enter fullscreen mode

Exit fullscreen mode

Esta prueba verifica la persistencia entre sesiones de AgentCore Memory:

  1. Almacena preferencias del usuario en sesión 1
  2. Espera 25 segundos para extracción de memoria a largo plazo
  3. Prueba recuperación en sesión diferente 2 (mismo ID de usuario)
  4. Verifica que la memoria entre sesiones funciona



Operaciones de Gestión de Memoria

AgentCore Memory proporciona capacidades de gestión integrales:



Beneficios de la Arquitectura de Memoria

Solo Runtime Runtime + AgentCore Memory
✅ Contexto de sesión (8 horas) ✅ Contexto de sesión (8 horas)
❌ Perdido después de que termina la sesión ✅ Persistente entre sesiones
❌ Sin aprendizaje del usuario ✅ Preferencias del usuario recordadas
❌ Repetir información ✅ Recuperación inteligente de contexto
❌ Respuestas genéricas ✅ Interacciones personalizadas



Características Clave Entre Sesiones

  • Persistencia del usuario – Mismo ID de usuario, diferentes IDs de sesión recordados
  • Extracción automática – Insights clave almacenados durante conversaciones
  • Recuperación inteligente – Contexto pasado relevante cuando se necesita
  • Aprendizaje de preferencias – Las elecciones del usuario persisten entre visitas
  • Arquitectura escalable – Servicio completamente administrado entre sesiones



Limpiar

Remover todos los recursos:

agentcore destroy
Enter fullscreen mode

Exit fullscreen mode

Esto remueve el despliegue de AgentCore, almacenes de memoria, repositorio ECR, roles IAM y logs de CloudWatch.



🎉 ¡Construiste Agentes de IA con Memoria Entre Sesiones!

Tus agentes ahora recuerdan usuarios entre sesiones, aprenden de interacciones pasadas y proporcionan experiencias personalizadas que persisten más allá de los límites de sesión. ¿Qué aplicaciones inteligentes construirás? 🚀



❤️ Si Esto Te Ayudó

❤️ Dale corazón: ayuda a otros a descubrir este tutorial

🦄 Dale unicornio: si te voló la mente

🔖 Guárdalo: para cuando lo necesites después

📤 Compártelo: con tu equipo o en redes sociales



📚 Recursos

AWS Free Tier:

Mis Otros Tutoriales:

Happy building! 🚀


¡Gracias!

🇻🇪🇨🇱 Dev.to LinkedIn GitHub Twitter Instagram YouTube





Source link

Leave a Reply

Your email address will not be published. Required fields are marked *