Memoria & RAG

Hay varios casos de uso donde resulta valioso mantener un almacén de hechos útiles que puedan añadirse inteligentemente al contexto del agente justo antes de un paso específico. El caso típico aquí es un patrón RAG, donde una consulta se utiliza para recuperar información relevante de una base de datos que luego se añade al contexto del agente.

Saptiva-Agents proporciona un protocolo de memoria llamado Memory que se puede extender para proporcionar esta funcionalidad. Los métodos clave son query, update_context, add, clear y close.

  • add: agrega nuevas entradas al almacén de memoria

  • query: recupera información relevante del almacén de memoria

  • update_context: modifica el model_context interno del agente agregando la información recuperada (utilizado en la clase AssistantAgent)

  • clear: borra todas las entradas del almacén de memoria

  • close: limpia cualquier recurso utilizado por el almacén de memoria


Ejemplo de ListMemory

ListMemory es una implementación de ejemplo del protocolo Memory. Es una implementación simple basada en una lista que mantiene los recuerdos en orden cronológico, agregando los más recientes al contexto del modelo. Esta implementación es directa y predecible, lo que facilita su comprensión y depuración.

from saptiva_agents import SAPTIVA_LEGACY
from saptiva_agents.agents import AssistantAgent
from saptiva_agents.ui import Console
from saptiva_agents.memory import ListMemory, MemoryContent, MemoryMimeType
from saptiva_agents.base import SaptivaAIChatCompletionClient
# Inicializar la memoria del usuario
user_memory = ListMemory()

# Agregar preferencias del usuario a la memoria
await user_memory.add(MemoryContent(content="The weather should be in metric units", mime_type=MemoryMimeType.TEXT))

await user_memory.add(MemoryContent(content="Meal recipe must be vegan", mime_type=MemoryMimeType.TEXT))


async def get_weather(city: str, units: str = "imperial") -> str:
    if units == "imperial":
        return f"The weather in {city} is 73 °F and Sunny."
    elif units == "metric":
        return f"The weather in {city} is 23 °C and Sunny."
    else:
        return f"Sorry, I don't know the weather in {city}."


assistant_agent = AssistantAgent(
    name="assistant_agent",
    model_client=SaptivaAIChatCompletionClient(
        model=SAPTIVA_LEGACY,
        api_key="TU_SAPTIVA_API_KEY",
    ),
    tools=[get_weather],
    memory=[user_memory],
)

Podemos inspeccionar que el model_context del assistant_agent se actualiza realmente con las entradas de memoria recuperadas. El método transform se utiliza para formatear dichas entradas en una cadena de texto que pueda ser utilizada por el agente. En este caso, simplemente concatenamos el contenido de cada entrada de memoria en una única cadena.

Vemos arriba que el clima se devuelve en grados centígrados, tal como se indica en las preferencias del usuario.

De manera similar, si asumimos que hacemos una pregunta distinta sobre generar un plan de comidas, el agente es capaz de recuperar información relevante de la memoria y proporcionar una respuesta personalizada (vegana).


Almacenes de Memoria Personalizados (Bases de Datos Vectoriales, etc.)

Puedes construir tu propia implementación del protocolo Memory para incorporar almacenes más complejos. Por ejemplo, un almacén que use una base de datos vectorial para recuperar información similar, o incluso un modelo de aprendizaje automático para personalizar respuestas.

Debes sobrecargar los métodos add, query y update_context, y luego pasar ese almacén personalizado al agente.

Actualmente, los siguientes almacenes de memoria están disponibles como parte del paquete de Saptiva-Agents:

  • saptiva_agents.memory.chromadb.ChromaDBVectorMemory: Un almacenamiento de memoria que utiliza una base de datos vectorial para guardar y recuperar información.

  • saptiva_agents.memory.chromadb.SentenceTransformerEmbeddingFunctionConfig: Una clase de configuración para la función de embedding de SentenceTransformer utilizada por el almacenamiento ChromaDBVectorMemory.

También puedes serializar la memoria ChromaDBVectorMemory y guardarla en disco para reutilizarla más adelante:


Redis Memory

Puedes realizar el mismo almacenamiento persistente en memoria utilizando Redis. Ten en cuenta que necesitarás tener una instancia de Redis en ejecución para poder conectarte.

Puedes correr Redis localmente o via Docker.


Agente RAG: Unificándolo Todo

El patrón RAG (Retrieval Augmented Generation), común en la construcción de sistemas de IA, abarca dos fases distintas:

  1. Indexación: Cargar documentos, dividirlos en fragmentos (chunking) y almacenarlos en una base de datos vectorial.

  2. Recuperación: Buscar y utilizar fragmentos relevantes durante el tiempo de ejecución de una conversación.

En nuestros ejemplos anteriores, agregamos elementos manualmente a la memoria y los pasamos a nuestros agentes. En la práctica, el proceso de indexación suele estar automatizado y se basa en fuentes documentales mucho más grandes como documentación de productos, archivos internos o bases de conocimiento.

Nota: La calidad de un sistema RAG depende directamente de la calidad del proceso de segmentación (chunking) y recuperación de la información (modelos, embeddings, etc.).


Creación de un agente RAG sencillo

Primero, creamos un indexador simple de documentos para cargarlos, segmentarlos en partes (chunks) y almacenarlos en una memoria ChromaDBVectorMemory.

Ahora usemos nuestro indexador junto con ChromaDBVectorMemory para crear un agente RAG completo:

Esta implementación proporciona un agente RAG capaz de responder preguntas basadas en la documentación de AutoGen. Cuando se realiza una consulta, el sistema de memoria recupera fragmentos relevantes y los agrega al contexto, lo que permite al asistente generar respuestas fundamentadas.

Para entornos de producción, podrías considerar:

  • Implementar estrategias de segmentación (chunking) más sofisticadas.

  • Añadir capacidades de filtrado por metadatos.

  • Personalizar el sistema de puntuación de recuperación.

  • Optimizar los modelos de embedding para tu dominio específico.


Ejemplo con Mem0Memory

saptiva_agents.memory.mem0.Mem0Memory proporciona integración con el sistema de memoria de Mem0.ai, compatible tanto con entornos en la nube como locales. Ofrece capacidades avanzadas de memoria para agentes, incluyendo recuperación eficiente y actualización automática del contexto, lo que lo hace ideal para entornos de producción.

En el siguiente ejemplo se demuestra cómo usar Mem0Memory para mantener memorias persistentes entre conversaciones:

El ejemplo anterior demuestra cómo puede usarse Mem0Memory junto con un agente asistente. La integración de memoria garantiza que:

  • Todas las interacciones del agente se almacenen en Mem0 para referencia futura.

  • Las memorias relevantes (como las preferencias del usuario) se recuperen automáticamente y se agreguen al contexto.

  • El agente mantenga un comportamiento consistente basado en las memorias almacenadas.

Mem0Memory es especialmente útil para:

  • Despliegues de agentes de larga duración que requieren memoria persistente.

  • Aplicaciones que necesitan controles de privacidad más avanzados.

  • Equipos que buscan una gestión de memoria unificada entre múltiples agentes.

  • Casos de uso que requieren filtrado avanzado de memoria y análisis.

Al igual que con ChromaDBVectorMemory, también puedes serializar las configuraciones de Mem0Memory:

Última actualización