商店與綱要

此頁面顯示 Oracle 代理程式記憶體 SDK 使用的核心存放區摘要和綱要控制項。

儲存 API

商店寫入語意

儲存庫寫入會在應用程式儲存的文字與儲存用於擷取的有效負載之間保留明確的分隔。大多數應用程式都可以使用記憶體層級和執行緒層級的 API,並讓存放區準備進行向量、關鍵字或混合擷取所需的搜尋資料列。低階存放區 API 會顯示 index_textsindex_textembeddingsembedding,以供已知道應使用哪些文字或向量進行擷取的進階整合使用。

將每一個部份寫成兩個相關部份:

如果未提供搜尋置換或明確內嵌,則存放區會使用解析的儲存文字作為擷取文字。設定分區時,商店會分區非空白文字。空白文字會儲存記錄文字,但不會提供擷取文字。

下表說明在考慮明確向量有效負載之前,如何選擇擷取文字。

儲存層次擷取有效負載

輸入項 add() 個更新()
省略 index_textsindex_text 每筆記錄都會使用解析的 contents 值進行擷取。 取代的 text 值會用於擷取。如果也省略 text,則僅內嵌更新會重複使用記錄的現有擷取文字資料列。
字串 index_texts 項目或字串 index_text 此字串會取代該記錄的擷取文字。寫入擷取列之前,商店可以將其分塊。 此字串會取代該記錄的擷取文字。寫入擷取列之前,商店可以將其分塊。
list[str] index_texts 項目或 list[str] index_text 此清單會被視為呼叫者擁有的區塊。每個非空白字串都會寫入為一個擷取列,且商店不會再次分區。 此清單會被視為呼叫者擁有的區塊。每個非空白字串都會寫入為一個擷取列,且商店不會再次分區。
None index_texts 項目或 index_text=None 外部 index_texts 清單中的 None 表示「使用此記錄的預存內容」。 除非同時提供 text,否則 index_text=None 會在未變更儲存文字時清除擷取資料列。
空白字串或空白區塊清單 儲存記錄文字,且不提供該記錄的擷取文字。 在提供 text 時更新記錄文字,並清除該記錄的擷取文字。

明確內嵌是選擇性的。省略時,當設定本機向量儲存時,存放區會從擷取文字衍生本機向量;關鍵字或混合存放區也可以使用純文字擷取資料列。提供明確的 embeddingsembedding 值時,存放區會直接寫入這些向量,而不會為這些向量呼叫其內嵌器。

add() 中,embeddings=None 的行為類似於省略 embeddings。在 update() 中,embedding=None 是明確的:存放區會根據 textindex_text 保留或重寫擷取文字,但會儲存沒有本機向量的資料列。如果同時省略 textindex_text,就會清除現有擷取列中的向量。

向量形狀告訴商店,來電者所採取的區塊所有權是多少:

某些組合被拒絕,因此儲存的文字、擷取文字和向量不會偏差。傳送 text=None 會清除儲存的文字和擷取資料列,因此無法與非空值的 index_textembedding 值合併;動作者設定檔記錄不支援 text=None。在 update() 中傳送 index_text=None 表示「清除擷取資料列」,因此在相同的呼叫中不允許非空白的明確內嵌。多個明確的向量需要明確的區塊文字,除非更新是僅內嵌的,且現有的擷取列已提供區塊文字。

類別 oracleagentmemory.core.OracleMemoryStore

基本:IMemoryStore

OracleAgentMemory 使用的通用儲存介面。

商店實施負責保存文字記錄,並對其執行相似性搜尋。同時定義了同步和非同步進入點,因此高階 API 可以公開相符的同步 / 非同步曲面,而不需要複製儲存特定邏輯。

方法 add

新增記錄至商店。

注意事項

當呼叫程式已經有一或多個 PendingRecordBatch 物件時,請使用 add_batches()

方法 add_agent (摘要)

新增專員資料檔記錄。

方法 add_async (非同步)

以非同步方式將資料列導向的記錄新增至商店。

接受相同的引數,並傳回與 add() 相同的識別碼。

方法 add_batches

新增來電者準備的邏輯批次至商店。

範例

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

方法 add_batches_async (非同步)

以非同步方式將呼叫器準備的邏輯批次新增至存放區。

接受相同的引數,並傳回與 add_batches() 相同的識別碼。

方法 add_user (摘要)

新增使用者基本資料記錄。

方法 delete (摘要)

依識別碼刪除一筆儲存的記錄。

方法 delete_thread (摘要)

刪除執行緒及其關聯的預存資料。

注意事項

這是儲存層次作業,用於移除商店所管理的執行緒與執行緒作用領域記錄。保留需求呼叫刪除來源訊息和衍生繫線作用領域記憶體資料時,偏好刪除繫線,因為訊息層次刪除並不表示會移除個別保存的衍生記錄。

方法 get (摘要)

依類型與識別碼擷取一筆儲存的記錄。

方法 list (摘要)

列出一個記錄類型的已儲存記錄。

方法 list_thread_messages (摘要)

