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 足夠的資訊,讓它不需要猜。

具體來說:

  1. 說清楚你要做什麼(目標)
  2. 說清楚在哪裡做(位置)
  3. 說清楚什麼不要做(邊界)
  4. 讓它先看再做(上下文)

大多數時候,「Claude 的結果不好」不是因為 Claude 不行,而是因為我們的指令留了太多猜測空間。把猜測空間縮小,品質自然就上來了。


📎 相關文章