什麼是 Agent Skill?從工具到技能的演進

從工具到技能的演進,理解 Skill 的核心結構、設計原則,以及它如何讓 Agent 從「會呼叫工具」進化到「會完成任務」。

什麼是 Agent Skill?從工具到技能的演進

前面十篇 Agent 系列,我們讓 Agent 能呼叫工具、擁有記憶、使用 RAG、多 Agent 協作,甚至加上了護欄與可觀測性。

但你可能會發現一個問題:Agent 有工具,卻不見得會「做事」

給它 search_webread_pdfsummarize 三個工具,它不見得知道怎麼把它們串成「寫一份研究報告」。

這一篇,我們要談 Agent 能力的下一個層次:Skill(技能)
我們會解釋工具與技能的差異、為什麼需要 Skill、Skill 的核心結構,以及它如何讓 Agent 從「會呼叫工具」進化到「會完成任務」。

Tools → Skills → Reliable Agent

一、先回想:工具解決了什麼?

在 Agent 系列第三篇,我們談了工具呼叫。
工具解決的是「Agent 能接觸外部世界」的問題:

  • 查天氣 → get_weather
  • 查時間 → get_current_time
  • 搜尋網路 → search_web
  • 計算數學 → calculate

每個工具都是一個單一職責的函式,接收參數、回傳結果。
LLM 根據使用者的問題,決定要呼叫哪個工具、傳什麼參數。

這已經很強大了。
但當任務變複雜時,你會發現工具的天花板。

二、工具的局限:為什麼「有工具」不等於「會做事」?

假設你給 Agent 三個工具:

tools = ["search_web", "read_pdf", "summarize"]

現在使用者說:

幫我研究「2026 年 AI Agent 的發展趨勢」,寫一份簡短報告。

你覺得 Agent 會怎麼做?

它可能會:

  1. 呼叫 search_web("2026 AI Agent trends")
  2. 拿到一堆搜尋結果
  3. 然後……不知道下一步該做什麼
  4. 或者隨機挑一個結果 read_pdf
  5. 讀完後 summarize
  6. 生成一段回答

看起來好像完成了,但品質往往很差。
因為它不知道正確的流程:

  • 應該先搜尋哪些關鍵字?
  • 應該讀幾篇文章?
  • 哪些來源比較可信?
  • 要怎麼交叉驗證?
  • 報告該有什麼結構?
  • 引用來源要怎麼標註?
  • 什麼時候該停下來?

這些「怎麼做」的知識,不在工具裡面。
工具只告訴 Agent「可以做什麼」,卻沒告訴它「該怎麼做」。

這就是工具的局限:

局限說明
原子性每個工具只做一件小事
缺乏流程不知道多個工具的執行順序
缺乏判斷不知道何時該用、何時不該用
缺乏標準沒有輸出品質的規範
難以重用每次都要重新規劃流程
無法累積無法把經驗保存下來

三、什麼是 Skill?

**Skill(技能)**是為了解決上述問題而出現的更高層次抽象。

Skill 是一組可重用、可組合、有明確輸入輸出的能力單元。它封裝了完成某類任務所需的流程、知識、工具與最佳實踐。

比方來說:

  • 工具像一把鎚子、一支螺絲起子、一把鋸子。
  • Skill像「組裝一張桌子」的方法——它知道要用哪些工具、按照什麼順序、注意什麼細節、怎麼檢查成品。

工具是零件,Skill 是工法。

Tools (Parts) → Skill (Craft) → Task (Result)

Skill 的定義特徵

一個 Skill 通常包含以下要素:

  1. 名稱與描述:這個 Skill 做什麼、何時該用。
  2. 輸入與輸出:它接收什麼、產出什麼。
  3. 執行流程:完成任務的步驟與順序。
  4. 使用的工具:它需要哪些工具。
  5. 判斷邏輯:什麼情況下該怎麼做。
  6. 輸出規範:產出的格式與品質標準。
  7. 範例:正確使用的示例。
  8. 邊界與限制:什麼情況下不該用。

四、工具 vs Skill:一張表看懂差異

面向工具(Tool)技能(Skill)
粒度原子操作完成一類任務
內容單一函式流程 + 工具 + 知識 + 規範
範例search_webresearch_topic
輸入明確參數高階目標
輸出原始資料結構化結果
判斷有(何時用、怎麼用)
可組合需人工編排可呼叫其他 Skill
可重用低(每次重新規劃)高(封裝成技能)
可測試容易需要專門的 Harness
累積性可版本管理與迭代

