跳到主要內容

別讓大腦去搬貨:談 Claude Skills + n8n 的『三明治架構』實戰筆記

最近在看 Anthropic 剛推的 Claude Skills,官方文件把這東西定義成「AI 的職前訓練手冊」。

根據 Anthropic 官方定義與技術文件,所謂的「Claude Skill」(正式名稱通常稱為 Agent Skills)是一個非常獨特且強大的功能模組。

關於 Claude Skills 的官方技術文件,看完後確實很有意思。 特別是它提到的核心概念:「漸進式揭露 (Progressive Disclosure)」

簡單說,以前我們寫 Agent,是把所有規則一次塞給它;但 Claude Skills 是讓它像人類員工一樣,平常只知道自己「有這個技能」,等到真的要寫信、分析報表時,才去打開那個 SKILL.md 檔案讀 SOP。

這在邏輯上非常合理,把 Token 省下來,準度也提高。但當我試著把官方範例那個 professional-email-writer 真正放進商業流程跑過後,發現這中間有些「理論與實戰」的摩擦點


一、 Claude Skills 有什麼特別之處?

與一般 LLM 的「Tool Use (Function Calling)」不同,Claude Skills 的設計核心在於「漸進式揭露 (Progressive Disclosure)」「情境注入」

  1. 漸進式揭露 (Progressive Disclosure) - 最核心的差異

    • 一般做法: 通常我們會把所有規則寫在一個超長的 System Prompt 裡,這會佔用 token 且讓模型分心。

    • Claude Skills: 技能以資料夾形式存在。Claude 平時只知道「我有這個技能的名稱與簡介」。只有當你要求它執行相關任務時,它才會「打開」這個資料夾,讀取裡面的 SKILL.md (詳細指令) 與相關檔案。這極大地節省了上下文空間,並提高了執行精準度。

  2. 檔案系統導向 (Filesystem-based)

    • 一個 Skill 就是一個資料夾。裡面可以包含說明書 (SKILL.md)、範本 (templates/)、甚至可執行的程式碼 (scripts/)。Claude 可以像人類員工一樣,去翻閱這個資料夾裡的參考資料或執行裡面的腳本。
  3. 模組化與可攜性

    • 你可以把「撰寫 Code Review 的標準」、「公司品牌設計規範」或「財務報表分析流程」打包成不同的 Skills。只要把資料夾分享給同事(或放入專案中),每個人的 Claude 就都學會了這套標準。

二、 如何使用 (Usage)

Claude Skills 目前主要應用於 Claude Code (CLI 工具) 以及透過 API 構建的 Agent 系統中。

1. 建立技能的結構

一個標準的 Skill 是一個資料夾,結構如下:

Plaintext

my-skill-folder/ <-- 技能根目錄
├── SKILL.md <-- 核心檔案 (必備)
├── scripts/ <-- (選用) 輔助腳本,如 Python/Bash
│ └── analyze_data.py
└── templates/ <-- (選用) 輸出範本
└── report_format.md

2. 撰寫 SKILL.md (官方範例格式)

這是 Skill 的靈魂。它必須包含 YAML Frontmatter (標頭資訊) 與 Markdown 本文 (指令)。

範例:一個「專業電子郵件撰寫」技能

Markdown

---
name: professional-email-writer
description: 當使用者需要撰寫正式、婉轉且符合商務禮儀的電子郵件時使用此技能。適用於回應客戶投訴、商務提案或跨部門溝通。
---

# Professional Email Writer Instructions

你現在是一位資深的商務溝通專家。當使用者請求撰寫 Email 時,請嚴格遵守以下流程:

## 1. 分析階段
在撰寫任何內容之前,先確認:
- **對象 (Audience)**: 收件人的職位與關係。
- **目的 (Goal)**: 希望達成的具體結果(例如:安撫情緒、獲得批准)。
- **語氣 (Tone)**: 堅定但有禮、或是道歉且誠懇。

