綠帶 · Vibe Coding 素養
第 10 章

Prompt 是規格書 —
把需求說人話說清楚

這章結束你會把模糊願望改寫成 AI 能照著做、你也能驗收的規格級 prompt。

開場 · prompt 不是許願池

你跟 AI 說「幫我做一個網站」,很像走進餐廳只說「給我好吃的」。服務生也許會端出牛排,也許會端出甜點,不能說他完全錯,但多半不是你要的。提示詞(prompt)不是許願池,而是交給 AI 實習生的工作單。工作單越清楚,實習生越少猜;你越知道怎麼驗收,就越不會被漂亮但不能用的成品騙過。這章要練的不是話術,而是把腦中的畫面翻成可執行、可檢查、可修改的需求。

爛 prompt 不是短,是沒有方向

很多新手以為 prompt 寫不好,是因為自己不會講專業術語。其實最常見的問題不是不專業,而是沒有方向。你說「幫我做一個網站」,AI 會知道主題嗎?知道誰要用嗎?知道要放哪些內容嗎?知道手機版重要還是桌機版重要嗎?都不知道。它只能用自己的平均經驗補洞,產出一個看起來像網站、但不一定解決你的問題的東西。

這就像 ch01 學過的食譜。你不能只對廚房說「做晚餐」,然後期待每次都剛好做出你想吃的番茄炒蛋、兩人份、不要蔥、十分鐘內完成。程式是食譜,prompt 則是你交給 AI 這位實習生的點菜單。點菜單沒有寫清楚,實習生不是壞,是他被迫猜。

爛 prompt 的典型長相,是只有動詞和一個大名詞:「做網站」、「寫文案」、「幫我整理」、「做一個小工具」。這些句子可以開始對話,但不適合直接拿來要求成品。因為它沒有說使用者是誰,沒有說資料從哪裡來,沒有說產物長什麼樣,也沒有說什麼情況算完成。你拿到的結果如果不對,很難指出問題;AI 也很難知道下一版該修哪裡。

所以這章先把一件事定清楚:好 prompt 不是把話寫得華麗,而是把工作邊界說得可執行。你不需要像工程師一樣背框架名稱,但你要像餐廳老闆一樣說清楚菜名、份量、禁忌、出餐標準。當你能把需求說到這個程度,AI 才有機會從「隨便猜」變成「照單施工」。

用清單檢查一個模糊 prompt 少了哪些資訊。
const vaguePrompt = {
  request: "幫我做一個網站"
};

const missingPieces = ["主題", "使用者", "內容", "完成標準"];

console.log("這個 prompt 缺少:");
missingPieces.forEach((piece, index) => {
  console.log(`${index + 1}. ${piece}`);
});

規格四件套:目標、輸入、輸出、驗收

規格(specification)聽起來很硬,但你可以把它想成一張清楚的工作單。最基本的規格級 prompt 有四件套:目標、輸入(input)、輸出(output)、驗收條件(acceptance criteria)。目標是「要做什麼」;輸入是「你會給它什麼資料」;輸出是「你要它交回什麼形狀」;驗收條件是「什麼情況算對」。四件套湊齊,AI 就不必靠通靈補空白。

以小費計算機為例,許願型 prompt 是「幫我做小費計算機」。規格型 prompt 會變成:「請做一個瀏覽器可用的小費計算機。輸入帳單金額、小費百分比、人數。輸出小費金額、總金額、每人應付金額。驗收條件:帳單 1000、小費 10%、2 人時,顯示小費 100、總金額 1100、每人 550;人數為 0 時不能計算,要顯示錯誤訊息。」你看,這段沒有高深語法,但它把任務變成可以檢查的形狀。

目標要避免太抽象。「做得好看」不是不能寫,但要補成可觀察的描述,例如「欄位排成一欄,手機上不用左右滑動,主要按鈕文字是『計算』」。輸入要列出資料型別,像 ch02 學過的數字、文字、真假、清單。輸出要說格式,不然 AI 可能給你一段文字、表格、JSON、網頁,全部都算它自認合理。驗收條件要有具體例子,最好包含一組你心算得出來的數字,這樣你不用相信 AI,自己也能判斷。

規格四件套最有價值的地方,是它讓你和 AI 對「完成」有共同語言。沒有驗收條件時,你只能說「怪怪的」。有驗收條件時,你可以說「1000、10%、2 人這組算錯,預期每人 550,現在顯示 500」。後者才是 AI 能修的回饋。

把一段需求拆成規格四件套。
const spec = {
  goal: "做小費計算機",
  input: ["帳單金額", "小費百分比", "分帳人數"],
  output: ["小費金額", "總金額", "每人金額"],
  acceptance: "1000 元、10%、2 人 => 小費 100、總金額 1100、每人 550"
};

console.log("目標:", spec.goal);
console.log("輸入數量:", spec.input.length);
console.log("輸出數量:", spec.output.length);
console.log("驗收:", spec.acceptance);

邊界情況:先想到先贏

邊界情況(edge case)是那些不常發生、但一發生就會讓成品露出破綻的情境。生日是 2 月 29 日怎麼辦?分帳人數是 0 怎麼辦?使用者沒有輸入名字怎麼辦?金額輸入負數怎麼辦?這些不是故意刁難,而是真實世界會出現的邊角。AI 很會做「快樂路徑」:使用者乖乖輸入正常資料,流程一路順利。但產品通常壞在不快樂的那條路。

你可以把邊界情況想成餐廳點菜時的禁忌和特殊需求。一般點餐說「一份炒飯」當然可以,但如果客人花生過敏、不要蛋、要外帶,這些條件晚講就容易出事。對 AI 也是一樣。你越早把特殊情況寫進 prompt,AI 越有機會一開始就把保護欄做進去,而不是等成品壞了才補洞。

找邊界情況有一個很實用的問法:什麼資料可能是空的、零、負數、超大、重複、格式不對?這六個詞可以套在大部分小工具上。做報名表,名字可能是空的,電話格式可能不對。做庫存表,數量可能是負數。做小費計算機,人數可能是 0,帳單可能是空白,小費百分比可能被輸入成文字。你不必一次想完世界上所有怪情況,但至少要抓住會讓結果明顯錯誤的幾個。

邊界情況也會讓驗收條件更強。只測正常情況,AI 可能看起來很厲害;加上邊界情況,才知道它有沒有真的處理需求。這會在 ch12 的驗證心態繼續放大,但從寫 prompt 的當下就開始想,成本最低。因為一開始就說清楚,通常比事後請 AI 拆掉重做便宜。

把邊界情況轉成可以檢查的規則。
function validateTipInput(bill, tipPercent, people) {
  if (bill <= 0) return "帳單金額必須大於 0";
  if (tipPercent < 0) return "小費百分比不能是負數";
  if (people < 1) return "分帳人數至少要 1 人";
  return "可以計算";
}

console.log(validateTipInput(1000, 10, 2));
console.log(validateTipInput(1000, 10, 0));
console.log(validateTipInput(-50, 10, 2));

迭代不是失敗,是工作流程

迭代(iteration)就是一版一版修。很多人第一次拿到 AI 的 60 分成品,就覺得「AI 不行」或「我不會用」。更好的做法是把第一版當草稿,對照規格指出具體差距。你不是在跟 AI 吵架,你是在帶一位實習生改稿。第一版能跑出形狀,第二版修錯誤,第三版補邊界,這才是正常工作流程。

有效的迭代回饋有三個特徵:指出位置、說明問題、給出期待。不要只說「不好看」、「怪怪的」、「再優化」。這些話對人都不一定清楚,對 AI 更容易變成亂改。你可以說:「計算結果區目前只顯示總金額,請依序顯示小費金額、總金額、每人金額。用 1000、10%、2 人驗收,預期是 100、1100、550。」這種回饋很像在食譜旁邊寫修正:鹽少一匙、火轉小、煮 3 分鐘,不是籠統說「變好吃」。

迭代也不是每次都要重下完整 prompt。當上下文還在同一段對話裡,你可以引用前一版,針對差距補規格。但如果 AI 已經改亂,或對話太長開始忘東忘西,就要把最新規格重新整理成一段乾淨 prompt。這時你做的不是重來,而是把前面學到的需求整理成新版工作單。

一個成熟的 vibe coding 使用者,會把「第一版不完美」視為預期內。差別在於他知道怎麼把不完美翻譯成可修的指令。純 vibe coder 常常連續丟十句「再好一點」,結果越改越偏;規格型使用者會用驗收條件把方向拉回來。這就是本章的核心能力。

把模糊回饋拆成 AI 能修的三段話。
const feedback = {
  location: "計算結果區",
  problem: "只顯示總金額,沒有顯示小費與每人金額",
  expected: "顯示小費 100、總金額 1100、每人 550"
};

console.log(`位置:${feedback.location}`);
console.log(`問題:${feedback.problem}`);
console.log(`期待:${feedback.expected}`);

Context:不要讓 AI 通靈

