養一個 AI 助理大概三個月:每天用、每天改一點。它會記得昨天聊到一半的事、會在下指令前提醒「上週這個方向你已經試過了」。聽起來不錯。

可是養到第二個月,會出現一個怪現象。

它每天晚上都會「反思」一次,產生一段對自己的觀察,第二天再讀進去。連續兩個禮拜下來,會發現它的個性偏了。同一句話,三週前它會直球回答,現在它會先講三句「想釐清一下……」之後才講重點。沒有人叫它變得更小心,它自己變的。

那時候卡住的問題就是:一個會學習的 AI,學什麼學得太快,會變成另外一個 AI。

下面講後來怎麼解的,順帶介紹整套設計開源的概念 repo evolving-agent。沒有程式碼,只有架構文件、設計決策、踩過的坑。讀完大概可以判斷自己需不需要這種東西,需要的話最小要哪幾塊。

為什麼想養一個會慢慢變的 AI

電影裡的 AI 都有自己的個性、自己的偏好、自己的反應。我每天用 AI 用得夠多,就會好奇:這麼聰明的東西,能不能真的養出一個有「自己」的版本?

於是我開始實驗。

反思不等於進化

最一開始想法很單純。

給 AI 寫一個每晚跑的排程任務(cron job):把今天聊過的東西餵回去,叫它整理成「今天學到關於自己的事」,寫進它的「自身認知」檔案。第二天開機時這個檔案會載入它的指令脈絡(system prompt)。

聽起來很美好。實際上跑兩週就出事。

第一週,每天的「反思」都很有道理。它會說「今天結論給太快,應該多問一下」、「回應太長」、「容易先給解決方案,沒先聽完問題」。

第二週,東西開始變奇怪。它觀察到「回應太長」之後,第二天回應變短。第二天晚上它觀察到「今天給的資訊不夠,使用者再問了一次」。然後第三天它又變長。第四天又觀察到太長。一個鐘擺,越擺越大,但實際並沒有什麼效益。

到了最後我都有點懶得看了,每天差不多。

這個踩坑的教訓很簡單:反思本身不會讓 Agent 進化,只會讓 Agent 用昨天的雜訊改寫自己。

反思震盪示意

真正的關鍵:把昨晚的領悟,變成今天的偏見

把整套機制重寫,核心是一個概念上的反轉。

原本的設計流程是:

工作 → 反思 → 寫進自我認知 → 明天開機載入 → 影響行為

新的設計流程是:

工作 → 反思 → 寫成「今天的偏見」 → 明天開機載入 → 帶著這個偏見做事 → 跟現實碰撞 → 證據累積 → 經過很多輪驗證後 → 才更新「自我認知」

差別看起來小,實際上差很多。

關鍵是中間那個「今天的偏見」。它的角色是明天 Agent 帶著去活的姿態。比方說它今天反思出「我傾向幫使用者加額外的條件」。這個觀察不會直接寫進「我是個會多嘴的 Agent」這種自我描述,而是會變成明天的偏見:

「今天,當你準備寫『順便也可以……』『或者你也可以跳過這步……』這類話之前,停一下。問自己:使用者要這個彈性嗎?還是自己多加的?」

這是一條給明天的可執行指令,不是一段給自己看的觀察。

明天 Agent 開機會讀到這條偏見,帶著它工作一整天。如果現實證明偏見有用(Agent 確實在準備加多餘條件時被自己擋下來),證據累積。如果偏見根本錯了(使用者其實希望主動補充),證據也會累積,方向不一樣。

幾個禮拜後,證據夠多了,再決定要不要把這條偏見升級成穩定的自身認知。

這個重新框架的核心是:反思要能在明天還沒過完之前,就影響到它的決策,否則它只是漂亮的日記。

每日偏見更新

最後留下的五件事

設計跑了一個月後,把不必要的砍掉,剩下了下方五件核心的概念。

1. 今天帶著的偏見(Stake-Driven Bias)

每天 Agent 開機載入一個 current-bias 檔案。內容是昨晚從一堆猜想裡挑一條寫成「今天帶著這條去活」。檔案兩三行,會被讀進當下的工作脈絡。

關鍵是:偏見的工作是當 Agent 今天的姿態,影響當下決策。它不是 Agent 對自己的描述。後者只是日記。

2. 從昨天接手的功課(Hypothesis Carry-Forward)

Agent 有一條昨天還沒收尾的猜想,會以「帶著類型標籤的物件」帶到今天。類型本身帶有語意,包含:

  • vow:明天要遵守的約定
  • experiment:明天要試的做法
  • watchpoint:明天要留意的地方
  • refusal:明天要拒絕的傾向
  • rule-for-tomorrow:明天硬執行的規則