## 2. 撰寫規則
- 使用 "BLUF" (Bottom Line Up Front) 原則:第一段即說明來意。
- 避免使用被動語態,除非是為了不指責對方。
- 結尾必須包含明確的 Call to Action (CTA)。

## 3. 範本使用
若使用者未指定格式,請參考以下結構:
> [稱呼]
> 
> [核心訊息摘要]
> 
> [詳細背景或理由]
> 
> [後續步驟/請求]
> 
> [結尾敬語]

## 4. 自我檢查 (必須執行)
輸出草稿前,請檢查:
- 是否有過度承諾?
- 是否有情緒化用語?

3. 如何啟用與呼叫

在 Claude Code (CLI) 中:

  1. 將上述資料夾放在專案的 .claude/skills/ 目錄下,或是全域目錄 ~/.claude/skills/

  2. 直接對話:你不需要輸入特殊指令,只要在對話中提到相關需求,Claude 就會自動偵測並載入該技能。

User: "我需要寫一封信給客戶解釋為什麼專案會延期,對方是重要的大客戶,語氣要誠懇但不能示弱。"

Claude (系統內部):

  1. 偵測到意圖匹配 professional-email-writer 的 description。

  2. 動態載入 SKILL.md 的內容。

  3. 依照 Instruction 執行分析與撰寫。

在 API 開發中:

開發者需使用 Anthropic 的 Tools API 或 MCP (Model Context Protocol) 來實作。你需要將 SKILL.md 的內容在適當的時機注入到 System Prompt 或作為 Tool Definition 提供給模型。

應用模式策略:

大腦僅輸出「結構化意圖」,而非執行

這是最穩健的做法。Claude Skills (大腦) 絕對不直接呼叫外部世界,也不直接寫死「我已經幫您退款了」這種文字。

  • Skill 的職責: 分析用戶需求,輸出一個 JSON 物件(或 XML),而非最終回覆的 Email。

  • Workflow (n8n) 的職責: 接收 JSON -> 驗證業務邏輯 -> 執行 API -> 將結果回傳給 Claude -> Claude 根據結果生成最終 Email。

流程範例:

  1. Skill (思考):讀取客訴,判斷需要退款。

    • Output: {"intent": "refund_request", "amount": 100, "reason": "delay", "draft_tone": "apologetic"}
  2. n8n (手腳)

    • 檢查資料庫:該用戶是否符合退款資格?

    • Case A (符合): 呼叫 Stripe API 退款。回傳 {"status": "success", "transaction_id": "tx_123"} 給 Claude。

    • Case B (不符): 回傳 {"status": "denied", "reason": "policy_limit"} 給 Claude。

  3. Skill (生成):根據 n8n 回傳的狀態,生成最終信件。

    • Case A 信件: 「...我們已為您辦理退款 (單號 tx_123)...」

    • Case B 信件: 「...雖然我們無法直接退款,但我們能提供...」

優點: 解決了「過度承諾」問題,因為 Agent 是在「執行結果確認後」才寫信的。

將 Skills 定義為「唯讀 (Read-Only)」與「規劃 (Planning)」

將 Skill 的權限嚴格限制在「資訊獲取」「策略建議」

  • Skill (Role: 參謀長)

    • 可以讀取:SKILL.md 中包含產品規格、歷史案例、FAQ。

    • 產出物:一份「行動建議書 (Action Plan)」。

  • n8n (Role: 執行官)

    • 這是一個「Human-in-the-loop」的環節。

    • n8n 將 Claude 擬好的草稿與建議操作(例如:退款 $50)發送到 Slack/Teams 給人類員工。

    • 人類點擊「Approve」按鈕後,n8n 才真正去打 API 並寄出信件。

優點: 解決了「黑盒效應」與「信任度」問題。在擴張期,讓非技術人員(如客服主管)作為最後把關者。

沙盒模擬 (The Dry-Run Pattern)

如果您希望全自動化,可以在 n8n 中設計一個「預檢 (Pre-flight check)」機制。

  • Skill 設定:SKILL.md 中明確定義:「在承諾任何補償前,必須先呼叫 check_compensation_limit 工具」。

  • 運作邏輯:

    • Agent 想要賠償 -> 觸發 check_compensation_limit

    • n8n 攔截請求 -> 檢查當日賠償額度 -> 回傳 true/false

    • Agent 收到 true -> 寫入信件並標記 execute_refund


