Agent 的記憶設計:短期、長期與什麼都不記
記憶不是越多越好。多數 Agent 需要的其實是好的摘要,而不是完整歷史。
「加上記憶」聽起來像必備功能,實際上多數 Agent 的問題不是記不住,而是記太多——上下文被歷史塞滿,反而找不到當下重要的資訊。
三個層次
- 工作記憶:本次任務的訊息串。必要,且應該完整保留。
- 會話記憶:同一個使用者的跨輪對話。建議只保留摘要與關鍵事實。
- 長期記憶:跨會話的知識與偏好。用檢索取用,不要全部塞進提示。
會話記憶用滾動摘要
MAX_TURNS = 8
def compact(messages):
if len(messages) <= MAX_TURNS:
return messages
old, recent = messages[:-MAX_TURNS], messages[-MAX_TURNS:]
summary = model.chat([
{'role': 'system', 'content': '把下列對話壓縮成不超過 200 字的事實清單,只保留後續可能用到的資訊。'},
{'role': 'user', 'content': render(old)},
]).content
return [{'role': 'system', 'content': f'先前對話重點:{summary}'}] + recent長期記憶要能被遺忘
寫入長期記憶時一併存入來源與時間,並設計更新與刪除路徑。使用者說「我改用另一個帳號了」時,舊事實必須能被覆蓋,否則 Agent 會一直用過期資訊。
什麼時候不需要記憶
單次任務型的 Agent(分析一份檔案、修一個 bug)不需要跨會話記憶。硬加上去只會引入不必要的狀態與隱私問題。
長期記憶存的應該是「事實」而非「對話」。「使用者偏好繁體中文、任職於製造業」比一整段閒聊有用得多,也小得多。