舉個具體例子:

工具層:

search_web(query)      # 搜尋
read_pdf(url)          # 讀取 PDF
summarize(text)        # 摘要
extract_entities(text) # 抽取實體

Skill 層:

research_topic(topic)
    """研究一個主題並產出結構化摘要"""
    1. 根據主題生成多個搜尋關鍵字
    2. 搜尋並篩選高品質來源
    3. 讀取每篇文章
    4. 抽取關鍵資訊
    5. 交叉驗證事實
    6. 整理成結構化摘要
    7. 標註來源

research_topic 這個 Skill 內部會呼叫多個工具,但它自己是一個更高層次的能力單元。

五、Skill 的核心設計原則

1. 單一職責

一個 Skill 只負責一類任務。
research_topic 只做研究,不要同時做寫作。

2. 明確的輸入輸出

每個 Skill 都應該有清楚的介面:

class Skill:
    name: str
    description: str
    input_schema: dict
    output_schema: dict
    
    def execute(self, input_data: dict) -> dict:
        ...

3. 漸進式揭露(Progressive Disclosure)

這是 Skill 設計中最重要的概念之一。

不要一次把所有細節載入上下文,而是按需載入。

想像一個 Skill 的說明文件有 5000 字。
如果每次呼叫 LLM 都塞這 5000 字,成本高、還會稀釋注意力。

漸進式揭露的做法是:

  • 第一層:只給 Skill 的名稱與簡短描述(50 字)。
  • 第二層:當 LLM 決定要用這個 Skill 時,才載入完整指令。
  • 第三層:當執行到某個步驟時,才載入該步驟的詳細說明或範例。
第一層:research_topic - 研究一個主題並產出結構化摘要
    ↓ LLM 決定使用
第二層:完整流程說明(步驟、工具、規範)
    ↓ 執行到「篩選來源」步驟
第三層:篩選來源的詳細標準與範例

這樣可以大幅降低上下文成本,同時保持能力。

4. 可組合性

Skill 可以呼叫其他 Skill。

class WriteReportSkill(Skill):
    def execute(self, topic: str) -> str:
        # 呼叫研究 Skill
        research = ResearchTopicSkill().execute(topic)
        
        # 呼叫大綱 Skill
        outline = OutlineSkill().execute(research)
        
        # 呼叫撰寫 Skill
        draft = WriteDraftSkill().execute(outline)
        
        # 呼叫校對 Skill
        final = ProofreadSkill().execute(draft)
        
        return final

5. 版本管理

Skill 會迭代。
每個版本都應該能被追蹤、測試、回滾。

class SkillVersion:
    name: str
    version: str        # 例如 "1.2.0"
    changelog: str
    created_at: str
    performance: dict   # 成功率、平均成本、平均延遲

6. 邊界與權限

每個 Skill 都應該有明確的權限範圍:

  • 它能存取哪些工具?
  • 它能讀寫哪些資料?
  • 它需要什麼層級的審核?

六、一個具體的 Skill 範例

讓我們用「研究一個主題」這個 Skill 來具體說明。

Skill 定義(SKILL.md 風格)

# Skill: research_topic

## 描述
研究一個給定的主題,蒐集多個來源的資訊,
交叉驗證後產出結構化的研究摘要。

## 何時使用
- 使用者要求「研究」、「調查」、「整理」某個主題
- 需要多來源資訊的任務
- 需要事實查核的任務

## 輸入
- topic (string): 要研究的主題
- depth (string, optional): 研究深度,可選 "quick" / "standard" / "deep",預設 "standard"

## 輸出
{
  "topic": "研究主題",
  "summary": "結構化摘要",
  "key_findings": ["發現1", "發現2"],
  "sources": [{"title": "...", "url": "...", "reliability": "high/medium/low"}],
  "confidence": 0.85
}

## 執行流程
1. 根據主題生成 3-5 個搜尋關鍵字
2. 使用 search_web 搜尋每個關鍵字
3. 篩選高品質來源(排除廣告、低品質內容)
4. 使用 read_pdf 或 read_webpage 讀取每個來源
5. 使用 extract_entities 抽取關鍵資訊
6. 交叉驗證事實(至少 2 個來源一致)
7. 整理成結構化摘要
8. 標註每個發現的來源