列出一個執行緒中儲存的訊息歷史記錄。

方法 search (摘要)

依相似性搜尋記錄。

範例

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'

篩選純量描述資料值:

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

篩選巢狀描述資料:

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

完全符合清單值,包括順序:

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

描述資料陣列包含值時進行篩選:

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

結合多個描述資料條件。記錄必須滿足每個索引鍵:

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

方法 search_async (非同步)

以非同步方式依語意相似度搜尋記錄。

方法 update (摘要)

更新儲存的記錄內容、嵌入資料、中繼資料、時間戳記或到期。

Oracle DB 商店

類別 oracleagentmemory.core.OracleDBMemoryStore

基本:OracleMemoryStore

訊息、記憶體和動作者設定檔的資料庫備份保存。

建立 Oracle DB 存放區。

警告:SchemaPolicy.CREATE_IF_NECESSARY 可能比一般存放區啟動更為昂貴,因為在初始化成功之前,它可能會套用受管理的綱要 DDL 和最佳效果資料重寫。當該綱要可能包含許多資料列時,計畫第一個開啟的舊受管理綱要作為移轉或維護作業。

如果綱要設定必須建立受管理過期記錄永久清除工作,但資料庫使用者缺乏 Scheduler-job 權限,初始化會警告並繼續。已過期的訊息和記憶體會保持隱藏,無法讀取和搜尋,但要等到工作由具備 CREATE JOB 或同等排程器權限的使用者建立後,才會實際將它們整個清除。

SchemaPolicy.CREATE_IF_NECESSARY 先透過現有綱要建立受管理的混合索引時,Oracle 會掃描儲存的搜尋文字,並從設定的資料庫內模型建立受管理的混合索引狀態。儲存初始化等待該 DDL 完成,因此計畫第一個混合式升級作為大型綱要的移轉或維護作業。SearchIndexSyncMode 控制索引存在之後的進行中維護;它不會使第一個索引建立成為非同步。

建立該受管理的混合索引也會建立由受管理綱要命名的 DBMS_VECTOR_CHAIN 向量設定程式偏好設定。此偏好設定會儲存已設定 OracleDBEmbedder 模型的輕量型向量化程式組態中繼資料。可以使用 Oracle Text 偏好設定檢視 (例如 CTX_USER_PREFERENCESCTX_USER_PREFERENCE_VALUES) 進行檢查。

方法 add

新增記錄至 Oracle DB 商店。

範例

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']

方法 add_agent

新增專員資料檔記錄。

注意事項

專員資料檔記錄未作用領域。插入的公用記錄 ID 與傳送為 agent_id 的值相同。

範例

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

方法 add_async (非同步)

以非同步方式將資料列導向的記錄新增至商店。

接受相同的引數,並傳回與 add() 相同的識別碼。

方法 add_batches

新增來電者準備的邏輯批次至商店。

範例

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

方法 add_batches_async (非同步)

以非同步方式將呼叫器準備的邏輯批次新增至存放區。

接受相同的引數,並傳回與 add_batches() 相同的識別碼。

方法 add_user

新增使用者基本資料記錄。

注意事項

使用者資料檔記錄未作用領域。插入的公用記錄 ID 與傳送為 user_id 的值相同。

範例

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

方法 delete

依 ID 刪除一個受管理資料列及其區塊資料列。

注意事項

此作業會在一個交易內執行。當支援的最上層目標啟用 cascade 時,會同時確認或倒回設定檔刪除和所有作用領域子項刪除。

範例

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

方法 delete_thread

刪除執行緒及其關聯的儲存資料列。

注意事項

當您需要執行緒作用領域的連鎖清除時,請使用此作業。在資料庫備份存放區中,刪除繫線會移除受管理繫線資料列以及相關聯的訊息和記憶體資料列,以及保留供擷取的搜尋資料。這比訊息階層刪除大,僅會移除原始訊息列。執行緒刪除會移除在相同交易中的相依訊息與記憶體資料列及其相關聯的擷取資料。

範例

store.delete_thread("c1")
0

方法 get

依識別碼擷取儲存的記錄。

範例

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'

方法 list

列舉記錄類型的持續記錄。

注意事項

"user_profile""agent_profile" 為非作用領域記錄類型。對於這些記錄類型,會忽略 thread_iduser_idagent_id,動作者識別會保留在 record.id 中。

範例

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

方法 list_thread_messages

傳回繫線的持續訊息。

範例

store.list_thread_messages("c1")
[]

依相似性搜尋記錄。

作用中的搜尋後端取決於存放區設定的 SearchStrategySearchStrategy.VECTOR 會將查詢向量與儲存的記錄向量進行排名。SearchStrategy.HYBRID 會透過預存搜尋文字及其受管理索引狀態查詢 Oracle 的受管理混合索引。SearchStrategy.KEYWORD 只會以符合已儲存搜尋文字的文字來排名。

範例

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'

篩選純量描述資料值:

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

篩選巢狀描述資料:

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

完全符合清單值,包括順序:

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

描述資料陣列包含值時進行篩選:

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