總結建議

回到您最初的觀察,「現階段最穩的打法,是把 Claude Skills 嚴格限縮在『內容生成與策略建議』」 —— 這句話完全正確,但我們可以再往前推一步:

把 Claude Skills 當作「業務邏輯的編譯器 (Compiler)」與「最後一哩路的文案潤飾師」,而把「狀態管理 (State Management)」與「副作用 (Side Effects)」完全交給 n8n。

範例:高語意理解型 (適合 Claude Skill)

場景: 「公關危機處理與社群回覆」 情境: 當有人在粉專留言抱怨產品(非結構化文字),你需要判斷情緒強烈度,並擬定回應。這件事很難寫成 if-else 腳本,因為語言太微妙了。

檔案結構

social-media-manager/
├── SKILL.md
└── guidelines/
    ├── brand_voice.txt   (品牌語氣:調皮、正經或溫暖)
    └── forbidden_words.txt (公關禁語表)

SKILL.md 內容範例

---
name: crisis-response-specialist
description: 處理社群媒體上的負面評論與客訴,產出安撫性回覆並判斷是否需要升級處理。
---

# Crisis Response Instructions

你現在是 [公司名稱] 的資深公關經理。你的目標是化解公開場合的衝突,將對話引導至私訊 (DM)。

## 1. 情緒分析 (Sentiment Analysis)
讀取用戶留言,並評分 (1-5,5為極度憤怒)。
- 若分數 >= 4:必須標記 `escalate_to_human: true`。
- 若提及 "詐騙", "法律", "提告":必須標記 `legal_risk: true`。

## 2. 回覆撰寫原則 (參考 guidelines/brand_voice.txt)
- **Empathy First**: 第一句話必須同理對方的困擾。
- **No Excuses**: 不要解釋技術原因(客戶不在乎),專注於解決方案。
- **Move Channel**: 對於具體個案,請對方提供訂單號並引導至私訊。

## 3. 輸出格式 (JSON Only)
為了讓後端自動化系統 (n8n) 處理,請**嚴格**輸出以下 JSON,不要包含其他文字:

```json
{
  "sentiment_score": 4,
  "escalate_to_human": true,
  "legal_risk": false,
  "suggested_reply": "Hi @User,非常抱歉讓您有這樣的體驗。我們完全理解您的焦急...",
  "internal_note": "用戶抱怨物流延遲,情緒激動,建議由客服主管手動審核後再發出。"
}

#### 💡 這裡為什麼用 Skill?
因為 n8n 無法精準判斷「酸民」跟「真正受委屈的客戶」語氣上的差別。Skill 這裡扮演的是**「大腦(認知與決策)」**。

---

### 實戰範例二:結構化資料轉換型 (適合 Skill + n8n 混合)
**場景:** **「非結構化收據/發票辨識」**
**情境:** 員工上傳一堆亂七八糟的 PDF 或照片文字檔(OCR 後的結果),你需要把這些變成 ERP 系統能吃的格式。

#### `SKILL.md` 內容範例
```markdown
---
name: invoice-parser
description: 將 OCR 掃描後的雜亂文字轉換為符合會計標準的 JSON 格式。
---

# Invoice Parsing Logic

你是一個會計資料輸入員。接收 OCR 文字,並正規化資料。

