Generar recuerdos

Memory Bank te permite crear recuerdos a largo plazo a partir de las conversaciones entre el usuario y tu agente. En esta página se describe cómo funciona la generación de recuerdos, cómo puedes personalizar la forma en que se extraen y cómo activar la generación de recuerdos.

Información sobre la generación de recuerdos

Memory Bank extrae recuerdos de datos de origen y los organiza automáticamente en una colección específica (definida por un scope) añadiendo, actualizando y eliminando recuerdos con el tiempo.

Cuando activas la generación de recuerdos, Memory Bank realiza las siguientes operaciones:

  • Extracción: extrae información sobre el usuario de sus conversaciones con el agente. Solo se conservará la información que coincida con al menos uno de los temas de memoria de tu instancia.

  • Consolidación: identifica si se deben eliminar o actualizar los recuerdos que ya existen con el mismo ámbito en función de la información extraída. Banca de recuerdos comprueba que los recuerdos nuevos no sean duplicados ni contradictorios antes de combinarlos con los que ya tienes. Si los recuerdos que ya tienes no se solapan con la información nueva, se creará un nuevo recuerdo.

Los recuerdos solo se pueden extraer de texto, archivos insertados y datos de archivos del contenido de origen. Todo el contenido restante, incluidas las llamadas a funciones y las respuestas, se ignora al generar recuerdos.

Los recuerdos se pueden extraer de imágenes, vídeos y audios proporcionados por el usuario. Si Memory Bank considera que el contexto proporcionado por la entrada multimodal es significativo para futuras interacciones, se puede crear una memoria textual que incluya información extraída de la entrada. Por ejemplo, si el usuario proporciona una imagen de un golden retriever con el texto "Este es mi perro", Banco de recuerdos genera un recuerdo como "Mi perro es un golden retriever".

Temas de recuerdos

Los "temas de memoria" identifican qué información considera Memory Bank que es significativa y, por lo tanto, debe conservarse como recuerdos generados. Memory Bank admite dos tipos de temas de memoria:

  • Temas gestionados: la etiqueta y las instrucciones las define Memory Bank. Solo tienes que proporcionar el nombre del tema gestionado. Por ejemplo:

    Diccionario

    memory_topic = {
        "managed_memory_topic": {
            "managed_topic_enum": "USER_PERSONAL_INFO"
        }
    }
    

    Basado en clases

    from vertexai.types import ManagedTopicEnum
    from vertexai.types import MemoryBankCustomizationConfigMemoryTopic as MemoryTopic
    from vertexai.types import MemoryBankCustomizationConfigMemoryTopicManagedMemoryTopic as ManagedMemoryTopic
    
    memory_topic = MemoryTopic(
        managed_memory_topic=ManagedMemoryTopic(
            managed_topic_enum=ManagedTopicEnum.USER_PERSONAL_INFO
        )
    )
    
  • Temas personalizados: tú defines la etiqueta y las instrucciones al configurar tu instancia de Memory Bank. Se usarán en la petición del paso de extracción de Memory Bank. Por ejemplo:

    Diccionario

    memory_topic = {
        "custom_memory_topic": {
            "label": "business_feedback",
            "description": """Specific user feedback about their experience at
    the coffee shop. This includes opinions on drinks, food, pastries, ambiance,
    staff friendliness, service speed, cleanliness, and any suggestions for
    improvement."""
        }
    }
    

    Basado en clases

    from vertexai.types import MemoryBankCustomizationConfigMemoryTopic as MemoryTopic
    from vertexai.types import MemoryBankCustomizationConfigMemoryTopicCustomMemoryTopic as CustomMemoryTopic
    
    memory_topic = MemoryTopic(
        custom_memory_topic=CustomMemoryTopic(
            label="business_feedback",
            description="""Specific user feedback about their experience at
    the coffee shop. This includes opinions on drinks, food, pastries, ambiance,
    staff friendliness, service speed, cleanliness, and any suggestions for
    improvement."""
        )
    )
    

    Cuando se usan temas personalizados, se recomienda proporcionar ejemplos con pocos ejemplos para demostrar cómo se deben extraer los recuerdos de la conversación.

