Prompt 工程實戰:讓 Claude Code 輸出品質翻倍的技巧
這是 Claude Code 系列的實用技巧篇。部分概念延伸自: 📖 Claude Code 自訂 Slash Commands:打造你的專屬 AI 工作流
🎯 前言
用 Claude Code 一段時間後,你會發現:同樣的任務,問法不同,結果差很多。
❌ "幫我修 bug"
→ Claude 猜測你要修哪個 bug,可能改錯地方
✅ "src/lib/auth.ts:45 的 getUserById 在 user 不存在時會拋出未處理的例外,
應該回傳 null 而不是 throw"
→ Claude 精準定位,一次改對
這不是 Claude 的問題——是我們給的資訊不夠。
這篇文章整理我用了幾百小時 Claude Code 後歸納出的 prompt 策略,分成「怎麼問」「怎麼給上下文」「怎麼避免常見錯誤」三個部分。
📂 第一部分:怎麼問
原則 1:說「做什麼」,不說「怎麼做」
❌ "用 Array.filter 過濾掉 null 值,然後用 Array.map 轉換格式"
✅ "過濾掉 users 陣列中的 null 值,然後把每個 user 轉成 { id, name } 格式"
Claude 擅長選擇實作方式。你越限制「怎麼做」,它越沒辦法用最好的做法。你的工作是說清楚目標和約束,讓它選擇手段。
例外:如果你有特定的技術要求(例如「必須用 PHP 7.4 相容的語法」),那就要說。但「用 Array.filter」這種層級的指示通常是多餘的。
原則 2:給精確位置
❌ "幫我修 auth 的 bug"
✅ "src/lib/auth.ts:45 的 getUserById 回傳值有問題"
Claude Code 可以自己找檔案,但你告訴它確切位置能省下大量搜尋時間。
包含的資訊越精確越好:
- 檔案路徑:
src/lib/auth.ts - 行號:
:45 - 函數名:
getUserById - 具體症狀:「user 不存在時會 throw」
原則 3:先說結果,再說背景
❌ "我們的系統用 PHP 7.4,有一個多租戶架構,資料庫是 MySQL 5.7,
每個機構一個資料庫,Session 管理用原生 PHP session,
最近有使用者反映登入很慢..."(說了一大段才到重點)
✅ "登入查詢太慢,需要優化 src/auth.php 的 SQL。
背景:PHP 7.4 + MySQL 5.7,多租戶架構"
Claude 讀到第一句就知道你要做什麼。背景放後面,它會自己判斷哪些背景相關。
原則 4:明確定義「完成」長什麼樣
❌ "優化這個查詢"
✅ "優化這個查詢,目標:
1. 不用 SELECT *,只查 id, name, email
2. 加上適當的 index
3. 查詢時間從 2 秒降到 200ms 以內"
如果你不定義「完成」,Claude 會用自己的判斷。有時候它會做太多(重構整個檔案),有時候做太少(只改一行)。
🔧 第二部分:怎麼給上下文
技巧 1:讓 Claude 先讀再做
✅ "先讀一下 src/lib/auth.ts 和 src/middleware/session.ts,
了解現在的認證流程,然後再幫我修改"
很多時候 Claude 的錯誤來自於沒看到完整的上下文。讓它先讀相關檔案,產出的結果會好很多。
技巧 2:貼上錯誤訊息
✅ "跑 npm run build 出現這個錯誤:
Error: Cannot find module './components/Header'
at Module._resolveFilename (internal/modules/cjs/loader.js:885:15)
幫我修"
不要自己解讀錯誤訊息再轉述——直接貼原文。Claude 從 stack trace 能讀出的資訊比你轉述的多得多:
- 具體是哪個模組找不到
- 呼叫鏈是什麼
- 是 build time 還是 runtime 的問題
技巧 3:給範例
✅ "幫我寫一個類似的 API endpoint。
參考 src/api/users.ts 的寫法,
但這次是處理 orders"
給一個「像這樣」的範例,比描述一堆規格有效。Claude 會從範例中推斷出你的命名慣例、錯誤處理方式、回應格式。
技巧 4:告訴 Claude 你的限制
✅ "這個專案不能升級 PHP 版本(卡在 7.4),
所以不要用 match 語法、named arguments、union types"
Claude 預設會用最新的語法和最佳實務。如果你的環境有限制,要提前說,不然它會寫出你的環境跑不起來的程式碼。
常見需要提前說的限制:
- 語言/框架版本
- 不能用的套件
- 效能要求
- 瀏覽器相容性
💡 第三部分:進階策略
策略 1:分階段下指令
複雜任務一次說完,Claude 容易遺漏後面的步驟。分階段更可靠:
第一步:
你:"先探索一下 src/auth/ 目錄,告訴我現在的認證流程"
Claude:(分析完畢,回報)
第二步:
你:"好,現在把 Session 換成 JWT,先列出計劃"
Claude:(列出計劃)
第三步:
你:"計劃 OK,開始執行"
Claude:(執行)
比起一次說「把 auth 從 Session 改成 JWT,先分析再列計劃再執行」,分階段讓你在每一步都能介入修正方向。
策略 2:用否定句設邊界
Claude 很容易「好心辦壞事」——你叫它修一個 bug,它順便重構了周圍的程式碼。
✅ "修 getUserById 的 null 處理。
不要改其他函數。
不要重新命名變數。
不要加 docstring。"
「不要做什麼」有時候比「要做什麼」更重要。
策略 3:要求特定輸出格式
✅ "用表格列出所有找到的安全問題:
| 檔案 | 行號 | 問題類型 | 嚴重度 | 建議修復 |
|------|------|---------|--------|---------|"
指定輸出格式讓結果更容易審閱。特別適合:
- Code review 結果
- 分析報告
- 比較表
策略 4:利用角色設定
✅ "你現在是一個 PHP 安全性專家。
審查 src/api/ 目錄中所有的 API endpoint,
專注在 SQL injection 和 XSS 風險"
給 Claude 一個「角色」會改變它的注意力分配。「安全性專家」會比通用 Claude 更注意安全問題、更少注意程式碼風格。
策略 5:對話中修正方向
不需要每次都重新開始。如果 Claude 的方向不對,直接修正:
Claude:(寫了一段用 React hooks 的程式碼)
你:"不要用 hooks,這個專案用的是 class components"
Claude:(改用 class components 重寫)
Claude 在同一個 session 中會學習你的修正,後續的輸出會自動調整。如果這個修正是跨 session 的,存進 Memory 讓它永久記住。
⚠️ 常見的反模式
反模式 1:過度禮貌
❌ "你好,如果你方便的話,能不能請你幫我看一下這段程式碼,
看看有沒有什麼可以改善的地方?謝謝你!"
✅ "review src/lib/auth.ts 的安全性"
Claude 不需要客套。簡短直接的指令效果更好,也省 token。
反模式 2:一次做太多
❌ "幫我重構 auth 模組、加上 JWT、寫測試、更新文檔、
然後 commit 並 push 到 staging branch"
✅ "幫我重構 auth 模組改用 JWT"
(做完後再說下一步)
一次塞太多任務,Claude 會在某一步出錯,然後後續步驟全部連鎖出問題。
反模式 3:不看結果就繼續
你:幫我加一個新的 API endpoint
Claude:(寫完了)
你:好,幫我加另一個(沒有確認上一個是否正確)
Claude 的每一步都可能有小錯誤。如果你不確認就繼續,錯誤會累積。每一步看一眼結果,早發現早修正。
反模式 4:重複描述 CLAUDE.md 已有的資訊
❌ "這是一個 PHP 7.4 的多租戶系統,用 MySQL 5.7,
每個機構一個資料庫..."(CLAUDE.md 裡已經寫了)
✅ "幫我修 auth.php 的查詢效能"
(Claude 會自己讀 CLAUDE.md 拿到背景資訊)
CLAUDE.md 就是為了讓你不用每次重複說。
📋 速查表
| 情境 | 建議的 prompt 方式 |
|---|---|
| 修 bug | 給檔案路徑 + 行號 + 錯誤訊息 |
| 新功能 | 說清楚目標 + 約束 + 「完成」的定義 |
| 重構 | 先讓 Claude 讀現有程式碼,再列計劃 |
| Code review | 指定角色 + 指定輸出格式 |
| 探索 codebase | 讓 Claude 用 Explore agent 搜尋 |
| 不確定怎麼做 | 先問 Claude 列出方案比較 |
| 大型修改 | 分階段 + 用 Plan Mode |
| 寫文章 | 給素材 + 讓 Claude 讀舊文章學風格 |
🎉 結語
Prompt 工程不是什麼神秘的技術,核心就是一個原則:
給 Claude 足夠的資訊,讓它不需要猜。
具體來說:
- 說清楚你要做什麼(目標)
- 說清楚在哪裡做(位置)
- 說清楚什麼不要做(邊界)
- 讓它先看再做(上下文)
大多數時候,「Claude 的結果不好」不是因為 Claude 不行,而是因為我們的指令留了太多猜測空間。把猜測空間縮小,品質自然就上來了。
📎 相關文章: