4.3.4 寫出好的 prompt
NoteCraftApp 使用文件 第 4 章・使用指南

4.3.4 使用指南

寫出好的 prompt

標記的 prompt 決定 AI 做出什麼。這頁整理好 prompt 的要素,用現有筆記的實例對照 prompt 與成品,並列出常見的寫法問題與重跑方式。

本頁目錄
  1. 好 prompt 的要素
  2. type 只是提示
  3. 實例對照
  4. 給公式、範圍與預設值
  5. 指定切換方式,讓差異現形
  6. 把資料完整列出來
  7. 相關的標記會被合併
  8. 常見問題寫法
  9. 太籠統
  10. 只說「畫張圖」
  11. 資料不給
  12. 一次要太多
  13. 不如預期時

AI 不是把 prompt 照字面畫成圖。visualize-planner 會先讀 prompt 與筆記上下文,找出這段內容想讓讀者記住的一句話,再決定互動方式與技術。prompt 寫得越清楚,它越不用猜。

好 prompt 的要素

要素寫什麼為什麼
核心洞察讀者看完該記住的一句話元件以它為收斂點。沒寫的話,AI 會自己從上下文推一句
張力要對比的兩端:有限 vs 無限、單步 vs 全程、合併 vs 攤開視覺化的重點是放大這個落差
互動讀者要操作什麼:slider、切換按鈕、tab、點節點AI 預設就往互動走,你指定的話它不用自己挑
資料節點、轉移、數值範圍、預設值、公式沒給的數字 AI 會自己編
讀者要比較什麼切換之後該看出哪裡變了決定哪個值用大字、哪一段要強調

幾件事不用寫,生成流程本來就會做:

  • 外框、類型標籤、來源檔名、caption 的位置:由 GeneratedFrame 統一提供
  • 尊重 prefers-reduced-motion、動畫節制在 200–400ms
  • 不用 emoji。prompt 裡寫了 ✅ ❌,成品會改成 lucide-react 圖示

type 只是提示

type 告訴 AI 你大概要哪一類,實際選型由 visualize-planner 依決策樹決定,命中第一條就停:

順序內容做法
1可被「體驗」的對比或走查:兩種情境的差異、隨某個變數推進的變化、要逐步揭露的流程motion + 狀態做成互動元件,底層幾何用手寫 SVG
2流程、時序、狀態機、架構手寫 SVG;步驟有先後時加上逐步播放或點擊推進
3有軸的量化資料recharts;非標準圖表才用 d3
4時間軸、Gantt、階段推進手寫 SVG,能用 slider 推進就做成互動
5欄位多的比較表HTML <table>,不做成 SVG
6複合需求組合上面幾種,不二選一
7自由或含糊挑最能讓讀者體驗概念的形式,同樣優先互動

只有內容本質上是靜態的(純查表、單張結構快照),才會回退成靜態圖。AI 換掉你寫的 type 時,會在對話裡說明。

所以 prompt 的重點放在「要讓讀者體驗什麼」,不必糾結 type 該填哪個。拿不定就寫 free。

實例對照

以下取自現有筆記裡 status: generated 的標記。prompt 有精簡,省略了配色、reduced-motion、emoji 等通用要求,其餘意思不變。

給公式、範圍與預設值

標記 agent-reliability-compound:

MDX
{/* @ai-visualize
id: agent-reliability-compound
type: motion
prompt: |
  做一個可互動的「Agent 可靠度複利崩塌」示範。核心洞察是「換更強的模型不會修好網路逾時,
  只有 checkpoint 與 resume 可以」——要讓讀者親手拖出「單步看起來很高、全程其實很低」的張力。

  兩個 slider:
  - 步驟數(tool call 次數,1–20,預設 10)
  - 每步成功率(50%–99%,預設 85%)

  即時計算並用大字強調整體成功率 = 每步成功率 ^ 步驟數(預設 0.85^10 ≈ 20%)。
  視覺化用一條由多個小方塊組成的「步驟鏈」:每個方塊代表一步,鏈越長,末端「全程走完」的機率條越短;
  整體成功率低於某門檻(例如 50%)時機率條轉為警示色。
  可並排放「單步 85%」與「全程約 20%」兩個數字,凸顯落差。
status: generated
*/}

成品:上方三個數字並排(單步成功率、步驟數、全程走完),下方是步驟鏈,每格的深淺是走到這一步還沒失敗的機率,再下面是全程機率條和兩個 slider。全程低於 50% 轉成警示色、更低轉成危險色,底部的說明句隨數字更新,最後落在「只有 checkpoint 與 resume 可以」。

生成元件:上方三格數字「單步成功率 85%」「步驟數 10」「全程走完 20%」,下方是十格由深到淺的步驟鏈、紅色的全程機率條、兩個 slider,以及一句警示說明
agent-reliability-compound 的成品(預設值):單步 85%、10 步,全程只剩 20%,機率條轉成警示色。

為什麼有效:

  • 洞察和張力都寫成一句話,元件直接拿來當結論
  • slider 的範圍、預設值、公式都給了,AI 不用編數字
  • 「並排兩個數字凸顯落差」說清楚讀者要比較什麼

指定切換方式,讓差異現形

標記 time-fields-bottleneck:

MDX
{/* @ai-visualize
id: time-fields-bottleneck
type: free
prompt: |
  做一個可互動的「時間欄位 vs 瓶頸定位」對比走查,讓讀者親身體會:
  為什麼要記這麼多時間欄位——欄位愈細,愈能指出瓶頸具體卡在哪一段。

  核心洞察:同樣的「總耗時」,只記錄上線時間(合併視角)只能看到「慢」,
  卻看不出時間花在哪;把時間欄位攤開成四段後,瓶頸那一段會立刻凸顯出來。

  互動設計:
  - 一條任務生命週期時間軸:建立 → 開始 → 完成 → 驗收 → 上線,中間形成四個耗時區間
  - 「視角切換」:合併視角只顯示一條灰色長條 + 總耗時;攤開視角把同樣的長度切成四段,
    最長(瓶頸)那段以紅色強調、標上「瓶頸」徽章
  - 「情境切換」(總耗時相近但瓶頸不同):前置壅塞、估時失準、驗收塞車、上線延宕
  - 「估時失準」情境在『開始→完成』段內畫出「預計」基準線,對照實際超出多少
  - 下方診斷卡:瓶頸段名稱 + 一行對應問題(取自內文表格)
status: generated
*/}

成品:兩組按鈕,一組切四種情境、一組切合併與攤開視角。合併時只有一條長條和「總耗時」,攤開後長條分裂成四段,最長的一段變紅並帶「瓶頸」徽章;「估時失準」情境多一條「預計 N 天」的虛線。底部一句收斂:同樣的天數,合併只看到「慢」,攤開才指得出卡在哪一段。

生成元件:上排四個情境按鈕選在「前置壅塞」,下排選在「攤開視角」;時間軸分成四段,第一段「建立 → 開始」8 天變紅並帶瓶頸徽章,下方診斷卡寫著排隊太久的原因
time-fields-bottleneck 切到「攤開視角」:14 天分成四段,最長的「建立 → 開始」變紅並帶「瓶頸」徽章。

為什麼有效:

  • 用兩個視角把張力具體化:同一份資料,看得到與看不到的差別
  • 情境清單讓讀者看到「瓶頸會移動」,不是只有一個例子
  • 指定診斷卡的文字「取自內文表格」,元件和筆記說的是同一件事

這個 prompt 沒給各段天數,成品裡的天數是 AI 自己配的,只保證總長相近、瓶頸段最長。數字本身重要的話,要寫進 prompt。

把資料完整列出來

標記 order-state-machine:

MDX
{/* @ai-visualize
id: order-state-machine
type: diagram
prompt: |
  繪製電商訂單的狀態機圖(手寫 SVG,狀態節點 + 有向箭頭)。
  狀態節點:待付款、已付款、已出貨、已完成、已取消、已退款。
  轉移(箭頭上標註觸發事件):
    - 待付款 --完成付款--> 已付款
    - 待付款 --逾時/買家取消--> 已取消
    - 已付款 --出貨--> 已出貨
    - 已付款 --買家取消--> 已退款
    - 已出貨 --簽收/鑑賞期結束--> 已完成
    - 已出貨 --退貨--> 已退款
  視覺要求:
    - 三個終態(已完成、已取消、已退款)用不同樣式標示為終態
    - 待付款為起始狀態,加一個進入箭頭
    - 箭頭清楚標註事件名稱,避免線條交叉
status: generated
*/}

成品:六個節點、六條轉移和事件名稱都和 prompt 一字不差。prompt 沒要求互動,AI 仍依「互動優先」加上點擊:點一個狀態,只留下它和它能直接轉移到的狀態,其餘淡化;點空白處重置。

生成元件:電商訂單狀態機,待付款為起始狀態,經已付款、已出貨到已完成,另有已取消與已退款兩個終態,箭頭上標註觸發事件,下方是圖例
order-state-machine 的成品:六個狀態、六條轉移與事件名稱照 prompt 畫出,三個終態各用不同的雙圈樣式。

為什麼有效:

  • 狀態和轉移用 A --事件--> B 一條一行列出,AI 不需要從內文推敲,也不會漏掉或多畫
  • 起始狀態、終態的樣式要求明確,讀者一眼分得出哪裡是終點
  • type: diagram 只是提示:AI 照樣用手寫 SVG,但多加了一層能「試走」轉移的互動