情境(context)是 AI 做判斷時需要的背景資料。你請同事修一台咖啡機,不會只說「壞了」,你會說哪個按鈕按了沒反應、剛剛有沒有漏水、機型是什麼、錯誤燈號怎麼閃。請 AI 寫 code 也一樣。貼錯誤訊息全文、貼現有 code、說明你在哪裡執行、說明你剛剛改過什麼,這些都會大幅提高它修對的機率。

新手常犯的錯,是把最重要的線索省略掉。比如只說「不能跑」,但沒有貼 console 的紅字。只說「版面跑掉」,但沒有說是在手機寬度還是桌機寬度。只說「幫我接到原本專案」,但沒有貼原本檔案的結構。AI 不是坐在你的螢幕前,它看到什麼,取決於你提供什麼。沒有 context,它只能猜;猜中了是運氣,猜錯是正常。好的背景資料會讓它少走岔路,也讓你比較容易判斷它的回答有沒有對準問題。

提供 context 也要有界線。不要把金鑰、密碼、私人資料貼進去;不要貼你看不懂的刪除指令請它直接執行。金錢和資安相關的例子,本課只教防守常識:保護秘密、看懂再跑、先小範圍測試。你給 AI 的資料要足夠完成任務,但不該包含不必要的敏感資訊。

一個好用的 prompt 結尾是:「如果資訊不足,先問我最多三個問題,不要直接猜。」這句話會把 AI 從愛猜的實習生,拉回會確認需求的工作夥伴。你也可以要求它先列計畫、先列驗收案例、先指出風險,再開始產出。這些做法都不是讓流程變慢,而是避免後面重工。規格級 prompt 的本質,就是把該說的話提前說。

示範回報錯誤時要附上的 context。
const bugReport = {
  symptom: "按下計算沒有結果",
  errorMessage: "TypeError: Cannot read properties of null",
  environment: "Chrome 瀏覽器 console",
  recentChange: "把結果區的 id 從 result 改成 totalResult"
};

console.log("給 AI 的除錯 context:");
Object.entries(bugReport).forEach(([key, value]) => {
  console.log(`${key}: ${value}`);
});
招牌互動 · prompt-lab

Prompt 規格實驗室

關 1 · 對比 關 2 · 組裝

先用每張卡的「正常值」和「people=0」按鈕測三個預錄成品,再選出最可靠的一個;接著把讀書計畫需求拆成目標、輸入、輸出、驗收。

固定需求

做一個小費計算機,使用者輸入帳單金額、小費百分比、分帳人數,得到小費金額、總金額、每人金額。

A · 許願型 prompt

幫我做一個小費計算機。

按正常值或邊界值開始測。
正常值未測邊界值未測
B · 普通型 prompt

做一個小費計算機,可以輸入帳單、小費百分比和人數,按下後顯示每人多少錢。

按正常值或邊界值開始測。
正常值未測邊界值未測
C · 規格型 prompt

請做瀏覽器小費計算機。輸入:帳單金額、0 以上小費百分比、1 以上整數人數。輸出:小費金額、總金額、每人金額,金額四捨五入到小數點後 2 位。驗收:1000/10/2 => 100、1100、550;人數 0 顯示「分帳人數至少要 1 人」;帳單空白顯示「請輸入帳單金額」。

按正常值或邊界值開始測。
正常值未測邊界值未測

哪個最可靠?

請先把三張卡的正常值與 people=0 都測過。

新需求

做一個讀書計畫產生器,輸入考試日期、每天可讀分鐘、章節清單,輸出每日讀書安排。

0 先填四件套,系統會即時指出缺哪一項。
目標:需要「讀書計畫」或「每日安排」。
輸入:需要「考試日期」「每天可讀分鐘」「章節」。
輸出:需要「日期」與「章節」。
驗收:需要一組具體例子。
邊界:需要沒有章節、日期已過或分鐘為 0。
你的規格級 prompt 會在這裡組裝出來。
✓ prompt-lab 完成 你已經能把模糊願望拆成可執行、可驗收的工作單。+30 XP 入袋。

規格力會改變你的操作順序:你會先寫目標、輸入、輸出、驗收,再叫 AI 動手。你會把邊界情況放進 prompt,而不是等使用者踩雷。你會用具體數字驗收 AI 的成品,不只看它有沒有生成畫面。純 vibe coder 在跟 AI 許願;你是在交付一張可檢查的工作單。

隨堂測驗 · 5 題

檢查一下這章

下一章預告

下一章會練習讀懂 AI 寫出的 code:不用自己發明菜,也要看得懂食譜在做什麼。