Almacenes y esquema

Esta página presenta las abstracciones del almacén principal y los controles de esquema utilizados por el SDK de memoria del agente de Oracle.

API de tienda

Semántica de escritura de tienda

Las escrituras de almacén mantienen una separación clara entre el texto que almacena una aplicación y la carga útil que utiliza el almacén para la recuperación. La mayoría de las aplicaciones pueden utilizar las API de nivel de memoria y de thread y permitir que el almacén prepare las filas de búsqueda que necesita para la recuperación de vectores, palabras clave o híbridos. Las API de almacén de nivel inferior muestran index_texts, index_text, embeddings y embedding para integraciones avanzadas que ya saben qué texto o vectores se deben utilizar para la recuperación.

Piense en cada escritura como dos piezas relacionadas:

Si no se proporciona ninguna sustitución de búsqueda ni embebido explícito, el almacén utiliza el texto almacenado resuelto como texto de recuperación. El almacén fragmenta el texto no vacío cuando se configura la fragmentación. El texto vacío almacena el texto del registro, pero no proporciona texto de recuperación.

La siguiente tabla describe cómo se selecciona el texto de recuperación antes de considerar las cargas útiles de vectores explícitos.

Cargas útiles de recuperación a nivel de almacén

Entrada añadir() actualizar()
index_texts o index_text omitidos Cada registro utiliza su valor contents resuelto para la recuperación. Se utiliza un valor text de sustitución para la recuperación. Si también se omite text, las actualizaciones de solo incrustación reutilizan las filas de texto de recuperación existentes del registro.
Entrada de cadena index_texts o cadena index_text La cadena sustituye el texto de recuperación de ese registro. El almacén puede fragmentarlo antes de escribir filas de recuperación. La cadena sustituye el texto de recuperación de ese registro. El almacén puede fragmentarlo antes de escribir filas de recuperación.
Entrada list[str] index_texts o list[str] index_text La lista se trata como fragmentos propiedad de la persona que llama. Cada cadena que no está vacía se escribe como una fila de recuperación y el almacén no la fragmenta de nuevo. La lista se trata como fragmentos propiedad de la persona que llama. Cada cadena que no está vacía se escribe como una fila de recuperación y el almacén no la fragmenta de nuevo.
Entrada None index_texts o index_text=None None en la lista externa index_texts significa "usar el contenido almacenado para este registro". index_text=None borra las filas de recuperación al dejar el texto almacenado sin cambios, a menos que también se proporcione text.
Cadena vacía o lista de fragmentos vacía Almacena el texto del registro y no proporciona texto de recuperación para ese registro. Actualiza el texto del registro cuando se proporciona text y borra el texto de recuperación para ese registro.

Las incrustaciones explícitas son opcionales. Cuando se omiten, el almacén deriva vectores locales del texto de recuperación cuando se configura el almacenamiento de vectores locales; los almacenes de palabras clave o híbridos también pueden utilizar filas de recuperación de solo texto. Cuando se proporcionan valores embeddings o embedding explícitos, el almacén escribe esos vectores directamente y no llama a su embebido para esos vectores.

En add(), embeddings=None se comporta como omitir embeddings. En update(), embedding=None es explícito: el almacén mantiene o reescribe el texto de recuperación según text y index_text, pero almacena esas filas sin vectores locales. Si se omiten text y index_text, se borrarán los vectores de las filas de recuperación existentes.

La forma del vector indica a la tienda cuánta propiedad del fragmento está tomando la persona que llama:

Algunas combinaciones se rechazan para que el texto almacenado, el texto de recuperación y los vectores no se desvíen. Al transferir text=None, se borran el texto almacenado y las filas de recuperación, por lo que no se puede combinar con valores index_text o embedding no nulos; los registros de perfil de actor no soportan text=None. La transferencia de index_text=None en update() significa "borrar filas de recuperación", por lo que no se permiten incrustaciones explícitas no vacías en la misma llamada. Varios vectores explícitos necesitan texto de fragmento explícito, a menos que la actualización sea de solo embebido y las filas de recuperación existentes ya proporcionen el texto de fragmento.

