AI 代理為何會「失憶」?

開發 AI Agent 時,最常遇到的困擾之一就是記憶體問題。當對話結束或代理重啟後,AI 會失去所有上下文,仿佛變成了一個全新的人。這是因為傳統的對話框架並沒有設計長期記憶機制。

每次使用者重新啟動 Agent,它只會記得預設的 system prompt,至於之前對話過的內容、做過的决策、收集的資料,全部歸零。這就是所謂的「Agent Death」現象。

傳統解決方案的限制

大多數開發者直覺想到的解決方案是使用資料庫來儲存對話歷史。常見的做法包括:

  • 關聯式資料庫:如 PostgreSQL、MySQL,儲存對話記錄
  • 向量資料庫:如 Pinecone、Weaviate,儲存語義相似的內容
  • 文件資料庫:如 MongoDB,儲存非結構化資料

但這些方案都有缺點:需要額外架設伺服器、增加開發複雜度、可能產生隱私疑慮,以及後續維護成本。

免資料庫的記憶解決方案

其實有一種更輕量的方法可以解決這個問題。核心概念是「Prompt 作為記憶體」——將歷史對話濃縮後,直接注入下一次的 system prompt 中。

具體步驟如下:

  1. 對話摘要化:使用 AI 本身將長對話濃縮成關鍵要點
  2. 結構化儲存:將摘要轉換為 JSON 或 Markdown 格式
  3. 動態注入:在每次新對話時,將摘要加到 system prompt 開頭
  4. 定期清理:設定閾值,自動歸檔過舊的記憶

這種方法不需要任何外部資料庫,所有資料都在 prompt 內文裡完成。

實作範例程式碼

以下是一個簡單的 Python 實作概念:

class SimpleAgentMemory:
    def __init__(self, max_tokens=2000):
        self.memory = []
        self.max_tokens = max_tokens
    
    def add_interaction(self, user_msg, agent_msg):
        self.memory.append({
            "user": user_msg,
            "assistant": agent_msg
        })
    
    def get_context_prompt(self):
        if not self.memory:
            return ""
        
        # 將歷史濃縮成摘要
        summary = "以下是之前的對話摘要:\n"
        for i, msg in enumerate(self.memory[-5:], 1):
            summary += f"{i}. 使用者:{msg['user']} | AI:{msg['assistant'][:100]}...\n"
        
        return summary

# 使用範例
memory = SimpleAgentMemory()
memory.add_interaction("幫我訂機票", "好的,請問您想去哪裡?")
memory.add_interaction("東京", "請問您希望什麼時候出發?")

context = memory.get_context_prompt()
print(context)

何時該使用資料庫?

免資料庫方案適合輕量應用,但如果遇到以下情況,還是建議使用正式資料庫:

  • 對話量龐大:每日數千則以上對話
  • 需要精確檢索:要從特定日期找出特定對話
  • 多代理共用:多個 Agent 需要共享記憶
  • 長期儲存需求:需要保留超過一年以上的歷史

總結來說,初期開發或小型專案可以先用這種免資料庫方案快速上線,等需求成長再考慮升級到正式儲存架構。