# Function Calling (函數呼叫) 是什麼?AI 與程式碼連接標準定義
在人工智能大爆發的時代,Function Calling (函數呼叫 / 函數調用) 是大模型應用開發中最關鍵的 API 技術功能之一。
它解決了大模型開發最核心的問題:如何讓 AI 的輸出與傳統軟體代碼無縫、穩定地進行對接? 本文將為您詳細剖析 Function Calling 的定義、底層機制與安全調用規範。
Function Calling (函數呼叫) 是大語言模型 (LLM) API 中的一項標準功能,允許開發者向模型提交軟體函數的宣告(如函數名稱、描述及所需的 JSON 參數 Schema),並使模型能夠輸出符合該結構的 JSON 物件。它是實現 AI 與傳統軟體系統對接的底層協議。不同於生成模糊的文字,函數呼叫強制模型以 100% 結構化的格式輸出參數,從而讓開發團隊能夠無縫串接外部 API、觸發本地端代碼,並構建安全可控的自動化工作流。
---
Function Calling vs Tool Calling:有何不同?
在許多技術文件中,這兩個詞常被混用,但從軟體工程角度來看,它們的側重點有所不同:
- Tool Calling (工具呼叫):
- Function Calling (函數呼叫):
tools 與 tool_choice 欄位)。
---
Function Calling 的核心 API 機制
在調用大模型 API 時,開發者需要通過代碼定義一個「函數清單」。例如,一個計算貸款利息的函數:
{
"type": "function",
"function": {
"name": "calculate_loan_interest",
"description": "根據貸款本金、年利率與期數計算總利息",
"parameters": {
"type": "object",
"properties": {
"principal": { "type": "number", "description": "貸款本金 (台幣)" },
"interest_rate": { "type": "number", "description": "年利率 (例如 0.02 代表 2%)" },
"months": { "type": "integer", "description": "貸款期數 (月)" }
},
"required": ["principal", "interest_rate", "months"]
}
}
}
當用戶輸入:*「我想借 100 萬買房,年利率是 2.1%,分 240 期,幫我算一下利息」*。
大模型在收到上述 Schema 後,會精確地解析這段口語,並在 API 的 Response 中返回一個 tool_calls 物件,而不是一段文字:
{
"name": "calculate_loan_interest",
"arguments": "{\n \"principal\": 1000000,\n \"interest_rate\": 0.021,\n \"months\": 240\n}"
}
開發者可以直接用 JSON.parse() 解析這段 Arguments,並傳入後端的計算邏輯中。
---
️ Function Calling 的三大安全規範
在大規模商業部署中,Function Calling 是最容易受到「輸入污染」與越獄攻擊的地方,開發者必須實施以下安全規範:
1. 嚴格實施輸入驗證 (Input Validation):
絕對不能信任大模型產生的 JSON 參數。例如,大模型可能把 principal 設為負數 {"principal": -100000}。在後端執行函數前,必須先通過 JSON Schema 驗證或類型檢查(如 Pydantic、Zod)。
2. 防範執行注入 (Execution Injection):
如果你的函數是 run_shell_command(cmd),用戶可能通過 Prompt 注入惡意語意,使大模型輸出 {"cmd": "rm -rf /"}。嚴禁將 Function Calling 的參數直接拼接入 Shell 命令或 SQL 查詢中,必須使用參數化查詢與沙盒隔離執行。
3. 靈活配置 tool_choice 控制權:
* "auto":模型自己決定是否調用函數,還是用普通對話回答。
* "required":強制模型本次回答必須且只能調用其中一個函數(適合只用作參數提取器的冷啟動 API)。
* "none":強制模型不調用任何函數。