clase oracleagentmemory.core.OracleMemoryStore

Bases: IMemoryStore

Interfaz de almacén común utilizada por OracleAgentMemory.

La implantación de un almacén es responsable de mantener los registros de texto y realizar una búsqueda de similitud sobre ellos. Tanto los puntos de entrada síncronos como los asíncronos se definen para que las API de nivel superior puedan exponer las superficies de sincronización/asíncronas coincidentes sin duplicar la lógica específica del almacén.

método add

Agregue registros a la tienda.

Notas

Utilice add_batches() cuando el emisor de llamada ya tenga uno o más objetos PendingRecordBatch.

method add_agent (resumen)

Agregue un registro de perfil de agente.

method add_async (async)

Agregar de forma asíncrona registros orientados a filas al almacén.

Acepta los mismos argumentos y devuelve los mismos identificadores que add().

método add_batches

Agregue lotes lógicos preparados por el emisor de llamada al almacén.

Ejemplos

store.add_batches(
    [
        PendingRecordBatch(
            texts=["pizza batch"],
            record_type="memory",
            record_ids="mem-batch-docs",
        )
    ]
)
['mem-batch-docs']

method add_batches_async (async)

Agregue lotes lógicos preparados por el emisor de llamada de forma asíncrona al almacén.

Acepta los mismos argumentos y devuelve los mismos identificadores que add_batches().

method add_user (resumen)

Agregue un registro de perfil de usuario.

method delete (resumen)

Elimine un registro almacenado por identificador.

method delete_thread (resumen)

Suprimir un thread y sus datos almacenados asociados.

Notas

Ésta es la operación de nivel de almacén para eliminar un thread y los registros de ámbito de thread gestionados por el almacén. Prefiere la supresión de threads cuando los requisitos de retención llaman para suprimir tanto los mensajes de origen como los datos de memoria de ámbito de thread derivados, ya que las supresiones de nivel de mensaje no implican que se eliminen registros derivados persistentes por separado.

method get (resumen)

Recupere un registro almacenado por tipo e identificador.

method list (resumen)

Mostrar registros almacenados para un tipo de registro.

method list_thread_messages (resumen)

Mostrar el historial de mensajes almacenado para un thread.

method search (resumen)

Buscar registros por similitud.

Ejemplos

store.add(
    ["Searchable abstract memory"],
    record_type="memory",
    record_ids="mem-search-abstract-docs",
)
['mem-search-abstract-docs']
store.search("Searchable", 1, record_types={"memory"})[0][0].id
'mem-search-abstract-docs'

Filtrar en un valor de metadatos escalar:

store.add(
    ["pizza release"],
    record_type="memory",
    record_ids="mem-search-meta-source-docs",
    metadata={"source": "slack"},
)
['mem-search-meta-source-docs']
any(
    record.id == "mem-search-meta-source-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"source": "slack"},
    )
)
True

Filtrar por metadatos anidados:

store.add(
    ["pizza review"],
    record_type="memory",
    record_ids="mem-search-meta-review-docs",
    metadata={"review": {"status": "open"}},
)
['mem-search-meta-review-docs']
any(
    record.id == "mem-search-meta-review-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"review": {"status": "open"}},
    )
)
True

Hacer coincidir un valor de lista exactamente, incluido el orden:

store.add(
    ["pizza tags"],
    record_type="memory",
    record_ids="mem-search-meta-tags-docs",
    metadata={"tags": ["prod", "urgent"]},
)
['mem-search-meta-tags-docs']
any(
    record.id == "mem-search-meta-tags-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"tags": ["prod", "urgent"]},
    )
)
True

Filtrar cuando una matriz de metadatos contiene un valor:

any(
    record.id == "mem-search-meta-tags-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"tags": {"$array_contains": "prod"}},
    )
)
True

Combinar varias condiciones de metadatos. Un registro debe satisfacer todas las claves:

