Function Calling 工具定義怎麼寫:工具名稱、描述、參數與返回值設計提示詞(讓模型選對工具、填對參數)

給大模型接工具(Function Calling / Tool Use)時,模型老是該調用不調用、選錯工具或參數亂填時用:把你現有的接口或工具草稿貼進來,AI 逐個評審並重寫——名稱是否自解釋、描述有沒有說清何時用何時不用、參數類型與枚舉是否收緊、出錯時返回什麼能讓模型自己糾正。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
我在給一個大模型應用設計工具(Function Calling)。請評審並改寫下面的工具定義,目標是讓模型能選對工具、填對參數、在出錯時自行糾正。

應用場景:[應用場景]
現有工具定義或接口說明:
[現有工具定義]
觀察到的問題(沒有可寫「尚未上線」):[觀察到的問題]
使用的模型與平台:[模型與平台]

請按以下清單逐個工具檢查,並給出改寫後的完整定義(JSON Schema 形式):

一、工具集合層面
1. 工具之間職責是否重疊?名字相近、功能交叉的工具,模型很容易選錯;能合併的合併,不能合併的在描述裏寫明分界。
2. 粒度是否合適:是照搬後端的每個接口,還是按「用戶想完成的事」來組織?一個常見任務如果要連續調用四五個工具才能完成,考慮提供一個更高層的工具。
3. 數量是否過多;哪些工具可以只在特定場景才提供。

二、單個工具的名稱與描述
1. 名稱:動詞加對象,一眼能看出做什麼;同一套工具命名風格一致。
2. 描述要寫出:這個工具做什麼;什麼情況下應該用;什麼情況下不要用(改用哪個);有沒有副作用(會不會修改數據、發送消息、產生費用);返回什麼。
3. 描述是寫給模型看的說明文字,按「給一個新同事解釋這個工具」的詳細程度來寫,不要只有一個短語。

三、參數
1. 每個參數的類型、是否必填、含義、格式(如日期格式、時區、單位)和一個示例值。
2. 取值有限的用枚舉;數值給出範圍;不要用一個自由文本參數承載多個含義。
3. 參數名自解釋,避免 id、type、data 這類需要猜的名字;涉及標識符的,說明從哪裏獲得(例如「先調用搜索工具得到」)。
4. 模型無法知道的值(當前用戶、當前時間、權限)不要讓它填,由程序注入。

四、返回值與報錯
1. 只返回模型下一步需要的字段,去掉冗長的內部字段;列表結果要有數量上限和分頁方式。
2. 報錯訊息要能指導下一步:寫明哪裏不對、應該怎麼改(例如「日期格式應為 YYYY-MM-DD,你提供的是 3/5」),而不是隻返回錯誤碼。
3. 有副作用的工具:是否需要「預覽 / 確認」兩步,或提供只讀的試運行參數。

五、輸出
1. 問題清單:工具 | 問題 | 可能導致的現象 | 改法。
2. 改寫後的全部工具定義。
3. 配套的系統提示詞片段:用兩三句話說明這些工具的使用原則(何時該先查再改、何時該先問用戶)。
4. 10 條測試用的用戶請求:包含應調用單個工具的、需要連續調用的、不應調用任何工具的、參數資訊不全應先反問的,並寫出每條的預期行為。

各平台對工具定義的字段名和限制不完全相同,凡涉及平台特性的地方請標註「以該平台最新文檔為準」。

高亮處換成你自己的內容:[應用場景]、[現有工具定義]、[觀察到的問題]、[模型與平台]

ChatGPT Plus 充值

已被複製 0 次

使用說明

核心觀念:工具定義就是提示詞。模型決定「要不要調用、調用哪個、參數填什麼」時,唯一的依據是工具的名稱、描述和參數說明。很多團隊花大力氣打磨系統提示詞,工具描述卻只有一行,結果模型該調用時不調用,或者把兩個相近的工具用混。把工具當成要交給新同事的接口文檔來寫,效果往往比調系統提示詞更直接。

怎麼填變量:[現有工具定義] 直接貼 JSON;還沒寫的話貼後端接口說明也行。[觀察到的問題] 寫現象:「問天氣時不調用工具直接編」「訂單號經常填成手機號」「一次對話調用了八次搜尋」。[模型與平台] 用來提醒平台差異,具體的字段格式、是否支持嚴格模式、並行調用等,以對應平台的官方文檔為準。

常見問題與調整:

  • 該調用時不調用 → 多半是描述沒寫「什麼時候應該用」。讓它重點改寫這一句,並在系統提示詞裏說明哪類問題必須先查工具再回答。
  • 調用過於頻繁 → 檢查描述或系統提示詞裏是否有「拿不準就調用」「務必使用」這類話;改成有條件的說明。
  • 參數總是填錯 → 追問:「針對 order_id 參數,補充格式說明、示例值和『從哪裏獲得』,並設計一條能引導糾正的報錯訊息。」
  • 工具太多 → 追問:「按使用場景把工具分組,哪些可以按需加載?」

安全提醒:會修改數據、對外發送或產生費用的工具,不能只靠提示詞來約束,程序層面要做權限校驗和必要的人工確認;來自網頁、文檔等外部內容裏的指令不應觸發這類工具。

示例輸出

示例,僅供參考(原定義只有 name: "query" 和一句描述「查詢」;改寫後節選)
json
{
  "name": "search_orders",
  "description": "按條件搜尋當前登入用戶的訂單,返回最多 10 條摘要。用戶詢問訂單狀態、物流或想找某一筆訂單時使用。只讀,不會修改任何數據。需要訂單的完整明細時,用返回結果中的 order_id 再調用 get_order_detail。不要用它查詢其他用戶的訂單。",
  "parameters": {
    "type": "object",
    "properties": {
      "status": {
        "type": "string",
        "enum": ["pending_payment", "paid", "shipped", "completed", "refunded"],
        "description": "訂單狀態;不限定時省略此參數"
      },
      "created_after": {
        "type": "string",
        "description": "只返回此日期之後創建的訂單,格式 YYYY-MM-DD,例如 2026-09-01"
      }
    },
    "required": []
  }
}

問題清單(節選):原名稱 query 無法看出查的是什麼;沒有說明只能查當前用戶的訂單;沒有狀態枚舉,模型曾填入「已發貨」「shipped」「發貨中」三種寫法。

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~