<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Interface on KbWen Blog</title>
    <link>https://www.kbwen.com/tags/interface/</link>
    <description>KbWen 的個人技術部落格，分享 Python、機器學習、深度學習、資料工程與 AI 開發的學習筆記與實作心得。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <image>
      <url>https://www.kbwen.com/images/og-default.png</url>
      <title>KbWen Blog</title>
      <link>https://www.kbwen.com/</link>
    </image>
    
    <lastBuildDate>Mon, 25 May 2026 13:00:00 +0800</lastBuildDate><atom:link href="https://www.kbwen.com/tags/interface/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Skill 邊界設計:從能力到合約</title>
      <link>https://www.kbwen.com/skill-boundary-design/</link>
      <pubDate>Mon, 25 May 2026 13:00:00 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/skill-boundary-design/</guid>
      <description>一個 skill 會多可預測,大概就看它的邊界劃得多清楚。把它當能力清單,它會亂跑;把它當合約(講好輸入、輸出、不碰什麼),它就比較像一個設計良好的 API。</description>
      <content:encoded><![CDATA[<blockquote>
<p><strong>TL;DR:</strong> 一個 skill 會多可預測,大概就看它的邊界劃得多清楚。把它當成「能力」(這個 skill 讓 AI 會做 X),它容易亂跑;把它當成「合約」(講好輸入、輸出、以及它不會碰什麼),它就比較像一個設計良好的 API。重點不是寫更多「要小心」,而是把它能碰的範圍框住。</p>
</blockquote>
<hr>
<p>我有個 skill,前一天還用得好好的,隔天就開始亂搞:我要它做 A,它順手把旁邊的 B 也「幫我」改了。我第一個反應是怪模型今天狀況不好。後來才想通,問題在我自己——當初寫這個 skill 的時候,我只說了它「會做什麼」,沒說它「不能碰什麼」。</p>
<p>這是<a href="/skill-design-as-interface-design/">英文版</a>的中文對照,英文那篇用 API 設計的角度談;這篇是我自己怎麼從「能力」這個想法,慢慢搬到「合約」這個想法的過程。</p>
<h2 id="能力清單-vs-合約">能力清單 vs 合約</h2>
<p>我們很習慣用「能力」來描述一個 skill:「這個 skill 讓 AI 會跑測試」「這個會幫我部署」。這種講法很自然,也很容易讓你之後被嚇到。因為「會跑測試」這句話沒有邊。它沒講會讀什麼、會動什麼、遇到不在預期內的狀況時會怎麼處理。</p>
<p>合約天生就有邊。它講清楚什麼東西進去、什麼東西出來、以及哪些地方它不會碰。框架文件裡有一句講得比我直接:skill 應該被當成「有版本、受政策約束、能力被框住的封裝」,而不是「一堆鬆散的 prompt 檔」。這跟<a href="/what-makes-an-ai-skill-different-from-a-prompt/">一個 AI Skill 和 Prompt 到底差在哪</a>講的是同一件事:重點不是 AI「能」做那件事,而是那件事被「講清楚」了。</p>
<h2 id="合約先行先想清楚它不該做什麼">合約先行:先想清楚它不該做什麼</h2>
<p>我看過一個還算貼切的比喻:skill 像是你交給一位很強的廚師的食譜。食譜提供的是結構:材料、順序、限制;廚師提供的是判斷,什麼時候醬汁該再收一下、什麼時候可以換個材料。你不會因為廚師很強,就把食譜寫成「做一道好吃的菜」。</p>
<p>skill 也一樣。模型本身的判斷力很好,所以你要補的不是判斷,是結構。而結構裡最常被漏掉的,就是那條「不要碰」的線。我現在寫一個 skill,會先問自己一個問題:<strong>這個 skill 最不該做的事是什麼?</strong> 把那條線寫進去,比再多寫三條「請謹慎處理」都有效。</p>
<h2 id="邊界鬆掉其實是一次沒講的破壞性變更">邊界鬆掉,其實是一次沒講的破壞性變更</h2>
<p>框架裡有一個原則我覺得很受用:<strong>寧可在邊界上把關,也不要去微管模型怎麼想</strong>。一個會亂跑的 skill,你通常修不好它的「想法」;你能做的是把它能碰的範圍(哪些檔案、哪些工具、多少預算)框起來。</p>
<p>一個 skill 的範圍如果隨著時間悄悄變大,那其實是你發佈了一次「破壞性變更」卻沒有改版本號。而呼叫它的人(就是你自己)會用最經典的方式發現這件事:在出事的時候。這也是<a href="/ai-agent-common-pitfalls-and-fixes/">AI 代理常見痛點</a>裡那個「能力邊界」缺口最貴的一種表現形式。範圍,只是它最容易爆出來的地方。</p>
<h2 id="我把一個-skill-從能力改成合約的前後">我把一個 skill 從能力改成合約的前後</h2>
<p>回到開頭那個亂改 B 的 skill。它原本的描述大概是「整理這個模組的程式碼」。很開放,聽起來很厲害,結果就是它對「整理」的理解跟我不一樣。</p>
<p>我後來把它改寫成比較像合約的樣子:輸入是「指定的那幾個檔案」,輸出是「格式化後的同一批檔案 + 一份它改了什麼的清單」,然後明確寫上「不要新增或刪除檔案、不要碰指定範圍以外的東西」。改完之後它沒有變笨,只是不再自作主張。差別不在能力,在邊界。</p>
<p>順帶一提,邊界清楚的 skill 通常也比較便宜。skill 是漸進載入的:AI 先讀那一小段 metadata 判斷現在用不用得上,真的要用才載入完整內容。一個邊界小而清楚的 skill,光看它的「合約」就能被快速略過;一個什麼都做的 skill,得把整包拖進 context 才發現其實不該用它。這跟我在 <a href="/token-cost-and-budget-tiers/">Token 成本</a>那篇講的是同一個方向:清楚的小合約,既好預測也比較省。</p>
<h2 id="還在摸索">還在摸索</h2>
<p>老實說,一個 skill 該有的合約長什麼樣,我很少一開始就想對。通常是看它在哪裡越界,再把線畫在那裡。但這個框架本身,先講好它承諾什麼、它不碰什麼,然後把對這兩者的任何更動都當成一次正式的改版,到目前為止站得住。</p>
<p><em>Agentic OS 是開源專案:<a href="https://github.com/KbWen/agentic-os">github.com/KbWen/agentic-os</a></em></p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