store.add(
    ["pizza rollout"],
    record_type="memory",
    record_ids="mem-search-meta-combined-docs",
    metadata={
        "source": "slack",
        "review": {"status": "open"},
        "tags": ["prod", "urgent"],
    },
)
['mem-search-meta-combined-docs']
any(
    record.id == "mem-search-meta-combined-docs"
    for record, _ in store.search(
        "pizza",
        k=5,
        metadata_filter={
            "source": "slack",
            "review": {"status": "open"},
            "tags": ["prod", "urgent"],
        },
    )
)
True

method search_async (async)

Busque registros de forma asíncrona por similitud semántica.

method update (resumen)

Actualizar el contenido del registro almacenado, incrustar datos, metadatos, registro de hora o caducidad.

Almacén de Oracle DB

clase oracleagentmemory.core.OracleDBMemoryStore

Bases: OracleMemoryStore

Persistencia respaldada por base de datos para mensajes, memorias y perfiles de actores.

Cree un almacén de Oracle DB.

Advertencia: SchemaPolicy.CREATE_IF_NECESSARY puede ser más caro que el inicio normal del almacén porque puede aplicar el DDL de esquema gestionado y las reescrituras de datos de mejor esfuerzo antes de que la inicialización se realice correctamente. Planifique la primera apertura de un esquema gestionado anterior como una operación de migración o mantenimiento cuando ese esquema pueda contener muchas filas.

Si la configuración del esquema debe crear el trabajo de depuración de registro caducado gestionado, pero el usuario de la base de datos carece del privilegio Scheduler-job, la inicialización advierte y continúa. Los mensajes y las memorias caducados permanecen ocultos para las lecturas y la búsqueda, pero no se depuran físicamente hasta que un usuario con CREATE JOB o un privilegio de programador equivalente crea el trabajo.

Cuando SchemaPolicy.CREATE_IF_NECESSARY crea por primera vez un índice híbrido gestionado a través de un esquema existente, Oracle explora el texto de búsqueda almacenado y crea el estado de índice híbrido gestionado a partir del modelo de base de datos configurado. La inicialización del almacén espera a que termine ese DDL, por lo que debe planificar la primera actualización híbrida como una operación de migración o mantenimiento para esquemas grandes. SearchIndexSyncMode controla el mantenimiento continuo después de que exista el índice; no hace que la primera creación de índice sea asíncrona.

La creación de ese índice híbrido gestionado también crea una preferencia de vectorizador DBMS_VECTOR_CHAIN denominada por el esquema gestionado. La preferencia almacena metadatos de configuración del vectorizador ligeros del modelo OracleDBEmbedder configurado. Se puede inspeccionar con vistas de preferencias de Oracle Text, como CTX_USER_PREFERENCES y CTX_USER_PREFERENCE_VALUES.

método add

Agregue registros al almacén de Oracle DB.

Ejemplos

store.add(
    ["Index this stored text"],
    record_type="memory",
    record_ids="mem-db-add-docs",
)
['mem-db-add-docs']
store.add(
    ["Stored text"],
    record_type="memory",
    index_texts=["Search this text"],
    record_ids="mem-db-index-text-docs",
)
['mem-db-index-text-docs']
store.add(
    ["Short-lived event"],
    record_type="memory",
    record_ids="mem-db-ttl-docs",
    timestamps="2026-01-01T12:00:00+00:00",
    ttl_days=7,
    ttl_anchor=TimeToLiveAnchor.TIMESTAMP,
)
['mem-db-ttl-docs']

método add_agent

Agregue un registro de perfil de agente.

Notas

Los registros de perfil de agente no tienen ámbito. El identificador de registro público insertado es el mismo valor transferido que agent_id.

Ejemplos

store.add_agent("a-docs-agent", "Support assistant")
'a-docs-agent'

method add_async (async)

Agregar de forma asíncrona registros orientados a filas al almacén.

Acepta los mismos argumentos y devuelve los mismos identificadores que add().

método add_batches

Agregue lotes lógicos preparados por el emisor de llamada al almacén.

Ejemplos