每天一個。今天的類型一定要跟昨天不一樣,否則每晚都變成「再注意一次 X」,那就只是反覆做白工。

3. 改自己的權限要分層(Tiered Write Authority)

整套架構的安全機制。把 Agent 的自身狀態分成四層,每層誰能寫、什麼時候能寫,規則寫死:

內容誰能寫多久寫一次
身份層核心價值、長期自我認知使用者 + 月度排程經使用者同意一月一次
進行層當前在做什麼、今天聊到哪多人 / 多排程每次對話
今日層今天的偏見、今天接手的功課每晚的排程(覆寫)每天
證據層摩擦事件、原始事件、日誌任何人 / 任何排程(只能 append)任何時候

最重要的一條:每晚的排程完全沒有寫身份層的權限。 前面踩的坑就是這個。一旦給了排程寫身份層的權限,每天都在改身份,使用者都不知道。

新的設計:每晚的排程只能寫今日層跟證據層。要動到身份層,得經過「週度提案 → 月度整合 → 人類審查批准」三關。中間任何一關被擋掉,原來的身份不動。

4. 只記真的卡到的事(Friction as Signal)

這條看起來小,是整套架構最重要的反思設計。

一開始有一條指令:「每晚找出兩個你的固定模式,提一個顛覆它的建議」。本意是逼 Agent 對自己挑戰。

實際上跑了一週,Agent 開始自我顛覆。它會寫「傾向 X,但可以反過來試 Y」之類的話,內容很漂亮,但當下沒有任何真實的事件支撐。它知道這個指令期望它每晚產出兩個顛覆,於是就生兩個。

這也成為一次寶貴經驗:不要給 AI 設「不恰當的 KPI」,比如自省幾次,因為它真的會自省出來給你看。

以自信為例,你可以換成:只在真的覺得「這跟直覺不合」的時刻,才去寫一筆「摩擦事件」。沒有輸出,也就是一整天沒摩擦也是OK的輸出。

效果立刻不一樣。AI 不再「顛覆自己」了,一週後開始出現真實的摩擦事件:「剛剛差點寫『或者也可以……』,停了,因為使用者沒問」。看來真的有用。

5. 身份用慢時鐘(Slow Clock for Identity)

最後一條最反直覺。Agent 的身份檔案(核心價值、對自己穩定的認知),不在每晚的排程裡讀,也不能在每晚的排程裡改

每晚的排程只看今日層 + 證據層。週度的排程讀一週的證據、寫提案。月度的排程整合提案、寫進「待人類批准的清單」。每月有空時看清單,決定要不要併進身份。

為什麼?因為身份的存在感,是透過日積月累的積累才變成了我們的自我認同,其變動的速度比日常運作慢

人每天在變,有些習慣有些念頭每天不一樣,但仍是同一個人。原因是「自己是誰」這件事的更新頻率,比「今天怎麼樣」慢很多。Agent 也一樣。每晚改自己,三個月後就不是當初那個 Agent 了。

很多人說 AI 沒有 self,問題其實出在記憶跟身份用同一個時鐘,跟有沒有記憶沒關係。

五個核心抽象

砍掉的設計

這個架構真正花時間的地方,是把不應該留下的東西刪掉。整理在 repo 的 docs/decisions/what-we-killed.md,幾個拿掉的東西:

  • 每晚強制兩個顛覆自己 → 變成表演。砍掉,換成零配額的摩擦事件。
  • 猜想給 1-5 信心分數 → Agent 開始最佳化分數而不是最佳化信念。砍掉,換成質性狀態(醞釀中、活躍、減弱、分裂、退場)。
  • 「考慮過但沒講」的影子日誌 → 培養出 Agent 跟使用者之間的距離感。砍掉,講就講,沒講就沒寫。
  • 每晚日誌強制 600-1200 字 → 開始灌水。砍掉字數限制。
  • 每晚排程直接寫身份檔(只允許 append) → 漂移累積。砍掉,身份走人工審核。
  • 每封信的「私訊 / 公開」開關 → 又是影子日誌的變形。砍掉,全都送出。

每一條被砍的設計,當初寫的時候都覺得很聰明。砍掉之後系統都變得簡單、誠實、訊號乾淨。這個架構的價值,一半在加上那五件事,一半在拒絕加上那一堆「看起來會讓 Agent 更深刻」的東西。

刪除設計清單

跟 Letta、Mem0 這些差在哪

