Skip to content

記憶作用域與生命週期:管理你的數位大腦

學完你能做什麼

  • 區分作用域:明白哪些記憶是「跟著你走的」(跨專案),哪些是「跟著專案走的」(專案專用)。
  • 管理記憶:學會手動查看、新增和刪除記憶,保持 Agent 認知的整潔。
  • 除錯 Agent:當 Agent 「記錯」東西時,知道去哪裡修正。

核心思路

opencode-supermemory 將記憶分為兩個隔離的作用域 (Scope),類似於程式設計語言中的全域變數和區域變數。

1. 兩種作用域

作用域識別符 (Scope ID)生命週期典型用途
User Scope
(使用者作用域)
user永久跟隨你
跨所有專案共享
• 編碼風格偏好 (如 "喜歡 TypeScript")
• 個人習慣 (如 "總是寫註解")
• 通用知識
Project Scope
(專案作用域)
project僅限當前專案
切換目錄即失效
• 專案架構設計
• 業務邏輯說明
• 特定 Bug 的修復方案

作用域是如何生成的?

外掛透過 src/services/tags.ts 自動生成唯一標籤:

  • User Scope: 基於你的 Git 郵箱雜湊 (opencode_user_{hash})。
  • Project Scope: 基於當前專案路徑雜湊 (opencode_project_{hash})。

2. 記憶的生命週期

  1. 建立 (Add): 透過 CLI 初始化或 Agent 對話 (Remember this...) 寫入。
  2. 啟用 (Inject): 每次開啟新會話時,外掛會自動拉取相關的 User 和 Project 記憶注入上下文。
  3. 檢索 (Search): Agent 在對話過程中可以主動搜尋特定記憶。
  4. 遺忘 (Forget): 當記憶過時或錯誤時,透過 ID 刪除。

跟我做:管理你的記憶

我們將透過與 Agent 對話,手動管理這兩個作用域的記憶。

第 1 步:查看現有記憶

首先,看看 Agent 現在記住了什麼。

操作:在 OpenCode 聊天框中輸入:

text
請列出當前專案的所有記憶 (List memories in project scope)

你應該看到: Agent 呼叫 supermemory 工具的 list 模式,並回傳一個列表:

json
// 範例輸出
{
  "success": true,
  "scope": "project",
  "count": 3,
  "memories": [
    {
      "id": "mem_123456",
      "content": "專案使用 MVC 架構,Service 層負責業務邏輯",
      "createdAt": "2023-10-01T10:00:00Z"
    }
    // ...
  ]
}

第 2 步:新增跨專案記憶 (User Scope)

假設你希望 Agent 在所有專案中都使用中文回覆。這是一條適合 User Scope 的記憶。

操作:輸入以下指令:

text
請記住我的個人偏好:無論在哪個專案,都請始終用中文回覆我。
請將其儲存到 User Scope。

你應該看到: Agent 呼叫 add 工具,參數 scope: "user"

json
{
  "mode": "add",
  "content": "User prefers responses in Chinese across all projects",
  "scope": "user",
  "type": "preference"
}

系統確認記憶已新增,並回傳一個 id

第 3 步:新增專案專用記憶 (Project Scope)

現在,我們為當前專案新增一條特定規則。

操作:輸入以下指令:

text
請記住:在這個專案中,所有的日期格式必須是 YYYY-MM-DD。
儲存到 Project Scope。

你應該看到: Agent 呼叫 add 工具,參數 scope: "project"(這是預設值,Agent 可能省略):

json
{
  "mode": "add",
  "content": "Date format must be YYYY-MM-DD in this project",
  "scope": "project",
  "type": "project-config"
}

第 4 步:驗證隔離性

為了驗證作用域是否生效,我們可以嘗試搜尋。

操作:輸入:

text
搜尋關於「日期格式」的記憶

你應該看到: Agent 呼叫 search 工具。如果它指定了 scope: "project" 或進行混合搜尋,應該能找到剛才那條記憶。

驗證跨專案能力

如果你新建一個終端機視窗,進入另一個不同的專案目錄,再次詢問「日期格式」,Agent 應該找不到這條記憶(因為它被隔離在原專案的 Project Scope 中)。但如果你問「我希望用什麼語言回覆」,它應該能從 User Scope 找回「中文回覆」的偏好。

第 5 步:刪除過時記憶

如果專案規範變了,我們需要刪除舊記憶。

操作

  1. 先執行 第 1 步 取得記憶 ID(例如 mem_987654)。
  2. 輸入指令:
text
請忘記 ID 為 mem_987654 的那條關於日期格式的記憶。

你應該看到: Agent 呼叫 forget 工具:

json
{
  "mode": "forget",
  "memoryId": "mem_987654"
}

系統回傳 success: true


常見問題 (FAQ)

Q: 如果我換了電腦,User Scope 的記憶還在嗎?

A: 取決於你的 Git 配置。 User Scope 是基於 git config user.email 生成的。如果你在兩台電腦上使用相同的 Git 郵箱,並且連接到同一個 Supermemory 帳號(使用相同的 API Key),那麼記憶是同步的。

Q: 為什麼我看不到剛才新增的記憶?

A: 可能是快取或索引延遲。 Supermemory 的向量索引通常是秒級的,但在網路波動時可能有短暫延遲。此外,Agent 在會話開始時注入的上下文是靜態的(快照),新增的記憶可能需要重新啟動會話(/clear 或重新啟動 OpenCode)才能在「自動注入」中生效,但透過 search 工具可以立即查到。


附錄:原始碼參考

點擊展開查看原始碼位置

更新時間:2026-01-23

功能檔案路徑行號
Scope 生成邏輯src/services/tags.ts18-36
記憶工具定義src/index.ts183-485
記憶類型定義src/types/index.ts-
客戶端實作src/services/client.ts23-182

關鍵函數

  • getUserTag(): 基於 Git 郵箱產生使用者標籤
  • getProjectTag(): 基於目錄路徑產生專案標籤
  • supermemoryClient.addMemory(): 新增記憶 API 呼叫
  • supermemoryClient.deleteMemory(): 刪除記憶 API 呼叫

下一課預告

下一課我們學習 搶佔式壓縮原理

你會學到:

  • 為什麼 Agent 會「失憶」(上下文溢出)
  • 外掛如何自動偵測 Token 使用率
  • 如何在不丟失關鍵資訊的前提下壓縮會話