store.add_batches(
    [
        PendingRecordBatch(
            texts=["pizza batch"],
            record_type="memory",
            record_ids="mem-batch-docs",
        )
    ]
)
['mem-batch-docs']

method add_batches_async (async)

Agregue lotes lógicos preparados por el emisor de llamada de forma asíncrona al almacén.

Acepta los mismos argumentos y devuelve los mismos identificadores que add_batches().

método add_user

Agregue un registro de perfil de usuario.

Notas

Los registros de perfil de usuario no tienen ámbito. El identificador de registro público insertado es el mismo valor transferido que user_id.

Ejemplos

store.add_user("u-docs-profile", "Prefers concise answers.")
'u-docs-profile'

método delete

Suprima una fila gestionada y sus filas de fragmentos por identificador.

Notas

La operación se ejecuta dentro de una transacción. Cuando cascade está activado para un destino de nivel superior soportado, la supresión de perfil y todas las supresiones secundarias de ámbito se confirman o se realiza un rollback juntos.

Ejemplos

store.add(["Delete me"], record_type="memory", record_ids="mem-delete-docs")
['mem-delete-docs']
store.delete("memory", "mem-delete-docs")
1

método delete_thread

Suprimir un thread y sus filas almacenadas asociadas.

Notas

Utilice esta operación cuando necesite una limpieza en cascada con ámbito de thread. En el almacén con copia de seguridad de base de datos, al suprimir el thread, se elimina la fila del thread gestionado junto con las filas de memoria y mensajes asociadas, además de los datos de búsqueda mantenidos para su recuperación. Esto es más amplio que una supresión de nivel de mensaje, que elimina sólo la fila de mensaje sin formato. La supresión de threads elimina las filas de memoria y mensajes dependientes junto con sus datos de recuperación asociados en la misma transacción.

Ejemplos

store.delete_thread("c1")
0

método get

Recuperar un registro almacenado por identificador.

Ejemplos

store.add(["Remember this"], record_type="memory", record_ids="mem-get-docs")
['mem-get-docs']
store.get("memory", "mem-get-docs").id
'mem-get-docs'

method list

Enumerar registros persistentes para un tipo de registro.

Notas

"user_profile" y "agent_profile" son tipos de registro sin ámbito. Para esos tipos de registro, thread_id, user_id y agent_id se ignoran y la identidad del actor permanece en record.id.

Ejemplos

store.add(
    ["First listed", "Second listed"],
    record_type="memory",
    record_ids=["mem-list-docs-1", "mem-list-docs-2"],
)
['mem-list-docs-1', 'mem-list-docs-2']
[record.id for record in store.list("memory", limit=2)]
['mem-list-docs-1', 'mem-list-docs-2']
store.add_user("u-list-docs", "Prefers concise answers.")
'u-list-docs'
any(
    record.id == "u-list-docs"
    for record in store.list("user_profile", user_id=None, limit=10)
)
True

método list_thread_messages

Devolver mensajes persistentes para un hilo.

Ejemplos

store.list_thread_messages("c1")
[]

Buscar registros por similitud.

El backend de búsqueda activo depende del SearchStrategy configurado en el almacén. SearchStrategy.VECTOR clasifica el vector de consulta en vectores de registro almacenados. SearchStrategy.HYBRID consulta el índice híbrido gestionado de Oracle a través del texto de búsqueda almacenado y su estado de índice gestionado. SearchStrategy.KEYWORD solo se clasifica por texto que coincida con el texto de búsqueda almacenado.

Ejemplos

store.add(
    ["pizza preference"],
    record_type="memory",
    record_ids="mem-search-docs",
    thread_ids="c-search-docs",
)
['mem-search-docs']
results = store.search(
    "pizza",
    1,
    thread_id="c-search-docs",
    exact_thread_match=True,
    record_types={"memory"},
)
results[0][0].id
'mem-search-docs'

Filtrar en un valor de metadatos escalar:

store.add(
    ["pizza release"],
    record_type="memory",
    record_ids="mem-search-meta-source-docs",
    metadata={"source": "slack"},
)
['mem-search-meta-source-docs']
any(
    record.id == "mem-search-meta-source-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"source": "slack"},
    )
)
True