## 使用的工具
- search_web
- read_webpage
- read_pdf
- extract_entities
- summarize

## 輸出規範
- 摘要長度:quick = 200 字,standard = 500 字,deep = 1000 字
- 每個關鍵發現都必須有至少一個來源
- 來源必須標註可靠性等級
- 如果多個來源矛盾,必須明確指出

## 邊界與限制
- 不處理需要付費牆的內容
- 不處理需要登入的網站
- 如果找不到足夠來源,回報 confidence < 0.5
- 如果主題涉及敏感內容,拒絕執行

## 範例
輸入:{"topic": "2026 年 AI Agent 發展趨勢", "depth": "standard"}
輸出:{...}

Skill 實作

class ResearchTopicSkill:
    name = "research_topic"
    description = "研究一個主題並產出結構化摘要"
    
    def __init__(self, tools: dict, llm_client):
        self.tools = tools
        self.llm = llm_client
    
    def execute(self, topic: str, depth: str = "standard") -> dict:
        # 1. 生成搜尋關鍵字
        keywords = self._generate_keywords(topic)
        
        # 2. 搜尋
        all_results = []
        for kw in keywords:
            results = self.tools["search_web"](kw)
            all_results.extend(results.get("results", []))
        
        # 3. 篩選來源
        filtered = self._filter_sources(all_results)
        
        # 4. 讀取內容
        contents = []
        for source in filtered[:5]:  # 最多讀 5 篇
            content = self.tools["read_webpage"](source["url"])
            contents.append({"source": source, "content": content})
        
        # 5. 抽取關鍵資訊
        findings = []
        for item in contents:
            entities = self.tools["extract_entities"](item["content"])
            findings.append({
                "source": item["source"],
                "entities": entities,
            })
        
        # 6. 交叉驗證
        verified = self._cross_validate(findings)
        
        # 7. 生成摘要
        summary = self._generate_summary(topic, verified, depth)
        
        # 8. 組裝輸出
        return {
            "topic": topic,
            "summary": summary,
            "key_findings": [f["finding"] for f in verified],
            "sources": [f["source"] for f in verified],
            "confidence": self._calculate_confidence(verified),
        }
    
    def _generate_keywords(self, topic: str) -> list:
        prompt = f"請為以下主題生成 3-5 個搜尋關鍵字:{topic}"
        result = self.llm(prompt)
        return [k.strip() for k in result.split("\n") if k.strip()]
    
    def _filter_sources(self, results: list) -> list:
        # 篩選邏輯:排除廣告、低品質來源
        return [r for r in results if self._is_quality_source(r)]
    
    def _is_quality_source(self, source: dict) -> bool:
        # 實作略
        return True
    
    def _cross_validate(self, findings: list) -> list:
        # 交叉驗證邏輯
        # 只有出現在至少 2 個來源的發現才被保留
        return findings
    
    def _generate_summary(self, topic: str, findings: list, depth: str) -> str:
        length_map = {"quick": 200, "standard": 500, "deep": 1000}
        target_length = length_map.get(depth, 500)
        
        prompt = f"""請根據以下資訊,為主題「{topic}」撰寫約 {target_length} 字的摘要。

資訊:
{findings}

要求:
1. 只根據提供的資訊撰寫
2. 標註來源
3. 如果有矛盾,明確指出

摘要:"""
        
        return self.llm(prompt)
    
    def _calculate_confidence(self, findings: list) -> float:
        # 根據來源數量與一致性計算信心度
        if not findings:
            return 0.0
        source_count = len(set(f["source"]["url"] for f in findings))
        return min(source_count / 5.0, 1.0)

使用 Skill

# 建立 Skill
research_skill = ResearchTopicSkill(tools=TOOL_FUNCTIONS, llm_client=call_llm)

# 執行
result = research_skill.execute(
    topic="2026 年 AI Agent 發展趨勢",
    depth="standard",
)

print(result["summary"])
print(f"信心度:{result['confidence']}")
print(f"來源數:{len(result['sources'])}")

七、Skill 與 Agent 的關係

Skill 不是取代 Agent,而是擴展 Agent 的能力。

還記得我們在 Agent 系列第四篇打造的基礎 Agent 嗎?
它的主迴圈是:

使用者輸入 → LLM → 工具呼叫 → 結果 → LLM → 最終回答

加入 Skill 之後,Agent 的架構變成:

使用者輸入