De forma predeterminada, Memory Bank conserva todos los temas gestionados siguientes:

  • Información personal (USER_PERSONAL_INFO): información personal importante sobre el usuario, como nombres, relaciones, aficiones y fechas importantes. Por ejemplo, "Trabajo en Google" o "Mi aniversario de boda es el 31 de diciembre".
  • Preferencias de los usuarios (USER_PREFERENCES): gustos, rechazos, estilos o patrones preferidos, ya sean explícitos o implícitos. Por ejemplo, "Prefiero el asiento del medio".
  • Eventos clave de la conversación y resultados de las tareas (KEY_CONVERSATION_DETAILS): hitos o conclusiones importantes de la conversación. Por ejemplo, "He reservado billetes de avión de ida y vuelta entre JFK y SFO. Me voy el 1 de junio del 2025 y vuelvo el 7 de junio del 2025".
  • Instrucciones explícitas para recordar o olvidar (EXPLICIT_INSTRUCTIONS): información que el usuario pide explícitamente al agente que recuerde o que olvide. Por ejemplo, si el usuario dice "Recuerda que uso principalmente Python", Memory Bank genera un recuerdo como "Uso principalmente Python".

Es lo mismo que usar el siguiente conjunto de temas de memoria gestionada:

Diccionario

  memory_topics = [
      {"managed_memory_topic": {"managed_topic_enum": "USER_PERSONAL_INFO"}},
      {"managed_memory_topic": {"managed_topic_enum": "USER_PREFERENCES"}},
      {"managed_memory_topic": {"managed_topic_enum": "KEY_CONVERSATION_DETAILS"}},
      {"managed_memory_topic": {"managed_topic_enum": "EXPLICIT_INSTRUCTIONS"}},
  ]

Basado en clases

from vertexai.types import ManagedTopicEnum
from vertexai.types import MemoryBankCustomizationConfigMemoryTopic as MemoryTopic
from vertexai.types import MemoryBankCustomizationConfigMemoryTopicManagedMemoryTopic as ManagedMemoryTopic

memory_topics = [
  MemoryTopic(
      managed_memory_topic=ManagedMemoryTopic(
          managed_topic_enum=ManagedTopicEnum.USER_PERSONAL_INFO)),
  MemoryTopic(
      managed_memory_topic=ManagedMemoryTopic(
          managed_topic_enum=ManagedTopicEnum.USER_PREFERENCES)),
  MemoryTopic(
      managed_memory_topic=ManagedMemoryTopic(
          managed_topic_enum=ManagedTopicEnum.KEY_CONVERSATION_DETAILS)),
  MemoryTopic(
      managed_memory_topic=ManagedMemoryTopic(
          managed_topic_enum=ManagedTopicEnum.EXPLICIT_INSTRUCTIONS)),
]

Si quieres personalizar los temas que Memory Bank conserva, define los temas de la memoria en tu configuración de personalización al configurar Memory Bank.

Generar recuerdos

Para completar los pasos que se muestran en esta guía, primero debes seguir los pasos de Configuración de Memory Bank.

Puedes activar la generación de recuerdos con GenerateMemories al final de una sesión o a intervalos regulares durante una sesión. La generación de recuerdos extrae el contexto clave de las conversaciones de origen y lo combina con los recuerdos existentes del mismo ámbito. Por ejemplo, puedes crear recuerdos a nivel de sesión usando un ámbito como {"user_id": "123", "session_id": "456"}. Los recuerdos con el mismo ámbito se pueden consolidar y recuperar juntos.

Cuando llames a GenerateMemories, debes proporcionar la conversación de origen a través de sesiones de Agent Engine o directamente en formato JSON:

Formato JSON

Proporciona la conversación de origen directamente en formato JSON si utilizas un almacenamiento de sesiones diferente al de Agent Engine Sessions:

client.agent_engines.memories.generate(
    name=agent_engine.api_resource.name,
    direct_contents_source={
      "events": EVENTS
    },
    scope=SCOPE,
    config={
        "wait_for_completion": True
    }
)

Haz los cambios siguientes:

  • EVENTS: lista de diccionarios de contenido. Por ejemplo:
[
  {
    "content": {
      "role": "user",
      "parts": [
        {"text": "I'm work with LLM agents!"}
      ]
    }
  }
]
  • SCOPE: diccionario que representa el ámbito de los recuerdos generados. Por ejemplo, {"session_id": "MY_SESSION"}. Solo se tienen en cuenta para la consolidación los recuerdos que tengan el mismo ámbito.

Sesiones de Agent Engine

Con las sesiones de Agent Engine, Memory Bank usa los eventos de sesión como conversación de origen para generar la memoria.

Para acotar las memorias generadas, Memory Bank extrae y usa el ID de usuario de la sesión de forma predeterminada. Por ejemplo, el ámbito de los recuerdos se almacena como {"user_id": "123"} si el user_id de la sesión es "123". También puedes proporcionar un scope directamente, lo que anula el uso del user_id de la sesión como ámbito.