Filtrar por metadatos anidados:

store.add(
    ["pizza review"],
    record_type="memory",
    record_ids="mem-search-meta-review-docs",
    metadata={"review": {"status": "open"}},
)
['mem-search-meta-review-docs']
any(
    record.id == "mem-search-meta-review-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"review": {"status": "open"}},
    )
)
True

Hacer coincidir un valor de lista exactamente, incluido el orden:

store.add(
    ["pizza tags"],
    record_type="memory",
    record_ids="mem-search-meta-tags-docs",
    metadata={"tags": ["prod", "urgent"]},
)
['mem-search-meta-tags-docs']
any(
    record.id == "mem-search-meta-tags-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"tags": ["prod", "urgent"]},
    )
)
True

Filtrar cuando una matriz de metadatos contiene un valor:

any(
    record.id == "mem-search-meta-tags-docs"
    for record, _ in store.search(
        "pizza",
        k=3,
        metadata_filter={"tags": {"$array_contains": "prod"}},
    )
)
True

Combinar varias condiciones de metadatos. Un registro debe satisfacer todas las claves:

store.add(
    ["pizza rollout"],
    record_type="memory",
    record_ids="mem-search-meta-combined-docs",
    metadata={
        "source": "slack",
        "review": {"status": "open"},
        "tags": ["prod", "urgent"],
    },
)
['mem-search-meta-combined-docs']
any(
    record.id == "mem-search-meta-combined-docs"
    for record, _ in store.search(
        "pizza",
        k=5,
        metadata_filter={
            "source": "slack",
            "review": {"status": "open"},
            "tags": ["prod", "urgent"],
        },
    )
)
True

method search_async (async)

Busque registros de forma asíncrona por similitud semántica.

método update

Actualizar contenido de registro almacenado, estado de búsqueda, metadatos y valores de registro de hora.

Ejemplos

store.add(["Original note"], record_type="memory", record_ids="mem-update-docs")
['mem-update-docs']
store.update("memory", "mem-update-docs", text="Updated note")
1
store.get("memory", "mem-update-docs").content
'Updated note'

Estrategia de búsqueda

clase oracleagentmemory.core.dbsearch.SearchStrategy

Bases: Enum

Comportamiento de búsqueda de almacenes de Oracle DB.

La inicialización del almacén de base de datos utiliza la estrategia seleccionada para seleccionar la capacidad de búsqueda de esquema gestionado. La búsqueda VECTOR almacena incrustaciones locales. La búsqueda KEYWORD almacena texto apto para búsqueda y un índice de texto. La búsqueda HYBRID almacena el texto que se puede buscar más el estado de índice vectorial híbrido gestionado por Oracle. El almacén de base de datos valida esta capacidad de esquema al iniciar para que una estrategia incompatible no devuelva resultados incompletos de forma silenciosa.

VECTOR
Buscar solo por similitud de vectores. La tienda embebebe la consulta con el embebido configurado o utiliza un query_vector proporcionado por el emisor de llamada y clasifica los registros por distancia de los vectores almacenados. Utilícelo con un esquema de base de datos configurado para la búsqueda vectorial.
HYBRID
Busque con el índice híbrido gestionado de Oracle. Oracle combina la coincidencia de texto sobre el texto de búsqueda almacenado con la clasificación vectorial del índice híbrido en la base de datos. Utilice esta opción cuando los usuarios puedan buscar por lenguaje natural, así como por identificadores exactos, alias o nombres de productos. Esta estrategia requiere que el embebido principal del almacén sea OracleDBEmbedder para que el índice gestionado y el almacén compartan un modelo en la base de datos.
KEYWORD
Busque solo por palabra clave/texto que coincida con el texto de búsqueda almacenado. Este modo no crea embebidas de consultas locales y no necesita un embebido de Oracle DB. Cuando se abre en un esquema híbrido existente, puede utilizar la rama de texto de ese índice híbrido sin crear un nuevo índice híbrido. Utilice esta opción cuando los identificadores exactos, los alias, los nombres de productos o las frases cortas deban permitir la recuperación de unidades sin fusión de vectores.

