什麼是 Agent Skill?從工具到技能的演進
從工具到技能的演進,理解 Skill 的核心結構、設計原則,以及它如何讓 Agent 從「會呼叫工具」進化到「會完成任務」。
什麼是 Agent Skill?從工具到技能的演進
前面十篇 Agent 系列,我們讓 Agent 能呼叫工具、擁有記憶、使用 RAG、多 Agent 協作,甚至加上了護欄與可觀測性。
但你可能會發現一個問題:Agent 有工具,卻不見得會「做事」。
給它 search_web、read_pdf、summarize 三個工具,它不見得知道怎麼把它們串成「寫一份研究報告」。
這一篇,我們要談 Agent 能力的下一個層次:Skill(技能)。
我們會解釋工具與技能的差異、為什麼需要 Skill、Skill 的核心結構,以及它如何讓 Agent 從「會呼叫工具」進化到「會完成任務」。
一、先回想:工具解決了什麼?
在 Agent 系列第三篇,我們談了工具呼叫。
工具解決的是「Agent 能接觸外部世界」的問題:
- 查天氣 →
get_weather - 查時間 →
get_current_time - 搜尋網路 →
search_web - 計算數學 →
calculate
每個工具都是一個單一職責的函式,接收參數、回傳結果。
LLM 根據使用者的問題,決定要呼叫哪個工具、傳什麼參數。
這已經很強大了。
但當任務變複雜時,你會發現工具的天花板。
二、工具的局限:為什麼「有工具」不等於「會做事」?
假設你給 Agent 三個工具:
tools = ["search_web", "read_pdf", "summarize"]
現在使用者說:
幫我研究「2026 年 AI Agent 的發展趨勢」,寫一份簡短報告。
你覺得 Agent 會怎麼做?
它可能會:
- 呼叫
search_web("2026 AI Agent trends") - 拿到一堆搜尋結果
- 然後……不知道下一步該做什麼
- 或者隨機挑一個結果
read_pdf - 讀完後
summarize - 生成一段回答
看起來好像完成了,但品質往往很差。
因為它不知道正確的流程:
- 應該先搜尋哪些關鍵字?
- 應該讀幾篇文章?
- 哪些來源比較可信?
- 要怎麼交叉驗證?
- 報告該有什麼結構?
- 引用來源要怎麼標註?
- 什麼時候該停下來?
這些「怎麼做」的知識,不在工具裡面。
工具只告訴 Agent「可以做什麼」,卻沒告訴它「該怎麼做」。
這就是工具的局限:
| 局限 | 說明 |
|---|---|
| 原子性 | 每個工具只做一件小事 |
| 缺乏流程 | 不知道多個工具的執行順序 |
| 缺乏判斷 | 不知道何時該用、何時不該用 |
| 缺乏標準 | 沒有輸出品質的規範 |
| 難以重用 | 每次都要重新規劃流程 |
| 無法累積 | 無法把經驗保存下來 |
三、什麼是 Skill?
**Skill(技能)**是為了解決上述問題而出現的更高層次抽象。
Skill 是一組可重用、可組合、有明確輸入輸出的能力單元。它封裝了完成某類任務所需的流程、知識、工具與最佳實踐。
比方來說:
- 工具像一把鎚子、一支螺絲起子、一把鋸子。
- Skill像「組裝一張桌子」的方法——它知道要用哪些工具、按照什麼順序、注意什麼細節、怎麼檢查成品。
工具是零件,Skill 是工法。
Skill 的定義特徵
一個 Skill 通常包含以下要素:
- 名稱與描述:這個 Skill 做什麼、何時該用。
- 輸入與輸出:它接收什麼、產出什麼。
- 執行流程:完成任務的步驟與順序。
- 使用的工具:它需要哪些工具。
- 判斷邏輯:什麼情況下該怎麼做。
- 輸出規範:產出的格式與品質標準。
- 範例:正確使用的示例。
- 邊界與限制:什麼情況下不該用。
四、工具 vs Skill:一張表看懂差異
| 面向 | 工具(Tool) | 技能(Skill) |
|---|---|---|
| 粒度 | 原子操作 | 完成一類任務 |
| 內容 | 單一函式 | 流程 + 工具 + 知識 + 規範 |
| 範例 | search_web | research_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 正確理解與使用。