使用者曾經因颱風造成物流中斷,獲得一次特殊的全額退款。幾個月後,他為另一筆普通訂單申請退款,客服 Agent 從歷史紀錄中找到了上次的結果:
customer_id: 456
refund_result: full_refund_approved
reason: exceptional_weather_disruption
如果系統只追求「記得越多越好」,很可能把這段經驗整理成:
這位客戶可以全額退款。
這句話和歷史紀錄很接近,卻刪掉了最重要的限制:那是特定訂單、特定原因下的一次例外,不是永久政策,也不是使用者偏好。
上一篇談的是 Agent 中斷後如何從可信的 Checkpoint 繼續。這一篇把時間拉得更長:一項資訊離開原任務之後,憑什麼繼續影響未來決策?
Memory 的價值不是永遠記得,而是讓仍然有用、範圍正確、可以被修正的過去,在適當時機影響現在。
- Agent Memory 需要哪些核心角色
- 寫入、取回、修正與停止影響,分別要做什麼決策
- 如何讓 Memory 不只可用,還能更快、更省地被使用
- 最新的 VoiceMem 有哪些設計值得非語音 Agent 借鏡

左邊的 Agent:「放心,我全部都記住了。」
右邊的 Agent:「等一下,真正重要的是哪一筆?」
Agent 系統裡有很多會被保存的資料,但保存不代表它們具有相同權力。
| 核心角色 | 它要回答什麼 | 不代表什麼 |
|---|---|---|
| 原始紀錄 | 過去實際發生過什麼? | 每句內容都正確、都值得永久保留 |
| 任務 State | 目前任務做到哪裡、系統相信什麼? | 可以直接跨任務變成長期偏好 |
| Memory Record | 哪些過去資訊值得在未來再次被考慮? | 取回後可以直接拿來行動 |
| Context Builder | 這一輪模型真正需要看見什麼? | 必須把所有歷史都塞進模型 |
| 權威來源與驗證規則 | 這筆記憶現在是否仍然有效? | 相似度高就等於真實 |
例如,上一次退款紀錄是原始事件;目前訂單是否符合退款條件,仍由最新訂單狀態與政策決定。Memory 可以提醒 Agent「曾有一次颱風例外」,卻不能直接把新訂單的 refund_eligible 改成 true。
CoALA 原始論文把工作記憶與長期記憶分開,也把讀寫記憶視為 Agent 的內部動作。這個分類最值得借鏡的地方不是名詞,而是責任邊界:對話紀錄、任務進度、跨任務經驗與本輪輸入,本來就不該是同一份資料。
完整的 Memory System 因此不只是一個資料庫,而是一個持續做四次判斷的循環。
從原始事件到未來決策,可以把 Memory 簡化成四個節點:

這四個節點形成閉環。寫入決定未來有什麼可以被找到;取回品質反過來暴露分類與索引是否合理;修正與停止影響則避免系統只進不出,讓錯誤與過期內容一直累積。
接下來不從產品功能出發,而是沿著 customer 456 的退款案例,逐一看每個節點需要做什麼決策。
最容易實作的方案,是每段對話結束後都產生摘要,再全部寫進向量資料庫。問題是「發生過」和「未來值得使用」並不是同一件事。
一筆候選記憶至少要回答:
這就是升格規則(Promotion Policy):原始事件先是候選,通過門檻後才成為長期記憶。AWS 公開的 User Preference Memory Strategy Prompt就是一個具體案例,它把候選分成新增、更新與略過,並要求略過一次性事件、暫時狀態、重複、過度推測與敏感內容。這不是通用標準,卻證明「值得記住」可以被寫成可測試的規則。
同一份資料也可能因用途不同而有不同表示:
order A 一次例外。三者是用途分類,不一定要分成三套資料庫。真正重要的是每筆紀錄保留來源、對象、範圍、觀察時間、可信程度與有效狀態。否則一次 Episode 經過摘要後,就可能悄悄變成永久 Rule。
Memory 寫得正確,還不代表用得有效率。資料跨過幾百個 Session 後,如果每次都對全部紀錄做相似度搜尋、取回數十筆結果,再交給模型判斷,延遲、Token 與干擾內容會一起增加。
向量搜尋只回答「哪些文字在語意上相近」。完整的取回路徑還需要:
AWS 的 RetrieveMemoryRecords回傳的是語意查詢候選,Structured Metadata則能先限制搜尋範圍。兩者放在一起看,正好說明:相似度負責找候選,Metadata 與應用規則負責縮小問題,權威來源才負責確認現在是否仍為真。
下次 customer 456 申請退款時,系統可以取回上次颱風事件,但在真正影響決策前,仍要重新查詢目前訂單、政策版本與核准狀態。取回的是線索,不是授權。
效率也不只是把資料庫查詢從 200 ms 降到 100 ms。更大的改善常來自:不要讓不可能相關的記憶進入昂貴的排序與模型 Context。 2026 年 8 月 26 日發布的 VoiceMem,正好提供了一個最新案例。
VoiceMem: Streaming Dual-Brain Memory for Real-Time Interaction是一篇 2026 年 8 月 26 日發布的 arXiv v1 preprint。它以即時語音為場景,但最值得借鏡的不是語音,而是它如何重新組織候選空間。
VoiceMem 沒有直接把 Query 丟進整個 Memory Store,而是在底層記憶引擎之上加入一層輕量結構:
top-K 仍能取得足夠資訊。
作者在 LoCoMo 的一個 K=5 設定中,報告分數 91.2、平均 430 個 Memory Token,以及約 134 ms 的 Retrieval Latency。這些不是通用準確率或 Production SLA:論文仍是 preprint,主要表格使用 LLM-as-a-Judge,134 ms 也只是作者環境中的 Retrieval,不含完整 ASR、網路、生成與語音合成。
不過,比單一數字更值得注意的是它的 Ablation:移除上層 Index,在相同 K=5 下 LoCoMo 分數下降 9.9;作者也把同一層 Index 套到 Mem0、LangMem 與 Zep,三個 Backend 都有提升,但提升後的分數仍不同。這表示上層組織具有可移植價值,卻不代表換任何 Backend 都會得到相同效果。
它也可以延伸到非語音場景。論文本身就使用 LoCoMo、LongMemEval、Memora 等文字記憶評估;而在架構上,語音專屬的 Partial Transcript、Speaker ID 與 VAD 可以被替換:
這些是從 VoiceMem 的解耦架構做出的工程延伸,不是論文已逐一驗證的產品能力。真正能通用的原則是:先組織與縮小候選空間,再做昂貴搜尋;把可非同步的更新移出回應路徑;讓上層記憶管理不綁死單一儲存引擎。
假設事後調查發現,order A 並不是因颱風獲得全額退款,而是商品本身有瑕疵。最危險的做法,是新增一筆相反紀錄,卻讓舊記憶繼續正常被取回。下一次查詢可能同時看到兩個版本,最後又把衝突交給模型猜。
新資訊出現時,系統至少要分辨:
| 發生什麼事 | 應如何處理 | 舊內容的角色 |
|---|---|---|
| 新資訊只是補充細節 | 合併並保留新舊來源 | 仍有效,但內容更完整 |
| 偏好或事實真的改變 | 建立新版本,讓舊版退出一般取回 | 保留時間脈絡,不再代表現在 |
| 舊資料原本就錯 | 更正紀錄並追蹤衍生摘要與索引 | 只供稽核,不能再影響決策 |
因此,衝突不能只靠「最新的贏」。使用者明確陳述通常應高於模型從單次行為做出的推測;正式系統的即時結果,也應高於幾個月前的摘要。修正機制必須比較來源權威性、適用範圍、發生時間與可信程度。
這也是為什麼 Memory Write Path 不該永遠只有 Insert。它還要能定位相關紀錄、合併重複、建立版本關係,並讓一般 Retrieval 預設排除已失效內容。
一筆記憶不再影響未來,可能有不同原因:它已過期、使用者撤回、來源被證明錯誤,或系統只想降低低價值內容的取回機率。讀者不需要先背四組英文名詞,只要先問兩件事:
「不再主動召回」不一定代表資料已刪除;「清除聊天」也不一定會同步移除由聊天抽取的偏好、摘要、Embedding、Index 與 Cache。AWS DeleteEvent 文件就明確提醒:刪除 Short-term Event,不會自動刪除由它產生的 Long-term Record,後者需要另外處理。
所以產品若提供「忘記這件事」,至少要說清楚:刪除的是原始對話、長期記憶,還是兩者;索引與衍生副本如何失效;使用者能否查看、修正與逐筆移除。對敏感資料,還應提高寫入門檻、縮短期限,或要求明確同意。
最後一定要做行為驗證:刪除或使紀錄失效後,用相同 Query 再查一次,確認它不會進入 Context,也不再改變 Agent 的回答。API 回傳成功,只能證明一次操作完成;它不能替你證明系統真的忘了。
上線前,可以用 customer 456 做一個最小閉環測試:
order A 的事件記憶;如果系統只能證明「資料可以寫入與搜尋」,它完成的是一個歷史資料庫。只有當它能回答「為什麼留下、如何有效找到、怎麼隨新證據改變、何時停止影響未來」,才真正具備可治理的 Agent Memory。
下一篇會沿著最後一道邊界繼續:即使 Agent 想起了正確資訊,它仍可能在錯誤狀態下使用正確工具。Tool Schema 只能檢查參數形狀;可靠執行還需要完整的 Tool Contract。
