你有沒有遇過這種人:
你們明明昨天才聊過,他今天一開口就像完全沒這回事;但當你提醒他「昨天不是講過嗎」,他又能立刻接上前因後果,甚至還順手把你忘掉的小細節補回來。
這種人通常不是記性特別好,而是他知道什麼時候該翻舊帳、什麼時候該先看眼前。
OpenClaw 的記憶系統也很像這樣。
它不是把所有東西塞成一團,而是把記憶切成幾個層次:
所以第 8 天我想問的不是「OpenClaw 有沒有記憶」,而是:
/new 之後第一輪,到底先載入什麼?active-memory 是在什麼位置插隊進來的?MEMORY.md 跟 memory/*.md 是怎麼分工的?這一篇我想把它寫成「OpenClaw 怎麼安排記憶的上場順序」。
/new 和 /reset 後,第一輪會先看到什麼?startupContext 為什麼只管 bare reset 的第一輪?active-memory 在主回覆前做了什麼?MEMORY.md、daily notes、dreaming promotion 的先後順序是什麼?如果把 OpenClaw 的記憶想成一場會議,那它不是只有一個發言人。
它比較像是三個不同資歷的人輪流講話:
但這裡有個很重要的細節:
OpenClaw 把這件事拆得很細。
MEMORY.md 是長期摘要,通常會被納入基礎上下文。memory/YYYY-MM-DD.md 是日常筆記,正常情況下不會每輪都灌進 prompt,而是在需要時由工具或啟動前導拉進來。agents.defaults.startupContext 則是在 bare /new 或 /reset 的第一輪,先把最近幾天的 daily memory 預載進去。active-memory 則更進一步,它在主回覆前先跑一次 recall,看看要不要補上過去的偏好、決策或上下文。
所以如果你問「誰先說話」,答案其實是:
這不像傳統那種「一層覆蓋另一層」。
它比較像一個有時間感的會議流程。
先看最直接的證據:startupContext 是專門為 bare /new 和 /reset 做的第一輪前導,而且它會把最近幾天的 daily memory 帶進來。
`agents.defaults.startupContext.*` | One-shot reset/startup model-run prelude, including recent daily `memory/*.md` files. Bare chat `/new` and `/reset` are acknowledged without invoking the model
再看設定本身。
📄 文件:
docs/gateway/config-agents.md:209-209
{
agents: {
defaults: {
startupContext: {
enabled: true,
applyOn: ["new", "reset"],
dailyMemoryDays: 2,
maxFileBytes: 16384,
maxFileChars: 1200,
maxTotalChars: 2800,
},
},
},
}
這裡其實已經把先後順序講得很清楚了:
startupContext 不是一般每輪都跑的東西這像什麼?
像你早上進會議前先看昨天的會議記錄,不是把整個公司成立史從頭翻一遍。
再看 MEMORY.md 的位置。
Workspace + bootstrap files (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` when new, plus `MEMORY.md` when present).
這表示 MEMORY.md 是直接屬於系統 prompt 的一部分。
它不是要等你查才出現,而是作為整體上下文的一塊固定底座存在。
但 daily memory 不是這樣。
`memory/*.md` daily files are not part of the normal bootstrap prompt; they stay on-demand via memory tools on ordinary turns. Reset/startup model runs can prepend a one-shot startup-context block with recent daily memory for that first turn.
這一段很重要。
它等於在告訴你:
這就形成了很清楚的分工。
再看 active memory 的位置。
Active memory is an optional bundled plugin that runs a blocking memory recall sub-agent before the main reply, for eligible conversational sessions.
它不是在 main reply 之後才補充,也不是等模型回完再回頭修正,而是先做一次 recall,再決定主回答要帶什麼背景。
這就是它和 startupContext 最大的差異:
MEMORY.md 則是穩定存在的長期底座如果要把順序濃縮成一句話,大概是:
長期記憶定基調,短期記憶補現場,active memory 補背景,主回覆再正式開講
最後看長期記憶怎麼來。
📄 文件:
docs/concepts/dreaming.md:11-22
Dreaming is the background memory consolidation system in `memory-core`. It moves strong short-term signals into durable memory while keeping the process explainable and reviewable.
Long-term promotion still writes only to `MEMORY.md`.
這裡把短期和長期的分工講死了:
MEMORY.md
所以長期記憶不是「比較舊的短期記憶」。
它是經過挑選、穩定下來、足以反覆引用的結論。
MEMORY.md 像背景音,不是廣播我很喜歡把 MEMORY.md 想成背景音樂。
它一直在,但不會每秒都跳出來搶話。
它提供的是整體氛圍,像使用者偏好、長期規則、穩定決策。
例如:
這些內容不一定是當下最新的事,但它們會影響模型怎麼理解整個任務。
memory/YYYY-MM-DD.md 比較像便條紙。
你今天在那裡寫了很多臨時資訊:
這些東西不一定值得永遠留下,但如果隔天還要接著做,它們就很重要。
所以 short-term memory 的核心價值不是保存永久真理,而是讓你不必每次都從零開始。
很多系統的第一輪最容易出現一種尷尬:
模型剛醒來,卻不知道你今天想接哪個話題。
OpenClaw 的 startupContext 就是來補這一刀的。
它只在 bare reset 的第一輪,把最近幾天的 daily memory 先放進去,讓模型不是空著腦袋開始。
這樣它才知道:
這很像你打開電腦先看昨天的 TODO,而不是先從公司制度總表讀起。
如果說 startupContext 是「開場前的 briefing」,那 active memory 就是「你講到一半時,旁邊有人適時提醒你上次講過什麼」。
它不是每次都出聲。
它只在 eligible session 裡跑,而且還有 timeout、模型、prompt style、tool allowlist 這些限制。
所以它比較像臨場輔助,而不是資料庫本身。
這點很關鍵,因為它避免了兩個極端:
這是我認為最成熟的一點。
OpenClaw 沒有設計成「長期記憶永遠贏」。
它更像是在做判斷:
例如,MEMORY.md 可能記得某個人一向偏好簡潔寫法;但如果今天這個專案明確要求要寫成完整報告,那短期上下文就該優先。
這不是忘記長期記憶,而是知道長期記憶不能把現場現況蓋掉。
dreaming 的存在,讓短期和長期之間多了一道緩衝。
不是今天剛聊到的東西馬上就進 MEMORY.md。
它要先累積信號、通過門檻、被判定有持續價值,才會升級。
這就很像你不會因為一場會議講到某個點,就立刻把它寫進公司章程。
你會先觀察它是不是反覆出現、是不是值得長期保留、是不是之後還會用到。
OpenClaw 的記憶優先順序,本質上就是這種「先觀察,再定案」。
startupContext 能補回最近現場active-memory 讓每輪回答前都有一次有條件的 recallMEMORY.md 保持穩定,不會被日常噪音污染如果換成簡化版做法,把所有東西都丟進同一個上下文,短期看起來很省事。
但長期會變成:
OpenClaw 顯然不想用這種方式工作。
MEMORY.md 是長期記憶的底座,提供穩定背景與長期偏好memory/YYYY-MM-DD.md 是短期記憶,記住現場、方便續接startupContext 只在 bare /new 和 /reset 的第一輪把最近 daily memory 拉進來active-memory 會在主回覆前先做一次 blocking recall,補必要背景第 7 天我們看的是 OpenClaw 怎麼記對的東西。
第 8 天往前推一點,就變成另一個更實際的問題:
它不是只有記不記得,而是要安排誰先講、誰後講、誰只是備用資料。
這其實很像真實工作的場景。
你不是每次都要翻最完整的歷史,反而常常只需要:
下一篇我想接著往下看:
上下文太長怎麼辦?OpenClaw 的取捨
因為當記憶越來越會說話,下一個問題就會來得很自然:
到底要把多少東西塞進模型的視窗裡,才不會又記得太多、又看得太少?