Dispositions, Knowledges, and Experiences
我今天還在理解 agent 的記憶機制。總之呢我覺得上一篇文章寫到的四種記憶類型我還是很不理解,所以就去找了 CoALA(Cognitive Architectures for Language Agents)這篇 essay 來讀,發現跟我原本理解的其實差蠻多的。
我現在的理解是這樣的:記憶分三種型別(procedural,semantic,以及 episodic),然後有兩種狀態(working memory 與 long-term memory)。也就是說,每一種型別的記憶也都有分「已經載入到 context(對話)裡的」以及「還沒載入到對話裡的」兩種。畢竟不管是哪種記憶,都要先載入變成 working memory 之後才會發生作用。
那麼,這三種記憶型別到底怎麼分呢?我發現原本論文裡面講解的更清楚。簡單來說就是:
- Procedural memory 是 agent 的行為規範,也就是你直接叫他怎麼做怎麼做,或者跟他說「當碰到什麼情況時要怎麼做」、「不可以怎樣怎樣」之類的。所以這包括了一些規範與技巧,因為技巧是「碰到什麼問題的時候如何解決」,也屬於行為指令。
- Semantic memory 是 agent 的知識。也就是「這個是什麼」「那個不是什麼」「誰誰誰在做什麼」之類的。這是在描述事實或者狀態,不是指令。
- Episodic memory 是 agent 的經驗,也就是「某月某日我做了什麼事」之類的。所以他總是完成式或過去式,描述一個過去的動作或事件。
如果用自然語言來看的話,大概可以這樣分:
- Procedural memory 就是(條件句+)命令句。
- Semantic memory 是 be 動詞陳述句。
- Episodic memory 是過去式動詞的句子。
我的文法學不是很好,可能有錯,但反正就是這種感覺。
另外一種譬喻法是 coding 的:
- Procedural memory 是 function 與 event trigger,也就是叫程式去做事。
- Semantic memory 是數值指派,也就是把值賦予給某變數或常數。也就是程式中狀態的部分。
- Episodic memory 大概就是 log,也就是執行紀錄。
所以我現在的 agent 記憶套裝就變得很簡單,有三份文件:行為規範(procedural memory/depositions),知識庫(semantic memory/knowledges),以及日誌(episodic memory/experiences),然後每份文件再分成初始載入(eager loading)與按需載入(lazy loading)兩種層級。然後 Craft 這種 outliner 意外的適合做載入時間區分,就是把 lazy 的東西丟進子頁面就可以了。
我覺得是蠻有趣的,因為 CoALA 應該是奠基於對人類記憶的分析架構之上。然後雖然三種記憶可能會有不同的實作方式,比如常常被用到的就是 mem0 那種向量或者語意索引,RAG 之類的,但我覺得 .md 或者 Craft 文件這類純文字格式(Craft 的優勢是內建搜尋與 block 等級定位),搭配上自然語言,其實就已經很夠用了。有的時候語意索引如果切太碎可能還會有搞丟脈絡的風險。
這個時候自然語言的訓練突然就派得上用場了。