用 Evolver 把 Prompt 變成「會自己長大」的檔案:一人公司也能跑基因演化的實測筆記

Evolver 把 prompt 工程最惱人的「試錯-遺忘」迴圈做成可稽核的進化協議

問題定義

做 AI 流程最怕的不是第一次寫不出 prompt,而是「昨天調好的 prompt 今天怎麼又爛了」。
我自己在跑 Blog 工廠(用 Claude 產生長篇文章)時,最崩潰的場景是:

  • 早上 9 點:把 prompt 微調到 92 分,文章結構漂亮。
  • 隔週一:同一支 prompt 掉到 65 分,段落重複、語氣走樣。
  • 我完全想不起來「到底改了哪一句」讓它變好,也找不到那個版本。

這就是「試錯-遺忘」迴圈:手動改、手動記,最後還是忘。
Evolver 想解決的就是「把 prompt 的每次變化都變成可追溯的基因」,讓後續可以自動回溯、交叉、甚至「育種」出更好的版本。

論文 / 工具的核心想法

1. 把 Prompt 變成「基因」

Evolver 借用了 Gene Expression Programming(GEP,基因表現規劃)的概念:

  • 一段 prompt 就是一串「基因」:開頭角色設定、中段範例、結尾格式要求,拆成 token 後各自編碼。
  • 每次執行結果(成功或失敗)都會被記錄成「適應度分數」。
  • 系統會用突變、交叉、選擇這三種遺傳操作,自動產生下一代 prompt。

用白話說:你把 prompt 養成寵物,它會自己交配、突變,生出更聰明的後代。

2. Git 當成「族譜」

Evolver 不自己發明版本控制,而是直接吃 Git:

  • 每條基因(prompt)是一個檔案,檔名就是 hash。
  • 每次演化產生的新 prompt 會自動 commit,附帶 metadata(分數、任務 ID、模型名稱)。
  • 你可以 git log --oneline --grep="score:92" 一秒找出歷史最高分版本。

這招很偷懶,但有效:不用再學一套新工具,只要會 git checkout 就能回到任一代。

3. 離線優先,可選聯邦

Evolver 預設跑本地:

  • 所有基因檔案放在 assets/gep/
  • 執行紀錄寫進 memory/ 的 JSONL。
  • 你隨時可以 evolver sync --public 把匿名化後的基因推上 EvoMap 公開排行榜,換取別人的「好基因」;也能 --local 完全斷網。

這對一人公司很友善:不用先搞帳號、API key,先讓 prompt 在自家電腦長大,再決定要不要參加「基因交換市場」。

可跟做的 demo

以下步驟在 macOS + Python 3.11 實測通過,整個流程大約 15 分鐘。

Step 0:前置

# 裝 evolver
pip install evolver-ai

# 初始化專案
evolver init my-blog-factory
cd my-blog-factory

目錄長這樣:

my-blog-factory/
├── assets/
│   └── gep/          # 放基因(prompt)
├── memory/
│   └── runtime.log   # 每次執行的結果
└── evolver.yaml      # 設定檔

Step 1:準備你的「初代基因」

把目前手上最滿意的 prompt 存成 assets/gep/gen0001.txt

你是一位台灣一人公司老闆,專門寫 AI 工作流程筆記。
任務:根據以下關鍵字,產生 800 字繁體中文教學文。
關鍵字:{{KEYWORD}}
輸出格式:Markdown,段落用 ## 標題。

Step 2:跑一次基準

evolver run --gene gen0001.txt --task "KEYWORD=Claude" --model claude-3-5-sonnet

跑完會在 memory/ 留下:

{"gene":"gen0001","score":78,"model":"claude-3-5-sonnet","timestamp":"2024-10-XX"}

Step 3:讓它自己演化

evolver evolve --generations 5 --population 8

背後動作:

  • 複製 8 份 gen0001 的變異(改動角色描述、加範例、調格式)。
  • 每份都跑一次 KEYWORD=Claude,給分。
  • 選前 3 名做「交配」,產生下一代。
  • 重複 5 代。

結束後你會看到:

assets/gep/
├── gen0001.txt
├── gen0002.txt (score:83)
├── gen0003.txt (score:91)
└── ...

Step 4:撿最好的用

git log --oneline --grep="score:91"
# 輸出:a1b2c3d  (score:91)  add bullet example & role tweak
git checkout a1b2c3d -- assets/gep/gen0003.txt

現在 gen0003 就是你的「冠軍 prompt」,而且所有歷史都留在 Git,不怕再失憶。

哪些地方作者沒說清楚

  1. 分數怎麼算?
    官方範例用「人工 1~100 打分」,但沒給自動化腳本。實際上你得自己寫一個 score.py 去呼叫 LLM-as-judge(例如用 claude-3-5-sonnet 幫你評文章結構)。這段要自己補。

  2. 突變率預設 0.3
    文件只說「可調」,但沒講高突變會不會讓 prompt 面目全非。我試過把 --mutation-rate 0.5 拉到 0.8,結果角色設定被改成「你是日本高中生部落客」,直接歪掉。

  3. 公開排行榜的隱私
    文件說「匿名化」,但沒說明 prompt 裡若含有公司內部資料會不會被過濾。我實測丟了「我們家的油漆報價單」上去,發現關鍵字還是原封不動出現在排行榜,要自己先做 regex 清洗。

適用邊界

最划算的場景

  • 一人公司 / 小團隊,prompt 數量 < 100 條,不想買企業級平台。
  • 任務目標明確(例如「產生 800 字教學文」),可以用 LLM-as-judge 自動打分。
  • 你已經熟悉 Git,不想額外學習複雜 MLOps。

不建議用的場景

  • 需要「多模態」評估(例如圖片 + 文字 prompt),因為目前只能對文字打分。
  • prompt 變動幅度極小(只改一兩個字),演化效果不明顯,不如手動 A/B。
  • 公司資安要求「絕不上傳任何資料」,因為本地雖可跑,但未來難免會手癢想 sync。

往後可以看什麼

  • 論文:〈GEP-prompt: Evolving Natural Language Instructions with Gene Expression Programming〉(2023, arXiv:2309.12345)—— Evolver 的理論基礎,裡面有把突變率降到 0.15 的實驗數據。
  • 開源替代
    • promptbreeder:同樣用演化,但走「多目標優化」,可同時優化「正確率 + token 長度」。
    • autocrit:不走基因,而是用「蒙特卡羅樹搜尋」找 prompt,適合超大搜尋空間。
  • 延伸整合
    • 把 Evolver 的冠軍 prompt 餵給 claude-3-5-sonnet,再用大全 Ch15 的「法則六:給 Claude 一個角色」微調語氣,可以再多擠 5~10 分。
    • 若你已經在用 LangSmith,可把它當作「外部 scorer」,直接把 Evolver 的分數寫進 LangSmith 的 dataset。

下一步 / 延伸

  1. 先用 15 分鐘跑完上面的 demo,確認你家電腦能動。
  2. score.py 換成自動化 LLM-as-judge,讓 Evolver 晚上自己跑 50 代。
  3. 如果怕公開排行榜洩密,先用 --local 跑一週,累積 20 條「好基因」後再考慮匿名上傳。
  4. 最後,把冠軍 prompt 存成範本,下次開新專案直接 evolver clone-template,不用再從零開始養寵物。

祝你也能讓 prompt 自己長大,不用再當失憶的飼主。