相關的標記會被合併

筆記裡兩個相鄰的標記,hook-lifecycle-events 和 why-stop-event:

MDX
{/* @ai-visualize
id: hook-lifecycle-events
type: diagram
prompt: |
  手寫 SVG 畫一條 Claude Code session 生命週期橫線,由左到右標出 7 個 hook 事件節點:
  SessionStart → UserPromptSubmit → PreToolUse → PostToolUse → Notification → Stop → SubagentStop。
  Stop 節點放大、加星星標記與「使用中」徽章,其餘節點灰階。
  純靜態 SVG,無需互動。
status: generated
*/}

{/* @ai-visualize
id: why-stop-event
type: diagram
prompt: |
  三張並排卡片,每張上方一個 icon、中間粗體標題、下方一句說明:
  1. 「一次性檢查」— 不像 PostToolUse 每改檔就觸發
  2. 「避免無限迴圈」— 不會因為改 PRD 又觸發自己
  3. 「時機自然」— Claude 講完話的瞬間,使用者剛好看到提醒
merged-into: hook-lifecycle-events
status: generated
*/}

成品:一個元件。上方是七個事件節點的生命週期線,Stop 放大並有光暈;每個節點都能點,點 Stop 時下方顯示「為什麼用 Stop」的三張卡,點其他節點顯示該事件何時觸發。why-stop-event 被併入,只留標記、沒有自己的元件。

生成元件:上方一條生命週期線列出七個 hook 事件,Stop 節點放大並帶標記;下方三張卡片:一次性檢查、避免無限迴圈、時機自然
hook-lifecycle-events 的成品:兩個標記合併成一個元件,上半是第一個標記的生命週期線,下半是第二個標記的三張卡。

這組說明了什麼:

  • 兩個 prompt 都只描述版面,沒寫洞察,但內容是同一件事:「為什麼選 Stop」就是在解釋「生命週期上的 Stop」
  • 合併後,第一個 prompt 寫的「純靜態、無需互動」被換掉了,因為點節點才能把兩段內容接起來
  • 你想要的若真的是兩張分開的靜態圖,要在 prompt 裡說明理由,或在 AI 提議合併時回絕。合併的標記長什麼樣見 @ai-visualize 標記欄位

常見問題寫法

以下的「改寫前」是依原則寫的示範,不是取自現有筆記。

太籠統

改寫前(示範):做一個關於快取的互動圖表。

AI 不知道你要讀者記住什麼,只能從上下文猜。改成先寫洞察與張力:

改寫後(示範):核心洞察是「TTL 設越長,命中率越高,但讀到舊資料的時間也越長」。做一個 TTL slider(1 秒~1 小時,預設 60 秒),即時顯示命中率與「最久會讀到多舊的資料」兩個數字並排,讓讀者拖出兩者的拉扯。

只說「畫張圖」

「畫一張流程圖」「做成表格」只描述形式。形式 AI 會自己選,它需要的是內容:有哪些步驟、哪一步是重點、讀者看完該懂什麼。要指定形式時,同時寫理由,例如「純查表、不需要互動」。

資料不給

數字、節點、轉移沒寫,AI 會自己配一組合理的值。對示意用途可能沒問題,但:

  • 需要準確的數字,就把數值、範圍、公式寫進 prompt,或指明「取自上方表格」
  • 數字本來就只是示意,請 AI 在元件上標明。embedding-dimension-tradeoff 的 prompt 寫了「明確標註非實測基準、僅供直覺」,成品的相對品質與速度就以示意係數計算,caption 也註明「非實測基準」

一次要太多

一個 prompt 塞進三個概念、五種互動,成品容易變成擠在一起的控制面板。拆成幾個標記,各自放在對應的段落旁邊。

反過來,幾個標記其實是同一組對比的不同切面時,AI 可能提議用 tab 或 stepper 合併成一個元件,並在對話裡說明合併了哪些;它也可能建議把過載的標記拆開。不確定時它會先問你。

不如預期時

先判斷是哪裡不對,再改 prompt:

成品的問題改 prompt 的方向
重點錯了補一句核心洞察
互動方式不對指定要操作什麼、操作後讀者該看到什麼變化
數字或節點不對把資料逐條寫進 prompt
太擠、太多拆成兩個標記
被合併了但你要分開在 prompt 說明為何要獨立,重跑時告訴 AI 不要合併

改完 prompt 後,在 Claude Code 對話裡指名重做,例如「重新生成 time-fields-bottleneck」。generated 的標記會覆寫原元件;failed 的標記要改過 prompt 再明確要求;locked 的要先自己改掉狀態。各狀態的做法見狀態與重新生成。

在 GitHub 上修改這一頁