┌─────────────────────────────┐
│       Agent 主迴圈           │
│                             │
│   LLM 決定:                │
│   - 直接回答?              │
│   - 呼叫工具?              │
│   - 使用 Skill?            │
│                             │
│   ┌───────────────────┐     │
│   │   Skill 執行器     │     │
│   │                   │     │
│   │   Skill 內部:     │     │
│   │   - 呼叫多個工具   │     │
│   │   - 執行多個步驟    │     │
│   │   - 呼叫其他 Skill │     │
│   │   - 產出結構化結果  │     │
│   └───────────────────┘     │
│                             │
└─────────────────────────────┘

最終回答

Agent 負責「決定要做什麼」,Skill 負責「知道怎麼做」。

打個比方:

  • Agent 是專案經理,負責決定方向、分配任務。
  • Skill 是專業技能,像是「寫程式」、「做設計」、「寫文案」。
  • Tool 是工具,像是「IDE」、「Figma」、「Word」。

專案經理不需要自己會寫程式,但他知道什麼時候該找誰、該用什麼工具。

八、為什麼現在談 Skill?

Skill 這個概念最近變得特別熱門,有幾個原因:

1. Agent 從「玩具」走向「生產」

早期的 Agent 大多只能做簡單任務。
當企業開始把 Agent 投入生產,就需要可重用、可測試、可治理的能力單元。

2. 上下文成本成為瓶頸

把所有指令塞進 Prompt 的做法,成本高、效果差。
漸進式揭露讓 Skill 可以按需載入,大幅降低成本。

3. 框架開始支援

Anthropic 的 Claude Skills、OpenAI 的 GPTs、各種 Agent 框架,都開始把 Skill 作為一等公民。

4. 組織需要能力庫

當一個團隊有多個 Agent 時,他們需要一個共享的 Skill Library,避免重複造輪子。

九、Skill 的挑戰

Skill 很強大,但也帶來新的挑戰:

1. 如何設計好的 Skill?

Skill 的品質取決於:

  • 流程設計是否合理
  • 判斷邏輯是否完備
  • 輸出規範是否清楚
  • 邊界與限制是否明確

2. 如何測試 Skill?

Skill 的輸出不是固定的,測試比傳統函式難。
這就需要專門的 Harness——也就是我們下一個系列要談的主題。

3. 如何組合 Skill?

Skill 可以呼叫 Skill,但也帶來依賴管理、錯誤傳播、版本相容等問題。

4. 如何治理 Skill?

當組織有數十個 Skill 時,需要:

  • 統一的命名與分類
  • 版本管理與發布流程
  • 權限控制與審核
  • 效能監控與優化

5. 如何避免 Skill 爆炸?

不是每個任務都需要一個 Skill。
要拿捏粒度:太細變成工具,太粗變成黑箱。

十、總結:從零件到工法

讓我們回顧這一篇的核心:

  • 工具的局限:原子性、缺乏流程、缺乏判斷、難以重用、無法累積。
  • Skill 的定義:可重用、可組合、有明確輸入輸出的能力單元。
  • Skill 的要素:名稱、輸入輸出、流程、工具、判斷、規範、範例、邊界。
  • 工具 vs Skill:工具是零件,Skill 是工法。
  • 核心原則:單一職責、明確介面、漸進式揭露、可組合、版本管理、權限邊界。
  • Skill 與 Agent 的關係:Agent 決定做什麼,Skill 知道怎麼做。
  • 為什麼現在談 Skill:Agent 走向生產、上下文成本、框架支援、組織需求。
  • Skill 的挑戰:設計、測試、組合、治理、粒度。

工具讓 Agent 能接觸世界,Skill 讓 Agent 能完成任務。
從工具到技能,是 Agent 從「會呼叫」到「會做事」的關鍵一步。

但設計了 Skill 之後,下一個問題是:你怎麼知道這個 Skill 真的好用?
當你修改了 Skill 的 Prompt,你怎麼知道它有沒有變好?
當你有多個 Skill 時,你怎麼比較它們的優劣?

這就是下一個系列要談的主題:Agent Harness


下一篇預告

《Skill 的結構:指令、工具、資源與範例》

我們會深入拆解一個 Skill 的內部結構,談談 SKILL.md 的設計、漸進式揭露的實作方式、如何撰寫有效的指令與範例,以及如何讓 Skill 可以被 LLM 正確理解與使用。