結合多個描述資料條件。記錄必須滿足每個索引鍵:

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

方法 search_async (非同步)

以非同步方式依語意相似度搜尋記錄。

方法 update

更新儲存的記錄內容、搜尋狀態、描述資料以及時戳值。

範例

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'

搜尋策略

類別 oracleagentmemory.core.dbsearch.SearchStrategy

基本:Enum

Oracle DB 商店的搜尋行為。

資料庫存放區初始化使用選取的策略來選擇受管理綱要搜尋功能。VECTOR 搜尋會儲存本機內嵌項目。KEYWORD 搜尋會儲存可搜尋的文字和文字索引。HYBRID 搜尋會儲存可搜尋的文字加上 Oracle 管理的混合向量索引狀態。資料庫存放區會在啟動時驗證此綱要功能,因此不相容的策略不會無訊息地傳回不完整的結果。

VECTOR
僅依向量相似性搜尋。商店會內嵌具有已設定之內嵌器的查詢,或使用呼叫者提供的 query_vector,並依與已儲存向量的距離排列記錄的等級。搭配針對向量搜尋設定的資料庫綱要使用。
HYBRID
使用 Oracle 管理的混合索引進行搜尋。Oracle 將已儲存搜尋文字的文字比對與資料庫內混合索引的向量排名結合。當使用者可以依自然語言以及精確的識別碼、別名或產品名稱進行搜尋時,請使用此選項。此策略要求存放區的主要內嵌程式必須是 OracleDBEmbedder,因此受管理索引和儲存共用一個資料庫內模型。
KEYWORD
僅透過與預存搜尋文字相符的關鍵字 / 文字進行搜尋。此模式不會建立本機查詢內嵌,不需要 Oracle DB 內嵌程式。在針對現有混合綱要開啟時,它可以使用該混合索引的文字分支,而不需要建立新的混合索引。當精確的識別碼、別名、產品名稱或短詞應該在沒有向量融合的情況下驅動擷取時,請使用此選項。

HYBRID = 'HYBRID'

關鍵字 = 'KEYWORD'

VECTOR = 'VECTOR'

搜尋索引同步模式

類別 oracleagentmemory.core.dbsearch.SearchIndexSyncMode

基本:Enum

受管理資料庫搜尋索引的重新整理行為。

此設定控制 Oracle 何時對資料庫備份文字感知搜尋顯示新的或變更的搜尋文字。SearchStrategy.HYBRID 使用 Oracle 管理的混合向量索引。SearchStrategy.KEYWORD 使用 Oracle Text 索引。SearchStrategy.VECTOR 不使用此設定。

ON_COMMIT
當寫入交易確認時重新整理索引。這是大多數應用程式的預設和最簡單選項,因為記錄在成功寫入後可立即搜尋。它可以新增寫入交易的工作,因為索引會立即保持在最新狀態。
MANUAL
不要自動重新整理索引。在您自行執行資料庫端索引同步作業之前,新的或更新的記錄可能不會出現在關鍵字或混合搜尋中。這對於您要在其中控制重新整理工作執行時的大量載入或維護時段非常有用。
AUTO
讓 Oracle 以非同步方式重新整理受管理的混合索引。寫入可以避免立即重新整理成本,但搜尋結果可能會落後最近的寫入,直到 Oracle 完成背景重新整理為止。只有 SearchStrategy.HYBRID 才支援此模式。

警告:此設定控制受管理搜尋索引存在之後的進行中維護。它不會使第一個索引建置成為非同步。透過現有預存搜尋文字建立受管理的混合索引可能會長時間執行,因為 Oracle 會從該文字建立受管理的混合索引狀態。

自動 = 'AUTO'

手動 = 'MANUAL'

ON_COMMIT = 'ON_COMMIT'

存留時間

類別 oracleagentmemory.core.retention.MemoryRetentionConfig

基礎:object

Oracle DB 備份記錄的綱要層次保留設定值。

類別 oracleagentmemory.apis.ttl.TimeToLiveAnchor

基本:Enum

用來從存留期間計算到期時間戳記的錨點。

CREATED_AT
從記錄的資料庫建立時戳計算到期時間。這是呼叫者省略 ttl_anchor 時的預設值。
TIMESTAMP
從記錄的預存事件時戳計算到期時間。當訊息或記憶體代表較舊的事件,且應該相對於該事件時間而非插入時間到期時,使用此選項。

CREATED_AT = 'CREATED_AT'

TIMESTAMP = 'TIMESTAMP'

綱要原則

類別 oracleagentmemory.core.SchemaPolicy

基礎:strEnum

Oracle DB 存放區的綱要建立原則。

需求 _ 現有

驗證完整受管理綱要已經存在且為最新狀態。請勿建立或修改資料庫物件。

空白建立 (_I)

如果沒有受管理物件,啟動安裝綱要。如果物件已經存在,則需要完整且最新的受管理綱要。

需要建立 (_I)

建立遺漏的受管理物件並套用支援的受管理綱要升級。

重新建立

刪除並重新建立所有受管理綱要物件。這是破壞性的。