記憶系統:Hermes 到底記得什麼、記在哪
先說結論。很多人以為「Hermes 有記憶」代表它把你們講過的每一句話都一字不漏地記著。其實不是。而且先搞懂它「不記什麼」,往往比搞懂它「記什麼」更有用。
先給一句話的定義。這裡說的「記憶」,指的是 Hermes 為了下次對話還認得你、還記得你的專案,主動幫你保留下來的一小撮重點。它不是完整的對話錄音。
(順帶解釋一個常出現的詞:agent,中文常叫「智慧代理」,你可以直接把它想成那個會幫你動手做事的 AI 助理,也就是 Hermes 本身。)
Hermes 的記憶分成兩層:一層很小、永遠帶在身上;另一層幾乎無限大、要用的時候才去翻。搞懂這個分工,你就知道每件事該放進哪一層。
第一層:小而精的核心記憶
Hermes 會在你電腦上的 ~/.hermes/memories/ 這個資料夾裡,放兩個檔案1。
(先解釋路徑寫法:~ 代表你自己的使用者資料夾;開頭那個點 .hermes 表示這是一個隱藏資料夾,平常在檔案總管裡不一定看得到。)
下面表格裡會出現兩個單位。「字元」就是一個字、一個符號算一個。「token」你可以想成「文字的小塊」,是 AI 用來計算文字長度的單位,大約幾個英文字母、或一個英文單字算一個 token。
| 檔案 | 上限 | 記什麼 |
|---|---|---|
MEMORY.md | 2200 字元(約 800 token) | 環境事實、專案慣例、工具怪癖與 workaround、完成的任務、有效的技巧2 |
USER.md | 1375 字元(約 500 token) | 你的名字、角色、時區、溝通偏好、工作習慣、技術程度3 |
為什麼故意設這麼小? 因為這兩個檔案有個特別的用法:每次對話一開始,它們會被整包塞進「系統提示」,而且整場對話都不再變動。
(這裡兩個詞順手解釋一下。「系統提示」(system prompt)是每次對話開頭先餵給 AI 的一段背景說明,相當於它的開場交代。官方把這種「開頭塞進去、全程不變」的做法叫「凍結快照模式」(frozen snapshot pattern)。)
這樣設計是為了保住一個叫 prefix cache(前綴快取) 的效能4。前綴快取的意思是:每次對話開頭那段固定不變的內容,AI 可以先算好、記起來,下次直接沿用,不必重算,省時間也省錢。反過來說,如果記憶塞太多,等於每次對話都拖著一大包東西上路,又慢又貴。
所以這一層的邏輯很簡單:只留「每次對話都該知道」的精華。至於大段的程式碼、log(程式執行過程留下的紀錄)、整張資料表,會被直接跳過,理由就是「太大了,不適合放記憶」5。
agent 怎麼更新這一層
Hermes 用三個動作來管理記憶:add(新增)、replace(替換)、remove(移除)6。
其中 replace 是用「子字串比對」的方式替換。白話說,就是拿你給的一小段文字,去檔案裡找到一模一樣的那一段,再把它換掉。
注意這裡沒有 read(讀取)這個動作。原因是:記憶本來就會自動塞進系統提示,agent 隨時都「看得到」,不需要特地再去讀一次7。
如果你不希望它自由亂寫,可以打開一個審核開關。做法是編輯 ~/.hermes/config.yaml 這個設定檔。
(.yaml 是一種設定檔格式,每一行寫成「名稱: 值」,靠開頭的空白縮排來表示層級關係,所以縮排不能亂加亂減。)
memory:
memory_enabled: true
write_approval: false # 預設 false,自由寫入
memory_char_limit: 2200
user_char_limit: 1375
把 write_approval 從 false 改成 true 之後,agent 每次要寫入記憶都會先暫存起來,等你用 /memory pending 這個指令審核過,才真的寫進檔案8。
(/memory pending 是你在對話框裡直接輸入的指令。這類指令通常都以一條斜線 / 開頭。)
第二層:幾乎無限大的對話檔案庫
那核心記憶塞不下的東西,跑去哪了?其實都還在。 它們就躺在你過去所有對話的完整紀錄裡。
Hermes 用一個叫 session_search 的工具去翻這些歷史對話。它查的是一個叫 SQLite 的小型資料庫(檔案就在 ~/.hermes/state.db),用的是 FTS5 全文索引,容量「無限」,一次查詢大約 20 毫秒就有結果9。
(順手解釋:SQLite 是一種輕巧的資料庫,整個就是一個檔案。FTS5 全文索引是一種技術,讓「在一大堆文字裡找關鍵字」變得非常快,就像書後面的索引頁。)
這一層有個關鍵特性很容易被誤會:它撈回來的是資料庫裡的原始訊息,不做 AI 摘要、也不截斷10。
(這裡的「AI 摘要」指的是讓背後那顆 AI 大腦,也就是 LLM(大型語言模型),把內容重新濃縮成幾句話。)
也就是說,你三個月前講過的話,它翻出來是逐字原文,而不是模型憑印象重述的版本。這比「摘要過的版本」可靠得多。
這對你的實際意義
搞懂這兩層,你就知道該怎麼「餵」它:
- 希望它每次都記得的事(你的偏好、專案慣例)→ 明確講給它聽,讓它寫進核心記憶。因為空間很小,講重點就好。
- 偶爾才要翻的細節(某次是怎麼解掉某個 bug 的)→ 不用刻意叫它記,它會留在對話紀錄裡,需要時用
session_search撈得回來。 - 一大包資料(整份 log、整個檔案)→ 別期待它「記住」,那不會進記憶。真要用的話,當下讓它去讀就好。
記憶 vs 上下文檔案
Hermes 還有另一種東西也常被叫做「記憶」,叫做上下文檔案(context files),例如 SOUL.md、AGENTS.md。兩者的差別在於11:
- 記憶(MEMORY.md / USER.md):由 agent 自己策展、有大小上限、會隨時間演變。
- 上下文檔案:由你手動維護、內容固定,是你給 agent 的設定,而不是它自己觀察到的東西。
一句話總結:記憶是「它學到的」,上下文檔案是「你交代的」。
常見問題
換一台電腦,記憶會跟著走嗎?
記憶存在你這台電腦本機的 ~/.hermes/memories/。換電腦時,先用 hermes backup 打包,再到新機器上 import(匯入),記憶就會一起搬過去。詳細步驟見 換電腦:搬到新機器。
記憶滿了會怎樣?
因為有字元上限,agent 會自己取捨:用 replace 去更新舊的、用 remove 去清掉過時的。這也正是它只留精華的原因。
我可以直接手動編輯 MEMORY.md 嗎?
可以,它就是一個純文字檔。但要提醒你:下次 agent 也可能改動它,你手動改的內容不保證會被永久保留。真正重要的偏好,與其自己改檔,不如直接講給 agent 聽,讓它寫進去。
下一步
- 搞懂技能系統(另一種記憶)→ 技能系統
- 對話太長爆掉了 → context length exceeded 怎麼解
- 想先看整體 → 什麼是 Hermes Agent
Footnotes
-
Nous Research, Memory:記憶存於 ~/.hermes/memories/ 的 MEMORY.md 與 USER.md:https://hermes-agent.nousresearch.com/docs/user-guide/features/memory (2026-07-24 存取) ↩
-
同上,MEMORY.md 上限 2200 字元,記錄環境事實、專案慣例、工具怪癖、任務日記、有效技巧 ↩
-
同上,USER.md 上限 1375 字元,記錄名字、角色、時區、溝通偏好、工作習慣、技術程度 ↩
-
同上,凍結快照模式:記憶在對話開始時一次性注入系統提示,整場不變,以保住 prefix cache ↩
-
同上,大段程式碼、log、資料表「太大了,不適合放記憶」會被跳過 ↩
-
同上,記憶工具三動作:add、replace(子字串比對)、remove ↩
-
同上,無 read 動作:記憶自動注入系統提示,agent 隨時看得到 ↩
-
同上,config.yaml 的 memory 區塊;write_approval:true 時以 /memory pending 審核後才寫入 ↩
-
同上,session_search 查 SQLite state.db 的 FTS5 全文索引,容量無限、約 20ms ↩
-
同上,session_search 回傳資料庫原始訊息,不做 LLM 摘要、不截斷 ↩
-
同上,記憶(agent 策展、有上限、會演變)vs 上下文檔案 SOUL.md / AGENTS.md(手動維護、內容固定) ↩