Revisiones de memoria

En esta página se describe cómo se crean y gestionan los recursos de revisión de memoria de Vertex AI Agent Engine Memory Bank.

Ciclo de vida de un recuerdo y sus revisiones

Fuentes de datos y revisiones de memoria

Las memorias se pueden crear, actualizar o eliminar directamente (con CreateMemory, UpdateMemory o DeleteMemory, respectivamente) o de forma dinámica (con GenerateMemories). Los recursos de revisión de memoria proporcionan un historial de versiones completo de un recurso de memoria en todas las operaciones de mutación. Cada vez que se crea o se modifica la memoria, se guarda automáticamente una revisión nueva e inmutable. De esta forma, puedes ver cómo ha evolucionado un recuerdo y (en el caso de la generación de recuerdos) qué información específica se ha extraído y consolidado en cada paso.

Cada recurso de memoria tiene uno o varios recursos de revisión de memoria secundarios asociados:

  • Los recursos de Memory siempre reflejan el estado actual y consolidado de la información. Una sola memoria puede reflejar datos derivados de varias solicitudes y fuentes de datos.

    Memory(
        create_time=datetime.datetime(...),
        fact='This is my current memory content after consolidation',
        name='projects/.../locations/.../reasoningEngines/../memories/...',
        scope={
          'my_scope_key': 'my_scope_value'
        },
        topics=[
          MemoryTopicId(
            managed_memory_topic=<ManagedTopicEnum.USER_PERSONAL_INFO: 'USER_PERSONAL_INFO'>
          ),
        ],
        update_time=datetime.datetime(...)
    )
    
  • Los recursos MemoryRevisions representan los estados históricos de la memoria principal. Cada revisión es una instantánea de la memoria en un evento de mutación. Si se ha modificado una memoria con GenerateMemories, la revisión también incluye la información que se ha extraído de la fuente de datos (extracted_memories) antes de consolidarse con el contenido de la memoria.

    MemoryRevision(
        create_time=datetime.datetime(...),
        expire_time=datetime.datetime(...),
        extracted_memories=[
          IntermediateExtractedMemory(
            fact='This information was extracted from my data source'
          ),
        ],
        fact='This is my current memory content after consolidation',
        name='projects/.../locations/.../reasoningEngines/.../memories/.../revisions/...'
    )
    

Las revisiones de la memoria están habilitadas de forma predeterminada. Para inhabilitar las revisiones de recuerdos, consulta Inhabilitar las revisiones de recuerdos.

Creación de recuerdos

Los recuerdos se pueden crear directamente con CreateMemory o de forma dinámica con GenerateMemories. Con la generación de memoria, se crea una memoria si no hay ninguna que cubra información similar en el mismo ámbito:

# Direct creation using CreateMemory
client.agent_engines.memories.create(name=agent_engine_name, ...)

# Dynamic creation using GenerateMemory
client.agent_engines.memories.generate_memories(name=agent_engine_name, ...)

Cuando se crea un recuerdo, se crean un recurso Memory y un elemento secundario MemoryRevision:

client.agent_engines.memories.get(name=memory_name)
"""
Memory(
  name="projects/123/locations/us-central1/reasoningEngines/456/memories/789",
  fact="This is my original fact.",
  ...
)
"""

list(client.agent_engines.memories.revisions.list(name=memory_name))
"""
[
  MemoryRevision(
    name="projects/123/locations/us-central1/reasoningEngines/456/memories/789/revision/123",
    fact="This is my original fact",
    ...
  )
]
"""

Actualización de la memoria

Los recuerdos se pueden actualizar directamente con UpdateMemory o de forma dinámica con GenerateMemories. Con la generación de memoria, los recuerdos se actualizan de forma dinámica cuando el proceso de consolidación determina que la información nueva es duplicada, complementaria o contradictoria con todos los recuerdos existentes del mismo ámbito.

# Direct update using UpdateMemory
client.agent_engines.memories.update(name=memory_name, ...)

# Dynamic update using GenerateMemories
client.agent_engines.memories.generate_memories(name=agent_engine_name, ...)

