記憶體修訂

Memory Bank 會透過記憶體修訂資源,自動維護記憶體的版本記錄。每當系統建立或修改記憶內容時,都會儲存新的不可變更修訂版本,讓您清楚瞭解資訊的演變過程,以及每個步驟中擷取的內容。

本文說明記憶體和修訂版本的生命週期,以及列出、取得和還原修訂版本等作業。

如要進一步瞭解如何生成回憶集錦,請參閱生成回憶集錦。

回憶集錦及其修訂版本的生命週期

資料來源和記憶體修訂版本

您可以直接建立、更新或刪除記憶 (分別使用 CreateMemory、UpdateMemory 或 DeleteMemory),也可以動態執行這些操作 (使用 GenerateMemories)。記憶修訂版本資源會提供記憶資源在所有修改作業中的完整版本記錄。每次建立或修改記憶體時,系統都會自動儲存新的不可變更修訂版本。讓您清楚瞭解記憶內容的演變過程,以及在每個步驟中擷取和整合的特定資訊 (適用於記憶生成)。

每個記憶體資源都有一或多個相關聯的子項記憶體修訂版本資源:

  • Memory 資源一律會反映資訊的目前整合狀態。單一記憶體可以反映多個要求和資料來源的衍生資料。

    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(...)
    )
    
  • MemoryRevisions 資源代表父項記憶體的歷來狀態。每個修訂版本都是變化事件發生時的記憶體快照。如果記憶體是使用 GenerateMemories 突變,修訂版本也會包含從資料來源 (extracted_memories) 擷取的資訊,然後再與記憶體的現有內容合併。

    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/...'
    )
    

    記憶體修訂功能預設為啟用。如要停用記憶體修訂版本,請參閱「停用記憶體修訂版本」。

建立回憶集錦

記憶體可以直接使用 CreateMemory 建立,也可以使用 GenerateMemories 動態建立。透過記憶生成,如果沒有涵蓋相同範圍類似資訊的現有記憶,系統就會生成記憶:

# Direct creation using CreateMemory
client.memory_banks.memories.create(name=memory_bank_name, ...)

# Dynamic creation using GenerateMemory
client.memory_banks.memories.generate(name=memory_bank_name, ...)

建立記憶體時,系統會建立單一 Memory 資源和子項 MemoryRevision:

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

list(client.memory_banks.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",
    ...
  )
]
"""

記憶體更新

您可以直接使用 UpdateMemory 更新記憶體,也可以使用 GenerateMemories 動態更新記憶體。透過記憶生成,如果整合程序判定新資訊與相同範圍的所有現有記憶內容重複、互補或矛盾,系統就會動態更新記憶內容。

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

# Dynamic update using GenerateMemories
client.memory_banks.memories.generate(name=memory_bank_name, ...)

更新記憶內容時,系統會更新現有的 Memory 資源,並建立新的子項 MemoryRevision。

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

list(client.memory_banks.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",
    ...
  )
]
"""

刪除記憶

記憶體可以直接使用 DeleteMemory,或動態使用 GenerateMemories。記憶體生成功能會根據整併程序判斷新資訊是否會使相同範圍的現有資訊失效,並動態刪除記憶體。

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

# Dynamic delete using GenerateMemories
client.memory_banks.memories.generate(name=memory_bank_name, ...)

刪除記憶體時,系統會刪除現有的 Memory 資源,並建立新的子項 MemoryRevision。最新記憶體修訂版本中的 fact 為空,因為這反映了刪除突變。

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

list(client.memory_banks.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",
    ...
  )
]
"""

刪除父項記憶體後,孩子記憶體修訂版本最多只會保留 48 小時。在這段復原期間,你仍可檢查記憶體修訂版本,並將記憶體復原至先前的修訂版本。

記憶修訂版本作業

本節說明如何檢查記憶體修訂版本,以及將記憶體復原至先前的修訂版本。

列出修訂版本

使用 ListMemoryRevisions 傳回記憶體的所有修訂版本。

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

更改下列內容:

  • MEMORY_NAME:記憶體資源名稱,格式為:projects/.../locations/.../reasoningEngines/.../memories/...

生成回憶集時,您可以提供要套用至相關修訂版本的修訂版本標籤。標籤是任意鍵/值組合。舉例來說,您可以為修訂版本加上標籤,標示用於生成回憶集錦的資料來源 ID,然後依據這個標籤篩選修訂版本:

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

list(client.memory_banks.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"
    }
    ...
  )
]
"""

取得修訂版本

使用 GetMemoryRevision 擷取個別記憶體修訂版本。

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

更改下列內容:

  • MEMORY_REVISION_NAME:要擷取的記憶體修訂版本資源名稱,格式為: projects/.../locations/.../reasoningEngines/.../memories/.../revisions/...

復原回憶集錦

使用 RollbackMemory 將記憶體還原至先前的修訂版本。

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

更改下列內容:

  • MEMORY_NAME:要更新的記憶體資源名稱,格式為: projects/.../locations/.../reasoningEngines/.../memories/...

  • REVISION_ID:要還原的修訂版本 ID。這是記憶修訂版本資源名稱的最後一個區隔,例如 projects/MyProject/locations/us-central1/reasoningEngines/123/memories/456/revisions/789 中的 789。

如要復原 GenerateMemories 對回憶集所做的變更,請將回憶集還原至變更前的修訂版本。記憶生成回應會針對每個更新或刪除的記憶,參照先前的修訂版本 (previous_revision):

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

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

停用記憶體修訂版本

記憶體修訂功能預設為啟用。您可以為所有對「記憶庫」執行個體的要求停用記憶修訂,也可以為每項要求個別停用。如果記憶體修訂版本已停用,記憶體發生變化時,系統不會建立記憶體修訂版本。

設定 Memory Bank 執行個體時,您可以針對所有要求停用記憶體修訂:

memory_bank = client.memory_banks.create(
  managed_semantic_memory_config={
    "disable_memory_revisions": True
  }
)

傳送要求時,您可以在要求層級停用記憶體修訂:

產生

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

建立

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

更新

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

修訂版本到期日

記憶體修訂內容不會永久保留。您必須設定修訂版本的到期時間,或使用預設到期時間。預設存留時間 (TTL) 為 365 天。您可以為所有對 Memory Bank 執行個體的要求設定到期時間,也可以為個別要求設定到期時間。記憶體修訂版本過期後,就無法檢查或回溯。

設定 Memory Bank 執行個體時,您可以為所有要求設定存留時間:

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

如要在要求層級為每個記憶體修訂版本設定存留時間,請在要求中加入 revision_expire_time 或 revision_ttl:

存留時間

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

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

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

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

有效期限

import datetime

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

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

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

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