# Agent Memory (智能體記憶)

*筆記是你能讀能改的真相，索引只是可以丟棄的快取。*

> **Agent Memory（智能體記憶）** = **你能讀、能改的筆記** + **可以隨時丟棄的索引**。每條筆記都引用它的來源；索引（全文、向量、圖、輪廓）只是筆記的派生物；後台維護作業只**提議**修改，絕不改寫原始日誌。

**AN-07** · 符合性等級: L2 Memory · 概念組: 知識

## 要解決的問題

記憶框架把記憶放進不透明的資料庫：無法檢查、對比、遷移、糾正，也難以可靠刪除；索引和嵌入模型被綁死。而記憶本身就是攻擊面：2026 年的[一項研究](https://arxiv.org/abs/2606.04329)裡，持久記憶投毒在兩個智能體上的平均攻擊成功率達 50.46%；[另一項研究](https://arxiv.org/abs/2607.05189)用一封精心構造的郵件，在檔案系統和向量兩種記憶後端上都得了手。

同時，「哪種記憶架構最好」遠沒有定論：基準互相矛盾。一份不押注任何檢索演算法的設計，才扛得住三年的變化。

## 工作方式

- **筆記是真相。** Markdown 加 YAML frontmatter：`kind`（情景、語義、程式、偏好）、`subject`、`sources`、`confidence`、`valid_from`、`valid_to`、`supersedes`、`origin`、`reviewed`。
- **更新而非覆蓋。** 新事實 `supersedes` 舊事實；區分有效時間與記錄時間，因為事實會變，而常見基準幾乎不測這一點。
- **索引是快取。** BM25（如 SQLite FTS5）、向量（可以多套並存）、可選的圖；每個派生物帶**配方**與**輸入**。換嵌入模型就是後台重算，舊索引保留到新索引的黃金召回測試達標為止。
- **兩類派生。** 確定性的（切塊、BM25、固定模型的嵌入）可重現；生成式的（LLM 摘要、抽取出的事實）只能「再生成並比對」，因此標記 `generated: true`，並且從不作為唯一副本。
- **寫入路徑。** `nas_remember` 把筆記（含來源）寫到當前分支；污點隨之繼承。來自 `external` 污點工作階段的筆記進入**隔離區**，標記為未審閱：可以被召回，但**不自動載入**，也不會進入 `MEMORY.md`。
- **讀取路徑。** `nas_recall` = 搜尋、候選、預算視圖加證據指標，並顯示筆記的來源與審閱狀態。
- **維護作業**（夜間或空閒時）：去重、把情景整合成語義事實、標記矛盾、讓過期的事實失效、重建索引。作業在分支上產出提案，由人或智能體審閱；**絕不刪除原始日誌**；度量「後悔率」（被回滾的提案比例）。
- **黃金召回測試。** 每個 Home 一組「問題、期望筆記」，換模型或索引器時自動迴歸。

## 從小處開始

- `memory/notes/*.md` 加 frontmatter；用 SQLite FTS5 做檢索。
- 在 CI 裡跑十條黃金問題。
- 向量索引和維護作業都可以以後再加；先把「來源」和「已審閱才自動載入」做對。

## 介面草圖

僅作示意。欄位名在規範 v0.3 之前可能調整。

*memory/notes/customer-acme.md*

```markdown
---
id: mem_4kq2
kind: semantic
subject: customer/acme
valid_from: 2026-10-02
valid_to: null
confidence: 0.8
origin: agent
reviewed: true
sources:
  - nas://home-box/agents/cleo/journal/2026-10-02.md@9f2c1de#L12-L18
supersedes: [mem_1xa9]
---
Acme renewed for 24 months; the champion moved from Dana to Luis.
```

## 規範的要求

- 筆記**必須**能脫離 Memory 層被讀取（它們是 Store 裡的普通檔案）。
- 每個派生物**必須**帶配方與輸入；索引**必須**可丟棄並可重建。
- 由受污染工作階段寫入的筆記，在被審閱之前**不得**自動載入。
- 新事實**必須**以 `supersedes` 取代舊事實，而不是覆蓋。
- 維護作業**必須**在分支上工作並只提議；**不得**刪除原始日誌。
- 每個 Home **應當**帶黃金召回測試，在模型或索引器變化時執行。

## 借鑑與區別

下面這些都是現成的思路，OpenClaw 的記憶架構已經做了來源標籤、按層隔離和整合時的污點傳播。**真正新的部分：** OpenClaw 在**單個執行環境內部**做；我們提議在**共享的儲存裡**做，讓任何執行環境都受益；並把索引降為可丟棄的快取，使檢索演算法可以更換而記憶不丟。

- [Letta Context Repositories](https://www.letta.com/blog/context-repositories/)
- [Letta: is a filesystem all you need?](https://www.letta.com/blog/benchmarking-ai-agent-memory/)
- [OpenClaw memory architecture](https://docs.openclaw.ai/concepts/memory-architecture)
- [Long-term memory security survey](https://arxiv.org/abs/2604.16548)
- [Graphiti](https://github.com/getzep/graphiti)
- [MemGPT](https://arxiv.org/abs/2310.08560)

## 坦誠的侷限

- 生成式派生物不可能逐位重現。
- 維護作業可能把錯誤「固化」成事實，所以它只提議，不直接改。
- 哪種記憶架構最好，目前沒有定論。

## 開放問題

- 何時由智能體自己寫，何時交給維護作業？
- 跨模型版本的迴歸標準是什麼？

## 常見問題

### 為什麼用檔案，不用向量資料庫？

檔案是你能讀、能改、能 diff、能帶走的真相；向量索引是它的派生快取，可以並存多套、隨時重建。Letta 的基準說明，只給智能體 `grep` 和檔案工具就有競爭力，但各家基準互相矛盾，所以設計不押注某一種檢索演算法。

### 怎樣防止記憶被投毒？

無法保證絕不被寫入，但可以限制後果：外部來源的內容帶著 `external` 標籤；受污染工作階段寫的筆記進入隔離區，不自動載入；合併要經過審閱；出了問題可以順著來源鏈找到受影響的筆記並回滾。

### 換嵌入模型要遷移記憶嗎？

不需要。筆記不變，只是在後台用新的配方重算索引；舊索引保留到新索引的黃金召回測試達標為止。

## 相關概念

- [Budgeted Reads (預算化讀取)](https://agentnas.com/zh-tw/concepts/budgeted-reads/): 同一個檔案可以用輪廓、章節、行範圍或全文來讀，按預算降級。
- [Cascade Forget (級聯遺忘)](https://agentnas.com/zh-tw/concepts/cascade-forget/): 沿血緣刪除派生物，按保留類處理歷史，並如實報告做不到的部分。
- [Trust Labels (信任標籤)](https://agentnas.com/zh-tw/concepts/trust-labels/): 來源與敏感度兩個小標籤，加上工作階段污點，強制執行 Rule of Two。

---

標準網址: https://agentnas.com/zh-tw/concepts/agent-memory/
更新於: 2026-11-11 · 規範草案 v0.2 · CC BY 4.0