Cuando se actualiza un recuerdo, se actualiza el recurso Memory y se crea un nuevo recurso secundario MemoryRevision.

client.agent_engines.memories.get(name=memory_name)
"""
Memory(
  name="projects/123/locations/us-central1/reasoningEngines/456/memories/789",
  fact="This is my updated fact.",
  ...
)
"""

list(client.agent_engines.memories.revisions.list(name=memory_name))
"""
[
  MemoryRevision(
    name="projects/123/locations/us-central1/reasoningEngines/456/memories/789/revision/456",
    fact="This is my updated fact",
    ...
  ),
  MemoryRevision(
    name="projects/123/locations/us-central1/reasoningEngines/456/memories/789/revision/123",
    fact="This is my original fact",
    ...
  )
]
"""

Eliminación de datos memorizados

Los recuerdos se pueden crear directamente con DeleteMemory o de forma dinámica con GenerateMemories. Con la generación de memoria, las memorias se eliminan de forma dinámica cuando el proceso de consolidación determina que la información nueva invalida la información existente del mismo ámbito.

# Direct deletion using UpdateMemory
client.agent_engines.memories.delete(name=memory_name, ...)

# Dynamic delete using GenerateMemories
client.agent_engines.memories.generate_memories(name=agent_engine_name, ...)

Cuando se elimina una memoria, se elimina el recurso Memory y se crea un nuevo elemento secundario MemoryRevision. El fact de la última revisión de la memoria está vacío porque refleja una mutación de eliminación.

client.agent_engines.memories.get(name=memory_name)
"""
404 Not Found.
"""

list(client.agent_engines.memories.revisions.list(name=memory_name))
"""
[
  MemoryRevision(
    name="projects/123/locations/us-central1/reasoningEngines/456/memories/789/revision/789",
    fact="",
    ...
  ),
  MemoryRevision(
    name="projects/123/locations/us-central1/reasoningEngines/456/memories/789/revision/456",
    fact="This is my updated fact",
    ...
  ),
  MemoryRevision(
    name="projects/123/locations/us-central1/reasoningEngines/456/memories/789/revision/123",
    fact="This is my original fact",
    ...
  )
]
"""

Solo se puede acceder a las revisiones de la memoria del niño durante un máximo de 48 horas después de que se haya eliminado la memoria del padre o de la madre. Durante este periodo de recuperación, puedes seguir inspeccionando las revisiones de tu recuerdo y recuperarlo restaurando una revisión anterior.

Operaciones de revisión de memoria

En esta sección se describe cómo puedes inspeccionar las revisiones de la memoria y restaurar una revisión anterior.

Mostrar revisiones

Usa ListMemoryRevisions para devolver todas las revisiones de memoria que pertenezcan a una memoria.

list(client.agent_engines.memories.revisions.list(name=MEMORY_NAME))

Haz los cambios siguientes:

  • MEMORY_NAME: nombre del recurso de la memoria con el formato projects/.../locations/.../reasoningEngines/.../memories/...

Al generar recuerdos, puedes proporcionar etiquetas de revisión que se apliquen a las revisiones afiliadas. Las etiquetas son pares clave-valor arbitrarios. Por ejemplo, puedes etiquetar las revisiones con un ID de la fuente de datos usada para generar la memoria y, a continuación, filtrar las revisiones por esta etiqueta:

response = client.agent_engines.memories.generate(
    ...,
    config={
        "revision_labels": {
            "data_source": "321"
        }
    }
)

list(client.agent_engines.memories.revisions.list(
    name=MEMORY_NAME,
    config={
      "filter": "labels.data_source=\"321\""
    }
))
"""
[
  MemoryRevision(
    name="projects/123/locations/us-central1/reasoningEngines/456/memories/789/revision/123",
    labels={
      "data_source": "123"
    }
    ...
  )
]
"""

Obtener una revisión

Usa GetMemoryRevision para obtener una revisión de memoria concreta.

client.agent_engines.memories.revisions.get(name=MEMORY_REVISION_NAME)

Haz los cambios siguientes:

  • MEMORY_REVISION_NAME: nombre del recurso de la revisión de memoria que se va a obtener con el formato projects/.../locations/.../reasoningEngines/.../memories/.../revisions/...

