Prompt 設計與 Instructions——讓 AI 聽懂你的話

一句話總結:Prompt engineering 不是神秘的技能。它就是「清楚地表達你的需求」。如果你能寫出清楚的技術 spec,你就能寫出好的 prompt。

結論先講:給 context 不只給指令。迭代式 prompting 比一次性超長 prompt 更有效。重複的 prompt 要模板化。Instructions 檔案要跟 code 一起版本控制。

原則一:給 Context,不要只給指令

## 差的 prompt
「寫一個 React component 顯示用戶列表」
 
## 好的 prompt
「在我們的 Next.js 14 專案中(App Router),
寫一個 Server Component 顯示用戶列表。
用 Tailwind CSS + shadcn/ui。
資料來源是 Prisma ORM 的 User model。
需要分頁(每頁 20 筆)和按 name 搜尋。
現有類似元件可以參考 src/components/ProductList.tsx」

第二個 prompt 提供了技術棧(Next.js 14, App Router, Server Component)、設計規範(Tailwind, shadcn/ui)、資料來源(Prisma User model)、功能需求(分頁、搜尋)、參考範本(ProductList)。AI 拿到這些才能給你有用的東西。

原則二:說「我們在做什麼」而不是「你是什麼」

很多 prompt guide 建議「tell the AI its role」——「你是一個資深 React 開發者」。有用但不是最好的方式。

## 一般的做法
「你是資深前端工程師,幫我 review 這段 code」
 
## 更好的做法
「我們在重構 legacy jQuery 前端到 React 18。
目前處理表單驗證的遷移。
以下是原本的 jQuery 驗證邏輯和新的 React 版本。
比較兩者,確認新版沒遺漏任何驗證規則,
並指出改進方向。」

為什麼第二種更好?它給了 AI 足夠 context 去理解「什麼算好」。光說「你是資深工程師」,AI 不知道你的 context 是 startup 快速迭代還是銀行嚴謹規範。

原則三:迭代式 Prompting

不要嘗試一次 prompt 就得到完美結果。正確的方式是迭代:

第一輪:「我想在 API gateway 加 request validation middleware」——看 AI 的理解對不對。

第二輪:「方向對了,但我們用 Fastify 不是 Express。validation schema 從 OpenAPI spec 自動生成」——修正方向。

第三輪:「validation 失敗回傳 RFC 7807 Problem Details 格式。schema 要支援 custom format validator」——細化需求。

第四輪:「把 validation 邏輯抽成獨立模組,加單元測試。測試覆蓋這些邊界條件:[列出]」——請求改進。

每輪都在根據 AI 產出調整方向。比一次性寫超長 prompt 更有效,因為你可以及時修正偏差。

原則四:Prompt 模板化

反覆寫類似的 prompt?模板化:

## Code Review Prompt Template
我需要你 review 以下 code:
- **語言/框架:** [填入]
- **功能描述:** [填入]
- **重點關注:** [效能 / 安全 / 可讀性 / 正確性]
- **Context:** [相關業務邏輯或限制]
 
請從以下角度 review:
1. 邏輯正確性(邊界條件)
2. 安全性(注入、未授權存取)
3. 效能(N+1, 不必要計算, memory leak)
4. 可維護性(命名、複雜度)
5. 測試建議
 
[貼上 code]

存在筆記系統裡,需要時直接套用。

Instructions / Skills:讓 AI 自動遵守規範

現代 AI coding 工具支援 instructions 機制——預定義的指令集,讓 AI 在每次對話中自動遵循。

# CLAUDE.md 範例
 
## 專案資訊
- Next.js 14,App Router
- TypeScript (strict mode)
- pnpm / Vitest + Testing Library / Tailwind + shadcn/ui
 
## Coding Standards
- functional components,不用 class
- named export,不用 default export
- Result pattern 做錯誤處理(不用 try-catch 當流程控制)
- API 回應用 standardized format(見 src/lib/api-response.ts)
 
## 禁止事項
- 不用 any type
- 不用 console.log(用 src/lib/logger.ts)
- 不直接存取 process.env(用 src/config/env.ts)
- 不用 relative import(用 @/ alias)
 
## 測試要求
- 每個功能都要有測試
- 最少覆蓋:happy path、error path、邊界條件
- Mock 只 mock 外部相依

怎麼寫有效的 Instructions

好的 instruction 特徵:

  • 具體不抽象: 「使用 camelCase」而非「使用合適的命名」
  • 有範例: 正確和錯誤的例子都給
  • 可驗證: AI 和 reviewer 都能檢查
  • 有理由: 解釋為什麼(AI 理解 why 後更容易正確遵循)
## 差的 instruction
「寫好的 code」
 
## 好的 instruction
「所有 async function 必須有 error handling。
使用 Result<T, E> pattern。
 
正確:
const result = await getUserById(id);
if (result.isErr()) return ApiResponse.error(result.error);
 
錯誤:
try { const user = await getUserById(id); } catch (e) { ... }
 
原因:Result pattern 讓錯誤處理 type-safe,
compiler 強制你處理所有錯誤路徑。」

Instructions 的版本控制

Instructions 跟 code 一起版本控制:

project-root/
├── CLAUDE.md           # AI 行為規範
├── .cursorrules        # Cursor 專用
├── prompts/            # 可重用的 prompt 模板
│   ├── code-review.md
│   ├── bug-fix.md
│   └── new-feature.md
└── ...

好處:團隊共享同一套標準、變更有 history、新人加入自動套用、可以在 PR 中 review instruction 的變更。

這篇的重點回顧

Prompt 設計四原則:給 context、說場景不說角色、迭代式 prompting、模板化。Instructions 是 AI 的行為規範檔案——具體、有範例、可驗證、有理由。Instructions 跟 code 一起版本控制,團隊共享。

系列文章:

「好的 prompt 跟好的技術 spec 一樣——看起來不花俏,但什麼該有的都有。」