client.agent_engines.memories.generate(
  name=agent_engine.api_resource.name,
  vertex_session_source={
    "session": "SESSION_NAME"
  },
  # Optional when using Agent Engine Sessions. Defaults to {"user_id": session.user_id}.
  scope=SCOPE,
  config={
      "wait_for_completion": True
  }
)

Haz los cambios siguientes:

  • SESSION_NAME: el nombre de la sesión.

  • (Opcional) SCOPE: un diccionario que representa el ámbito de los recuerdos generados. Por ejemplo, {"session_id": "MY_SESSION"}. Solo se tienen en cuenta para la consolidación los recuerdos que tengan el mismo ámbito. Si no se proporciona, se usa {"user_id": session.user_id}.

GenerateMemories es una operación de larga duración. Una vez completada la operación, el AgentEngineGenerateMemoriesOperation contendrá una lista de los recuerdos generados, si se ha generado alguno:

AgentEngineGenerateMemoriesOperation(
  name="projects/.../locations/.../reasoningEngines/.../operations/...",
  done=True,
  response=GenerateMemoriesResponse(
    generatedMemories=[
      GenerateMemoriesResponseGeneratedMemory(
        memory=Memory(
          "name": "projects/.../locations/.../reasoningEngines/.../memories/..."
        ),
        action="CREATED",
      ),
      GenerateMemoriesResponseGeneratedMemory(
        memory=Memory(
          "name": "projects/.../locations/.../reasoningEngines/.../memories/..."
        ),
        action="UPDATED",
      ),
      GenerateMemoriesResponseGeneratedMemory(
        memory=Memory(
          "name": "projects/.../locations/.../reasoningEngines/.../memories/..."
        ),
        action="DELETED",
      ),
    ]
  )
)

Cada recuerdo generado incluye la action que se ha realizado en él:

  • CREATED: indica que se ha añadido un nuevo recuerdo, que representa un concepto nuevo que no se había capturado en los recuerdos anteriores.
  • UPDATED: indica que se ha actualizado una memoria, lo que ocurre si la memoria abarca conceptos similares a la información recién extraída. El dato de la memoria puede actualizarse con información nueva o seguir siendo el mismo.
  • DELETED: indica que se ha eliminado la memoria porque su información era contradictoria con la nueva información extraída de la conversación.

En el caso de los recuerdos CREATED o UPDATED, puedes usar GetMemories para recuperar el contenido completo del recuerdo. Al recuperar DELETED recuerdos, se produce un error 404.

Generar recuerdos en segundo plano

GenerateMemories es una operación de larga duración. De forma predeterminada, client.agent_engines.generate_memories es una función de bloqueo y seguirá sondeando la operación hasta que se complete. Ejecutar la generación de recuerdos como una operación de bloqueo es útil cuando quieres inspeccionar manualmente los recuerdos generados o cuando quieres informar a los usuarios finales sobre los recuerdos que se han generado.

Sin embargo, en el caso de los agentes de producción, lo habitual es ejecutar la generación de memoria en segundo plano como un proceso asíncrono. En la mayoría de los casos, el cliente no necesita usar el resultado de la ejecución actual, por lo que no es necesario incurrir en una latencia adicional esperando una respuesta. Si quieres que la generación de memoria se ejecute en segundo plano, define wait_for_completion como False:

client.agent_engines.memories.generate(
    ...,
    config={
        "wait_for_completion": False
    }
)

Consolidando recuerdos preextraídos

Como alternativa al proceso de extracción automática de Recuerdos, puedes proporcionar directamente los recuerdos ya extraídos. Los recuerdos de fuentes directas se combinarán con los recuerdos que ya haya del mismo ámbito. Esto puede ser útil cuando quieras que tu agente o un humano sea responsable de extraer recuerdos, pero sigas queriendo aprovechar la consolidación de Memory Bank para asegurarte de que no haya recuerdos duplicados o contradictorios.

client.agent_engines.memories.generate(
    name=agent_engine.api_resource.name,
    direct_memories_source={"direct_memories": [{"fact": "FACT"}]},
    scope=SCOPE
)

Haz los cambios siguientes:

  • FACT: el hecho preextraído que se debe consolidar con los recuerdos existentes. Puedes proporcionar hasta 5 datos preextraídos en una lista como la siguiente:

    {"direct_memories": [{"fact": "fact 1"}, {"fact": "fact 2"}]}
    
  • SCOPE: diccionario que representa el ámbito de los recuerdos generados. Por ejemplo, {"session_id": "MY_SESSION"}. Solo se tienen en cuenta para la consolidación los recuerdos que tengan el mismo ámbito.

Siguientes pasos