HYBRID = 'híbrido'

Palabra clave = 'palabra clave'

VECTOR = 'VECTOR'

Modo de sincronización de índice de búsqueda

clase oracleagentmemory.core.dbsearch.SearchIndexSyncMode

Bases: Enum

Comportamiento de refrescamiento para índices de búsqueda de base de datos gestionados.

Este valor controla cuándo Oracle hace que el texto de búsqueda nuevo o cambiado sea visible para la búsqueda con reconocimiento de texto respaldada por base de datos. SearchStrategy.HYBRID utiliza el índice vectorial híbrido gestionado de Oracle. SearchStrategy.KEYWORD utiliza un índice de Oracle Text. SearchStrategy.VECTOR no utiliza este valor.

ON_COMMIT
Refresque el índice cuando se confirme la transacción de escritura. Esta es la opción por defecto y la más sencilla para la mayoría de las aplicaciones porque los registros se pueden buscar inmediatamente después de una escritura correcta. Puede agregar trabajo para escribir transacciones porque el índice se mantiene actualizado de inmediato.
MANUAL
No refresque el índice automáticamente. Es posible que los registros nuevos o actualizados no aparezcan en la búsqueda por palabra clave o híbrida hasta que ejecute la operación de sincronización de índice de la base de datos usted mismo. Esto resulta útil para cargas masivas o ventanas de mantenimiento en las que desea controlar cuando se ejecuta el trabajo de refrescamiento.
AUTO
Deje que Oracle refresque el índice híbrido gestionado de forma asíncrona. Las escrituras pueden evitar el costo de refrescamiento inmediato, pero los resultados de la búsqueda pueden retrasarse con respecto a las escrituras recientes hasta que Oracle complete el refrescamiento en segundo plano. Este modo solo está soportado con SearchStrategy.HYBRID.

Advertencia: este valor controla el mantenimiento continuo después de que exista el índice de búsqueda gestionado. No hace que la primera creación de índice sea asíncrona. La creación de un índice híbrido gestionado sobre el texto de búsqueda almacenado existente puede ser de larga ejecución porque Oracle crea el estado de índice híbrido gestionado a partir de ese texto.

AUTO = 'AUTO'

MANUAL = 'MANUAL'

ON_COMMIT = 'ON_COMMIT'

Periodo de vida

clase oracleagentmemory.core.retention.MemoryRetentionConfig

Bases: object

Configuración de retención de nivel de esquema para registros respaldados por Oracle DB.

clase oracleagentmemory.apis.ttl.TimeToLiveAnchor

Bases: Enum

Anclaje utilizado para calcular un registro de hora de caducidad a partir de una duración de tiempo de vida.

CREATED_AT
Caducidad de cálculo desde el registro de hora de creación de la base de datos del registro. Este es el valor por defecto cuando los emisores de llamadas omiten ttl_anchor.
TIMESTAMP
Calcular caducidad desde el registro de hora de evento almacenado del registro. Utilice esta opción cuando un mensaje o memoria represente un evento anterior y deba caducar en relación con la hora del evento en lugar de la hora de inserción.

CREATED_AT = 'CREATED_AT'

TIMESTAMP = 'TIMESTAMP' (Registro de hora)

Política de esquema

clase oracleagentmemory.core.SchemaPolicy

Bases: str, Enum

Política de creación de esquema para almacenes de Oracle DB.

REQUERIR_EXISTENTE

Valide que el esquema gestionado completo ya existe y que está actualizado. No cree ni modifique objetos de base de datos.

CREAR_IF_EMPTY

Si no existen objetos gestionados, esquema de inicialización de datos. Si ya existen objetos, necesita un esquema gestionado completo y actualizado.

CREAR_SI_NECESARIO

Cree los objetos gestionados que faltan y aplique actualizaciones de esquema gestionado soportadas.

VOLVER A CREAR

Borrar y volver a crear todos los objetos de esquema gestionados. Esto es destructivo.