用 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~100 打分」,但沒給自動化腳本。實際上你得自己寫一個score.py去呼叫 LLM-as-judge(例如用claude-3-5-sonnet幫你評文章結構)。這段要自己補。 -
突變率預設 0.3
文件只說「可調」,但沒講高突變會不會讓 prompt 面目全非。我試過把--mutation-rate 0.5拉到 0.8,結果角色設定被改成「你是日本高中生部落客」,直接歪掉。 -
公開排行榜的隱私
文件說「匿名化」,但沒說明 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。
- 把 Evolver 的冠軍 prompt 餵給
下一步 / 延伸
- 先用 15 分鐘跑完上面的 demo,確認你家電腦能動。
- 把
score.py換成自動化 LLM-as-judge,讓 Evolver 晚上自己跑 50 代。 - 如果怕公開排行榜洩密,先用
--local跑一週,累積 20 條「好基因」後再考慮匿名上傳。 - 最後,把冠軍 prompt 存成範本,下次開新專案直接
evolver clone-template,不用再從零開始養寵物。
祝你也能讓 prompt 自己長大,不用再當失憶的飼主。