Restaurar un recuerdo

Usa RollbackMemory para restaurar una revisión anterior de un recuerdo.

client.agent_engines.memories.rollback(
    name=name=MEMORY_NAME,
    target_revision_id=REVISION_ID
)

Haz los cambios siguientes:

  • MEMORY_NAME: nombre del recurso de la memoria que se va a actualizar con el formato projects/.../locations/.../reasoningEngines/.../memories/...
  • REVISION_ID: ID de la revisión a la que se debe revertir. Es el último segmento del nombre de recurso de la revisión de memoria, como 789 en projects/MyProject/locations/us-central1/reasoningEngines/123/memories/456/revisions/789.

Si quieres deshacer un cambio que haya hecho GenerateMemories en un recuerdo, restaura la versión del recuerdo anterior al cambio. La respuesta de generación de recuerdos incluye una referencia a la revisión anterior (previous_revision) de cada recuerdo actualizado o eliminado:

operation = client.agent_engines.memories.generate(
  ...
)

# Rollback the first generated memory to the previous revision.
client.agent_engines.memories.rollback(
    name=operation.response.generated_memories[0].memory.name,
    target_revision_id=operation.response.generated_memories[0].previous_revision
)

Inhabilitar las revisiones de memoria

Las revisiones de la memoria están habilitadas de forma predeterminada. Puedes inhabilitar las revisiones de memoria para todas las solicitudes a tu instancia de Memory Bank o para cada solicitud individual. Si las revisiones de la memoria están inhabilitadas, no se crea ninguna revisión cuando se modifica la memoria.

Puedes inhabilitar las revisiones de memoria para todas las solicitudes a tu instancia de Memory Bank al configurar la instancia:

client.agent_engines.create(
  config={
    "context_spec": {
      "memory_bank_config": {
        "disable_memory_revisions": True
      }
    }
  }
)

Puedes inhabilitar las revisiones de memoria a nivel de solicitud cuando envíes la solicitud:

Generar

client.agent_engines.memories.generate(
  ...,
  "config": {
    "disable_memory_revisions": True
  }
)

Crear

client.agent_engines.memories.create(
  ...,
  "config": {
    "disable_memory_revisions": True
  }
)

Actualizar

client.agent_engines.memories.update(
  ...,
  "config": {
    "disable_memory_revisions": True
  }
)

Caducidad de la revisión

Las revisiones de la memoria no se conservan para siempre. Debes definir la fecha de vencimiento de las revisiones o usar la predeterminada. El tiempo de vida (TTL) predeterminado es de 365 días. Puedes configurar la caducidad de todas las solicitudes a tu instancia de Memory Bank o de cada solicitud por separado. Una vez que ha caducado una revisión de la memoria, no se puede inspeccionar ni restaurar.

Puedes configurar el TTL de todas las solicitudes a tu instancia de Memory Bank al configurar la instancia:

client.agent_engines.create(
  config={
    "context_spec": {
      "memory_bank_config": {
        "ttl_config": {
          # Persist memory revisions for 30 days after they're created.
          "revision_ttl": f"{30 * 60 * 60 * 24}s"
        }
      }
    }
  }
)

Para configurar el TTL de cada revisión de memoria a nivel de solicitud, incluye revision_expire_time o revision_ttl en tu solicitud:

TTL

config = {
    # Persist memory revisions for 30 days after they're created.
    "revision_ttl": f"{30 * 60 * 60 * 24}s"
}

client.agent_engines.memories.create(
  ...,
  config=config
)

client.agent_engines.memories.update(
  ...,
  config=config
)

client.agent_engines.memories.generate(
  ...,
  config=config
)

Caducidad

import datetime

config = {
    "revision_expire_time": datetime.datetime.now(tz=datetime.timezone.utc) + datetime.timedelta(weeks=3)
}

client.agent_engines.memories.create(
  ...,
  config=config
)

client.agent_engines.memories.update(
  ...,
  config=config
)

client.agent_engines.memories.generate(
  ...,
  config=config
)