過度約束反效應
Erik Schluntz 在「Vibe coding in prod」演講的關鍵反直覺洞察:模型在沒被過度約束時表現最好。
Erik 原話
我們的模型在沒被過度約束時表現最好。不要花太多力氣設計超嚴格的 prompt 模板,把它當成你給 junior 工程師的引導即可。
反直覺在哪
直覺:「給越詳細的指令,AI 表現越穩定」 事實:過度約束反而讓表現變差
原因:
- 模型訓練時看過大量「good code」的範例
- 它知道什麼是合理的命名 / 結構 / 風格
- 你寫死每個變數命名 / 每行邏輯,等於強迫它放棄 prior knowledge
- 結果:跑出來的 code 像「機械翻譯你的偽碼」而不是「為這個 codebase 寫的好 code」
判斷原則
| 場景 | 該給多細 |
|---|---|
| 不在乎實作細節 | 只給需求 + Done 定義即可 |
| 想沿用既有架構 | 指定參考哪個檔案、用哪些 class |
| 避免 | 把每個變數命名、每行邏輯都寫死 |
對照例子
✅ 適度約束(高品質產出)
[目標] 加一個 user activity report endpoint
[範圍] 可動 src/reports/、不可動 src/auth/
[既有模式] 請參考 src/reports/revenue.ts 的結構
[約束] 不引入新套件、500ms 內回應
[驗證] tests/reports/activity.test.ts 必須涵蓋 401 / empty / paginated
[Done] PR 標示 AI 範圍❌ 過度約束(產出僵化)
[目標] 加一個 user activity report endpoint
[實作]
- 第 1 步:建一個 ActivityReportService class
- constructor 必須接受 db: Database 參數
- method 名稱必須是 getActivityByDateRange
- return type 必須是 Promise<ActivityRecord[]>
- 第 2 步:在 admin.ts 加 route /api/admin/reports/activity
- middleware 順序:authMiddleware → adminCheckMiddleware → activityHandler
- response status code 一定是 200,data 一定包在 { result: ... } 裡
- error 一定回 { error: { code, message } }
- 第 3 步:tests/reports/activity.test.ts 必須有 7 個 test case:
- it should return 401 when not logged in
- it should ...
[每個 test 的 describe 必須這樣寫,每個 expect 必須這樣寫...]問題:
- AI 完全沒發揮空間,就是個「機械翻譯」
- 實作細節(譬如 method name、response shape)寫死後,AI 沒法根據 codebase 既有 convention 調整
- Code review 變成檢查「AI 有沒有照抄 prompt」而不是「code 是否合理」
「Junior 工程師」類比
把它當成你給 junior 工程師的引導即可。
對 junior:
- 給目標、範圍、參考、約束、驗證標準
- 不會逐行教他怎麼寫
- 給他空間發揮,不滿意再 review feedback
對 AI 同理。
跟 Prompt 必備六元素 的關係
六元素是必備,不是越詳細越好:
| 六元素 | 適度 | 過度 |
|---|---|---|
| 目標 | 一句話 | 一頁 |
| 範圍 | 列檔/資料夾 | 列每行 |
| 既有模式 | 指定參考檔 | 列每個 class 名 |
| 約束 | 真實限制 | 想像中的限制 |
| 驗證 | 測試 / 標準 | 每個 test case 文字 |
| Done | 一段話 | 詳細 checklist 50 條 |
違反時的常見症狀
- ❌ AI 寫出來的東西完全照抄 prompt,不像 codebase 風格
- ❌ AI 顯得「機械化」,沒有合理的 design judgment
- ❌ Review 時感覺像 review 一份「翻譯文」而不是「自然 code」
- ❌ 改 prompt 一個變數命名,AI 整段跟著改(過度依賴文字)
邊界:什麼時候要更約束
不是所有場景都該放寬:
| 場景 | 該過度約束嗎 |
|---|---|
| Leaf node | ❌ 放寬,給空間 |
| Core code | ✅ 偏向約束,但更該由人寫 |
| 跟法務 / 安全相關 | ✅ 約束(不要冒險) |
| 跟商業邏輯 edge case 相關 | ✅ 約束(避免漏) |
相關
- Vibe Coding / Be Claude’s PM 法則
- Prompt 必備六元素
- Vibe Coding Anti-Patterns — 過度約束是其中一個 anti-pattern
- Effort 推理強度 — 過度約束類似強迫低 effort