## 1. 資料提取規則
- **Vendor**: 找出商家名稱。若名稱類似 "7-ELEVEN" 或 "Seven Eleven",統一輸出 "7-11"。
- **Date**: 將所有日期格式 (2024/01/01, Jan 1st '24) 統一轉換為 `YYYY-MM-DD`。
- **Items**: 忽略 "小計", "折扣" 等行,只抓取具體品項。

## 2. 邏輯檢查
- 檢查 `Total Amount` 是否等於所有 `Items` 價格的總和。
- 若不符,請在 `validation_error` 欄位說明原因。

## 3. 輸出格式
```json
{
  "vendor_normalized": "Starbucks",
  "date": "2024-10-25",
  "items": [
    {"name": "Latte", "price": 150},
    {"name": "Cake", "price": 120}
  ],
  "total": 270,
  "validation_error": null
}

這裡為什麼用 Skill?

Regex (正規表達式) 在處理千奇百怪的格式時非常痛苦。 Claude 可以用「常識」去理解哪一行是店名,哪一行是總金額。


什麼時候用 Skill?什麼時候用 n8n?

這是一個「黃金交叉點」的判斷表,給大家參考:

評估維度 適合用 Claude Skill (AI) 適合用 n8n (Rule-based)
輸入資料 (Input) 非結構化、雜亂
(Email, 客戶對話, OCR 文字, 長篇報告)
結構化、固定
(Webhook JSON, 資料庫欄位, API 回傳值)
處理邏輯 (Logic) 模糊、需要「理解」或「創作」
(摘要, 語氣轉換, 翻譯, 意圖判斷, 提取關鍵字)
明確、布林邏輯 (Boolean)
(If X > 100 then Y, 格式轉換, 數學運算, 路由分流)
容錯率 (Tolerance) 可接受微小誤差
(回信稍微換個詞沒關係, 摘要抓重點即可)
零容錯
(金流計算, 更新資料庫 ID, 發送 API Key)
成本與速度 慢且貴 (Cost per token)
每次呼叫都要錢,且有延遲。
快且便宜
幾乎即時,成本極低。
外部依賴 無/低
(主要依賴模型內建知識或上下文)

(主要負責連接 Gmail, Slack, SQL, CRM)

整合建議

回到之前提到的「痛點」,最穩健的架構通常是 "n8n 包夾 Claude" (The Sandwich Pattern)

  1. n8n (前處理/手腳)
    • 監聽 Webhook (例如收到新 Email)。
    • 去資料庫抓客戶的基本資料 (CRM Data)。
    • 把「Raw Text」+「CRM Data」打包,丟給 Claude。
  2. Claude Skill (核心大腦)
    • 只負責思考,不執行。
    • 載入 SKILL.md
    • 分析語意,根據 SOP 決定要不要退款、要回什麼話。
    • 輸出 JSON (如範例一)。
  3. n8n (後處理/手腳)

    • 解析 Claude 回傳的 JSON。
    • If escalate_to_human is true Then 送 Slack 通知主管。
    • Else 呼叫 Gmail API 寄出 suggested_reply
    • Finally 寫入資料庫 Log。
  • n8n 是工廠的傳送帶與機械手臂(負責搬運、按按鈕)。
  • Claude Skill 是傳送帶旁那位看著顯微鏡的品管員(負責判斷好壞、寫檢驗報告)。

不要讓品管員去搬貨(Skill 直接 Call API),也不要讓機械手臂去寫報告(n8n 硬寫複雜 Regex),這樣系統就會穩。

總結

Claude Skill 的「必殺技」在於它允許你用寫文件的方式來寫程式。你不需要懂複雜的 Python 邏輯控制,只要用清晰的 Markdown 寫下你的 SOP,Claude 就會嚴格遵守這些步驟,這對於企業內部導入 AI 進行標準化作業非常有用。

skill 目前也默默成為大家的共識標準之一,主要是可以省去許多重複的 prompt, 大家在開發的時候應該也很經常遇到這樣的問題,目標就是懶還可以更懶, AI 自動還可以更自動。

回到問題點,身為開發者,到底 AI 時代的價值和定義是什麼?留給大家思考?

留言

這個網誌中的熱門文章

Vibe Coding:到底?氛圍驅動程式開發必殺技?

Vibe Coding(氛圍編程) 是由 OpenAI 共同創辦人 Andrej Karpathy 在 2025 年提出的革命性程式開發方式,它讓開發者透過自然語言與 AI 對話來生成程式碼,徹底改變了傳統的編程模式。 這種開發方式的核心理念是 「順著感覺走」 ,讓 AI 處理技術細節,開發者專注於創意和需求描述。 Vibe Coding 需要基本上的規劃和執行,但並沒有強制規範,從日常經驗來說可分為三個階段, 前期準備、開發過程、和後期維護 三個關鍵階段。每個階段都有其特定的任務和注意事項,正確執行這些步驟將大幅提升開發效率和程式品質。 將靈感與需求透過 AI 快速轉化成產品功能或原型。以下幫你分成 「前、中、後」 三階段要做的事情,適合你自己做、或帶團隊做 前期:設定 vibe & 準備素材 這個階段的重點是 「建立開發語境」 ,因為 AI 的生成表現高度依賴前期提供的上下文與資料。 明確目標 :釐清要解決的問題、預期要做的功能與核心價值。例如在筆記軟體的情境中,可能是:「我要做一款讓使用者能用 Markdown 記錄筆記,並提供標籤與全文搜尋功能的簡單 App。」 收集靈感 :觀察同類產品(如 Obsidian、Notion)、蒐集市場痛點(例如太多筆記軟體無法脫機使用,或同步效能差)。 建立語境 :準備初步 prompt、背景知識、產品定位、品牌調性、目標使用者輪廓等。 確認資源 :決定用哪些工具(Gemini、ChatGPT、設計軟體、流程管理工具等)。 確認完上述內容之後,就可以先開始進行準備規格,進行第一次的 Vibe Coding 方向驗證 提示詞模板準備 很多人會跳過這步驟,但一份 「好的 AI 提示詞模板」 將決定接下來每一次 AI 對話的品質。有效的提示詞模板需具備: 描述具體且無歧義 包含技術要求和約束條件 提供範例資料和測試案例 指定程式碼風格和慣例 例如針對筆記軟體的案例:   「建立一個支援 AI 功能純文字筆記,輸入內容可即時渲染;需支援儲存到本地檔案,提供標籤欄位做分類;以 React 架構,程式風格採用 Tailwind style components 並使用 hooks。」 開發工具選擇 開發工具的選擇 同樣重要,目前市場上主要的 ...

Claude Code Hooks:自動化與安全的最佳實踐

寫在最前頭,這份文章主要寫起來是給自己看, 同時內容是比較適合開發者,工程師們可以做些自動化處理的簡單筆記。 Claude Code hooks Claude Code hooks 是一種強大的自動化機制,允許用戶在 Claude Code 的不同生命週期階段,自定義執行 shell 指令。這種設計讓開發者能夠將規則和自動化行為嵌入到應用層級,確保每次都能可靠執行,而不必依賴 LLM(大型語言模型)是否會選擇執行某項操作。 Hooks 的核心用途 通知 :自訂收到 Claude Code 等待用戶輸入或執行權限時的提醒方式。 自動格式化 :如在每次檔案編輯後自動執行 prettier (針對 .ts 檔)、 gofmt (針對 .go 檔)等。 日誌記錄 :追蹤所有執行過的命令,便於合規或除錯。 自動反饋 :當 Claude Code 產生不符合團隊規範的程式碼時,自動給出反饋。 自訂權限 :阻擋對生產環境檔案或敏感目錄的修改[^1]。 配置與結構 Hooks 透過設定檔進行配置,分為全域( ~/.claude/settings.json )、專案( .claude/settings.json )、本地專案( .claude/settings.local.json )以及企業級策略設定。每個 hook 由「事件名稱」和「匹配器」組成: "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "jq -r '...'" } ] } ] } matcher :用於匹配工具名稱(支援正則表達式),如 Write 、 Edit|Write 、 Notebook.* 。 hooks :當匹配時要執行的命令陣列。 type :目前僅支援 "command" 。 ...

[CSS] z-index 在不同瀏覽器繼承問題

今天會討論到這個課題,是因為要實做一個Popup dialog,所以我們希望的結果如下圖。 可是在IE7 卻發生了這樣的情況。 Popup不論怎麼設定z-index都無法浮在最上層,我們看一下html架構發生什麼事情。