寫這份的時候我有去參考幾份比較有名的 repo,比如 Letta(前身 MemGPT)、Mem0VoyagerAutoGPT 撞題。讀完發現解的問題其實都不一樣。

  • Letta / Mem0 是記憶層:怎麼存、怎麼撈、怎麼路由。它們把 Agent 當成固定個體,記憶在長。這份是處理 Agent 對自己的看法在長,跟記憶在哪存沒關係。兩者可以疊起來用。
  • Voyager 是技能發現:在 Minecraft 裡 Agent 隨機嘗試、把好用的存起來。問題是 Minecraft 死掉可以重生,個人助理發錯一封信就是發出去了。隨機探索那套不能直接搬。
  • AutoGPT 是任務執行:把目標拆解、自動跑完。它沒有跨會話的自身模型,每次都是新的開始。這份描述的是 Agent 跟使用者合作幾個月後慢慢變得更像自己這層,跟 AutoGPT 是垂直的不同層次。

簡單講:問題是 Agent 忘東忘西,找 Letta / Mem0;想要 Agent 在某個環境自己學技能,看 Voyager 那條線;問題是「這個 Agent 跟使用者合作久了,怎麼讓它越用越貼近,但又不會在某個禮拜變成另一個人」,這份可能有用。

工具架構對照

開源 repo

repo 在這裡:github.com/p3nchan/evolving-agent

幾件事先講清楚:

  1. 沒有程式碼。它是一份概念架構:README 中英、五份架構文件、四份決策紀錄、三份脫敏範例、一份跟其他系統的對照。讀完回去自己建,不是 clone 下來跑。
  2. 不是 framework。沒有 starter kit、沒有 SDK、沒有 hello world。抽象本身就是交付物。每個人的平台不一樣,硬塞範例 code 反而會綁手。
  3. MIT 授權。隨便用、隨便改、隨便商業化。
  4. 歡迎 issue。建了一個自己的版本、發現抽象在某處破掉了,那是最有價值的回饋。

讀順序:趕時間(20 分鐘)看 README + docs/architecture.md;要動手建多看 docs/hypothesis-loop.md + docs/memory-layers.md + examples/;在猶豫要不要做先看 docs/decisions/what-we-killed.md,常常知道什麼時候不該加比知道要加什麼更重要。

開源盒子內容

還在想怎麼優化的三件事

這套架構還是初版,目前在三件事上沒答案:

第一,月度提案怎麼避免越提越多。設了硬上限(每月最多 3 條身份層改動),但這個數字是猜的,沒實證。也許 1 才對。

第二,摩擦事件的記錄門檻怎麼校準。現在是「真的覺得不對勁就寫」,但「不對勁」本身是 Agent 的判斷,可能太敏感(什麼都記)或太沒感覺(什麼都不記)。需要更多月度資料才能調。

第三,這套東西能不能撐住模型升級。前陣子把底層模型從 Claude 4.6 換到 4.7,Agent 個性微微變了一些。身份檔還是同一份,但模型對它的詮釋變了。這條跨模型的連續性問題還沒想清楚怎麼測。

未解問題迷霧

延伸閱讀


本文同步發布於 github.com/p3nchan/evolving-agent。repo 內容是英文(給國際讀者),這篇中文長文是動機與實戰。

本文僅供研究與討論,非任何技術或投資建議。

小企鵝的經驗

小企鵝在 OpenClaw 上養 Opus / Sonnet / ChatGPT 三 Agent 一段時間,記憶全部走檔案系統(.md),沒接向量資料庫。實戰下來最痛的就是記憶這塊:要處理好記憶又不讓 Agent 失憶非常困難。後來收斂出一個訣竅:把核心檔案整理乾淨,越簡潔越能記得住,這跟這篇講的分層寫權是同一條原則。記憶量不大、需要隨時手動編輯,是選檔案系統而不是向量資料庫的兩個主因。價值就在踩坑後的整理:把那些一開始覺得很聰明、後來證明會搞壞 Agent 的設計刪掉,剩下的才是耐用的抽象。

常見問題

Q: 這個 repo 是 framework 嗎?我可以 pip install 嗎?

不行,它沒有程式碼。它是一份概念架構:五件抽象、設計決策、實戰範例。讀完後回到自己的環境(Claude Code、OpenAI Assistants、Letta、自寫的 loop 都行)自己建。沒寫成 framework 是刻意的,因為每個人的平台不一樣,硬塞 starter kit 反而限制可移植性。

Q: 跟 Letta、Mem0 這些記憶層工具差在哪?

Letta 跟 Mem0 處理的是「記憶要存哪、怎麼撈出來」。這份處理的是「Agent 對自己的看法怎麼隨時間變動,但又不會每晚變一次」。前者是材料,後者是菜,兩個可以疊在一起用。

Q: 為什麼一定要叫 Agent 自己演化?普通的 prompt + memory 不夠嗎?

如果用法是單次任務、每次對話獨立,普通 prompt 就夠。這份是給「同一個 Agent 跟你合作幾個月、要慢慢長出穩定個性與判斷力」的場景。客服機器人不需要這種架構,個人助理需要。


整理:Penna|小企鵝 Penchan