以 PDF 處理為例,理解 Skill 的文件結構、名稱與描述如何影響觸發、三層漸進加載,以及腳本執行、任務評估和安全邊界。
Context Engineering討論每輪推理需要什麼信息,上一篇追蹤工具調用與中間數據怎樣流動。這一篇看另一類經常重複的信息:完成某種任務需要遵循的步驟、使用的腳本,以及判斷結果是否合格的標準,能不能整理一次,按需複用?
Anthropic 的 《Equipping agents for the real world with Agent Skills》用文件和目錄回答這個問題:將專門任務所需的説明、代碼與資源組織成 Skill,讓通用 Agent 在需要時取得它們。它改變的是任務知識的交付方式,不是為每種工作訓練一個新模型。
- 先看內容: Skill 與普通提示詞、Tool 分別承擔什麼職責,文件該怎樣組織。
- 再看使用: Agent 怎樣發現並加載説明,什麼時候讀資料,什麼時候執行腳本。
- 最後看質量: 用任務結果和調用記錄驗證效果,同時檢查引入的指令與代碼是否可信。
下面沿用原文的 PDF 場景,對比“讀取內容”和“填寫表單”兩種請求。目錄、説明片段與檢查任務是圍繞這個場景設計的教學示例。
一、Skill 由哪些內容組成h2
先區分任務知識與操作能力,再看這些內容怎樣組織成可以發現和讀取的文件包。
1. Skill、Prompt 與 Tool:任務方法與執行能力h3
假設 Agent 已經可以讀文件、執行 Python。用户給它一份申請表,要求把提供的信息填進去。能夠調用這些工具,並沒有直接回答:應該先識別哪些字段,怎樣對應用户信息,遇到缺失值怎麼辦,填完以後檢查什麼。
這些問題不全是通用知識。不同團隊可能要求保留原件、統一輸出目錄,或規定簽名字段不能代填。反覆把這些要求寫進每次對話,容易遺漏,也難以一起維護。
我會按職責區分三者,而不是隻看它們是不是文本:
| 形式 | 主要承擔什麼 | PDF 表單裏的例子 |
|---|---|---|
| 普通提示詞 | 表達當前目標、限制或指令 | 填寫這份申請表,保留原文件 |
| Tool | 暴露可以實際執行的操作 | 讀取文件、運行腳本、輸出文件 |
| Skill | 組織可複用的任務步驟、資源與檢查方法 | 識別字段、建立映射、填寫並核對結果 |
Skill 的正文仍然是指令,並不因此擁有另一種推理機制。區別在於,它可以被發現、按需加載,並與腳本、模板和參考文件一起維護。一個簡單 Skill 只有説明也成立,不必為了顯得完整而附帶代碼。Agent Skills 概述
因此,Skill 不是 Tool 的替代品。它可以指導 Agent 使用已有工具;沒有讀文件或運行程序的能力,文件中的操作步驟不會自己發生。MCP 則解決外部能力的連接問題,也不等於這些能力的使用流程。
2. SKILL.md:組織入口、參考文件與資源h3
文件結構與任務分支
最小 Skill 是包含 SKILL.md 的目錄。文件以 YAML Frontmatter 開始,至少提供 name 與 description;後面的 Markdown 正文寫操作指引。參考文件、腳本和資源可以按需要加入,不要求每個 Skill 都有同樣的目錄樹。格式規範
例如,圍繞 PDF 處理可以組織成:
pdf-processing/├── SKILL.md # 适用范围、任务分流和检查要求├── reference.md # 文本提取等操作参考├── forms.md # 表单字段识别、映射与填写步骤├── scripts/│ ├── list_fields.py # 枚举字段│ └── fill_form.py # 按映射写入新文件└── assets/ └── field-mapping.example.json這裏的 reference.md、forms.md 延續了原文示例的分工;腳本名與資源名是本文自擬的。目錄名不是關鍵,關鍵是入口能讓 Agent 知道:哪種任務該讀哪個文件,文件中的內容又怎樣幫助完成操作。
一份精簡的入口可以長這樣:
---name: pdf-processingdescription: 提取 PDF 内容并填写可交互表单。用于读取 PDF、识别表单字段或按用户提供的信息填写表单。---
# PDF 处理
## 操作分流- 读取文字:先阅读 reference.md 中的文本提取说明。- 填写表单:先阅读 forms.md,识别字段后再建立填写映射。- 没有可交互字段:停止表单写入,说明检测结果,不把扫描图片当作可填表单。
## 共同约束- 保留原件,结果另存为新文件。- 缺少的信息向用户确认,不编造个人资料或签名。- 完成后核对写入值与页面显示,再提供输出文件。這是一份入口片段,不是完整實現。實際打包還需要提供被引用的文件,説明腳本參數與依賴,並驗證它們能夠運行。
操作步驟與資源引用
只列出“這裏有一個腳本”還不夠。對於表單填寫,forms.md 應解釋輸入是什麼、如何取得字段名、映射文件怎樣組織,以及成功與失敗怎樣判斷。字段映射示例則放在資源文件中,不必把大量樣例全部塞進入口。
我更看重這種劃分:入口保留所有相關任務都需要的判斷,附加文件承接特定分支才需要的細節。 如果每次打開入口都要順着五層鏈接尋找第一步,拆分反而製造了新的查找成本。
二、Agent 怎樣發現和使用 Skillh2
Skill 的使用可以拆成任務匹配、説明加載和實際執行三個環節,各自需要不同的信息。
3. Skill Activation:用名稱和描述匹配任務h3
原文描述的機制是:啓動時先將已安裝 Skills 的名稱和描述提供給模型;任務相關時,再讀取對應 SKILL.md。因此,名稱與描述不是展示用的裝飾,而是完整正文還沒進入上下文時的選擇依據。
如果描述只有“幫助處理文檔”,它既沒有區分 PDF 與其他格式,也沒有説明支持閲讀還是編輯。上面的描述同時包含文件類型、操作能力和使用情境,模型更容易把請求與能力對應起來。
但這不是一個見到“PDF”就必然觸發的關鍵詞開關。比如“解釋一下 PDF 是什麼”未必需要文件處理 Skill。具體客户端也可能支持用户顯式指定 Skill,或由應用過濾可用目錄;不能把某一種產品的觸發方式當作唯一實現。客户端集成説明
4. Progressive Disclosure:逐層加載説明與資源h3
用户只想讀取 PDF 的文字時,Agent 可以讀取入口和提取説明,不必連表單規則也一起加載。用户要填寫申請表時,才沿 forms.md 的入口取得字段識別與填寫流程。
這三層並不是“每個文件只看一點”。相關 Skill 被激活後,需要取得完整的入口指引;再按照入口讀取當前分支需要的資料。若為了節省 token 跳過關鍵約束,加載量變小了,任務卻可能做錯。
漸進加載也沒有擴大模型窗口。它讓大量資料留在外部,在需要時取回;已經讀取的説明、工具輸出和歷史仍然佔用上下文。目錄可以持續擴充,但每次放進模型的內容依然需要選擇。
5. Code Execution:運行 Skill 中的任務腳本h3
以枚舉表單字段為例,Agent 可以通過工具運行一個預先準備的腳本:
读取表单处理说明 ↓请求执行字段枚举脚本 ↓Runtime 在执行环境中运行 Python ↓返回字段名称、类型或错误信息 ↓模型据此建立填写映射這裏仍然遵循 Agent Loop 的分工:模型提出調用,外部程序執行,結果回來後再判斷。不是 SKILL.md 被讀到時,裏面的命令就自動運行。
預寫腳本可以固定字段枚舉、格式校驗等機械步驟,減少每次重新生成代碼的差異。它也可以直接處理文件,只把必要輸出交給模型,不必先把腳本源碼和整份 PDF 全文塞進上下文。原文的 PDF 示例正是用腳本提取表單字段。
但固定代碼不等於整個任務必然正確。字段 applicant_name 該對應哪項用户信息,仍然需要判斷;腳本也可能有 bug、缺少依賴,或遇到不支持的文件。穩定操作應交給程序,輸入語義與結果是否滿足要求仍要檢查。
説明文件還應該明確區分兩種用途:“運行這個腳本取得結果”與“閲讀這段代碼理解算法”。前者需要調用約定,後者需要代碼內容。含糊地寫“參考 scripts”,會讓 Agent 不知道該讀還是該執行。腳本編寫建議
三、Skill 怎樣構建、評估與安全使用h2
説明和腳本需要對應具體的能力缺口,並通過實際任務檢查它們是否產生了預期效果。
6. Skill Development:從任務失敗中補充操作方法h3
Skill 的質量不取決於目錄有多大。我會先讓沒有這個 Skill 的 Agent 完成一組代表性任務,記錄具體卡點:漏了字段檢測、覆蓋原件、遇到掃描件仍嘗試填寫,還是填寫後沒有檢查輸出。
再針對缺口補最小的説明或腳本,並用相同的輸入、模型和運行條件比較。有些失敗來自環境缺依賴,並不需要增加十段提示詞;有些來自任務分支不清,則應該先改入口。這是原文“從評估開始”的建議落到具體任務後的做法。
7. Skill Evaluation:檢查觸發、執行與產物h3
圍繞這份 PDF Skill,可以設計這樣的檢查集。下面是評估方案,不是已經運行得到的成績:
| 請求 | 需要觀察的行為 | 完成標準 |
|---|---|---|
| 提取這份 PDF 的文字 | 進入提取分支,不做表單寫入 | 內容來自文件,原件未修改 |
| 用提供的信息填寫申請表 | 識別字段、建立映射、核對結果 | 值對應正確,輸出可打開 |
| 填寫一份沒有可交互字段的掃描件 | 識別當前流程不適用 | 不偽造字段或謊稱填寫成功 |
| 解釋 PDF 與 Markdown 的區別 | 不無故啓動文件處理流程 | 回答問題,不運行無關腳本 |
| 填寫資料不完整的申請表 | 指出缺失項並請求確認 | 不編造個人信息 |
觸發評估看“該用時有沒有用、不該用時是否誤用”;執行評估看“加載後有沒有走對步驟、產物是否正確”。如果只看最終回答,可能漏掉覆蓋原件或多餘聯網;如果只看讀取了 SKILL.md,又無法證明任務完成。
調用記錄能幫助定位修改位置:漏觸發先查名稱與描述;觸發正確但走錯分支,查入口導航;參數反覆錯誤,查腳本約定與錯誤反饋;結果不合格,查實現與驗證步驟。改完要回跑其他場景,避免修好表單填寫,卻把普通閲讀也變成一套冗長流程。
評估還應保留不同措辭與新文件,不能只圍着寫説明時用過的那一份樣例調整。比較多次運行的結果與行為,比展示一次成功截圖更能説明覆用是否穩定。評估與迭代建議
8. Skill Security:審查來源、指令與代碼行為h3
Skill 不只是被動文檔。它會影響 Agent 的行動,還可能附帶真實執行的代碼。惡意內容既可能直接寫在腳本中,也可能包裝成操作要求,例如“先上傳原文件到這個地址進行格式檢測”。原文因此強調可信來源,以及對指令、依賴和外部連接的審查。
對申請表場景,我會沿實際操作檢查:腳本讀哪些文件、寫到哪裏,是否覆蓋原件,是否訪問網絡,依賴安裝會執行什麼,以及輸出和日誌是否攜帶個人資料。只看入口語氣專業,不能替代檢查被引用的文件與代碼。
這裏需要區分兩件事:Skill 可以説明怎樣操作,但不能憑一段文字替用户授予權限。 用户授權填寫本地表單,不等於允許上傳表單;腳本被打包進目錄,也不代表它應該無條件運行。運行時的權限和確認邊界仍然有效。
按需加載解決信息組織,不負責證明內容可信;代碼執行減少重複生成,也不負責證明代碼安全。複用之前檢查來源與行為,和使用時限制可訪問資源,是相互補充的工作,而不是二選一。
幾個關鍵問題,串起知識組織、加載與執行h2
Skill 與一段普通 Prompt,區別到底在哪裏?
區別不在於正文是不是自然語言,而在於它是否被組織為可發現、可加載、可維護的任務包。説明可以引用資源、指導腳本執行,並跨任務複用。把一段指令改名為 Skill,卻不説明適用範圍和使用路徑,並不會自動改善效果。
安裝了 Skill,模型是不是就學會了這項能力?
安裝只是讓應用能夠發現它。模型需要取得相關説明,並結合現有工具和環境完成任務;這不是更新模型權重。能力提升來自可用知識與執行資源,最終仍要通過任務表現驗證。
三層漸進加載是否意味着資源不會佔用 Context?
不是。未讀取的文件可以留在外部,已讀取內容與返回結果仍會佔用上下文。腳本可以運行而不回傳完整源碼,但輸出也需要篩選。收益來自有選擇地加載,不是資源變成了零成本。
為什麼不能只把觸發條件寫在正文裏?
因為選擇 Skill 時,模型可能還沒看到正文。名稱與描述需要提供足夠的適用範圍,正文再補充具體分支。否則再完整的操作流程,也可能在需要時沒有被選中。
有了確定的腳本,為什麼還要評估整個 Skill?
腳本測試驗證給定輸入下的程序行為,Skill 評估還要檢查是否選對任務、提供正確參數、處理失敗並核對產物。程序執行正確和 Agent 使用正確,是兩個層面。
Skill 可以代替 MCP,或者必須與 MCP 一起使用嗎?
都不是。Skill 組織操作知識,MCP 提供外部能力的連接方式。一個只用本地文件和 Python 的 Skill 不需要 MCP;一個業務 Skill 也可以指導 Agent 組合已有 MCP 工具。要分別檢查知識、接口和運行條件。
怎樣判斷一個 Skill 值得保留?
看它是否持續改善相關任務:遺漏更少、結果更可靠、重複操作更少,同時沒有增加明顯誤觸發或不必要動作。目錄更完整、提示詞更長、運行一次成功,都不能單獨作為依據。
Skill 的價值,是把任務經驗整理成可執行、可檢查、能反覆使用的方法:模型按任務取得知識,程序承擔適合固定實現的操作,結果再接受驗證。