AI Agent Skills 設計原則

在開發 AI Agent 的過程中,撰寫穩定且高效的技能 (Skills) 是一項充滿挑戰的工作。無論你是在 ChatGPT 上開發 Custom GPTs,或是為 Claude 撰寫 Tool Use 機制,只要技能設計得不夠精確,Agent 就可能會誤用工具、產生幻覺,甚至在複雜的任務中陷入無窮迴圈。

為了確保系統的可靠性,業界歸納出了幾項核心的設計思維。

原子性設計與單一職責

設計技能時,最重要的原則就是保持工具的「原子性 (Atomic Scope)」。一個技能應該只負責解決一件事情,並且擁有清晰的邊界。

如果一個工具被設計成「包山包海」的萬能介面,例如一個叫做 manage_database 的工具同時負責讀取、寫入、刪除和備份,Agent 往往會不知道該如何正確組合參數,進而導致執行失敗或誤刪資料。

❌ 錯誤設計:龐大且模糊的工具

{
  "name": "data_tool",
  "description": "處理所有資料庫操作,包含查詢用戶、更新訂單和刪除記錄。"
}

✅ 正確設計:拆分為原子性工具 將其拆解成多個小而美的獨立技能,不僅能讓 Agent 更容易理解每個工具的用途,也能提升任務執行的成功率。

{
  "name": "get_user_profile",
  "description": "透過 User ID 查詢單一使用者的基本資料。"
}
// 另一個獨立的技能
{
  "name": "update_order_status",
  "description": "更新特定訂單的物流狀態。"
}

職責分離:判斷與執行的切分

在 AI 系統的架構中,必須清楚區分「語言模型」與「技能腳本」各自的職責。一般而言,Agent 負責「理解、推論與規劃」,而技能則負責「明確的執行與回報」。

這意味著我們不應該將所有邏輯都交給語言模型去猜測。當某項任務需要絕對的一致性與準確度時(例如:計算金融數據、檢查資料庫權限、或是發送重要的 API 請求),應該將這些規則寫死在後端的 API 或腳本中,成為一個確定性 (Deterministic) 的操作。

例如,與其讓 Claude 自己寫一段 Python 程式碼去計算複雜的稅率,不如提供一個 calculate_tax 的技能,讓 Claude 只要傳入「金額」,後端程式碼負責回傳精確的「稅額」。語言模型只需要決定「何時」呼叫,而不需要煩惱「如何」算。

提供預設值與收斂選項

當面對多種操作方式時,給予 AI 過多的選擇反而會造成困擾。如果一個技能提供了數十種可選參數,Agent 很有可能會隨機組合出不合理的請求。

在設計技能的介面時,建議只開放必要的參數,並為其他設定提供合理的預設值。如果某個選項只有在極少數極端情況下才會用到,請考慮將它隱藏,或是在技能的文字描述中明確告知 Agent 在什麼情況下才可以去修改這個預設值。

# 技能的後端實作範例:預設處理大部分情況,僅開放必要的輸入參數
def extract_text(file_path, use_ocr=False):
    """
    從文件中提取文字。預設使用一般文字解析。
    【給 Agent 的提示】:若檔案為圖片或純掃描的 PDF 檔,才需要將 use_ocr 設為 True。
    """
    if use_ocr:
        return perform_ocr(file_path)
    else:
        return parse_standard_text(file_path)

這樣的設計能有效限縮 Agent 的決策範圍,避免它在不需要的情境下浪費運算資源與等待時間。

清晰且針對性的工具描述 (Description)

無論是 ChatGPT 還是 Claude,語言模型都是透過閱讀「工具描述 (Description)」來決定是否要呼叫該技能。因此,描述的撰寫必須極度清晰且具有針對性。

一個優秀的描述不僅要說明「這個工具能做什麼」,更要強調「什麼時候該用它」。避免使用過度攏統的詞彙,而是應該加入具體的關鍵字與觸發情境。

❌ 錯誤描述

"處理 PDF 檔案。" (太過簡略,Agent 不知道能處理什麼)

✅ 正確描述

"從 PDF 文件中提取純文字內容。當使用者上傳 PDF 檔案,並要求「總結文章」、「尋找特定段落」或「翻譯內容」時,請先使用此技能獲取文本。" (清楚定義了功能以及觸發的對話情境)