Function Calling:讓 LLM 呼叫外部 API

RAG 讓 AI 能「讀資料」,但現實中更多工作需要它執行動作:查天氣、訂機票、查庫存、算匯率。這些都在外部系統裡,模型本身做不到。

Function Calling(函式呼叫) 解決這件事:你可以定義一些工具給模型,當它判斷需要時,會回傳「要呼叫哪個函式、參數是什麼」,由你的程式去執行。

為什麼需要 Function Calling?

LLM 訓練完的那一刻,知識就停止了。它不知道:

  • 台北現在幾度
  • 某支股票現在的價格
  • 資料庫裡這個帳號的訂單狀態

但它可以呼叫你提供的函式拿到這些即時資訊,再據此回答。這讓 AI 從「只會聊天」變成「能做事的助理」。

運作原理:一次來回

Function Calling 不是模型自己跑程式,而是兩方配合

  1. 使用者提問:「台北今天天氣如何?」
  2. 模型判斷需要天氣資料,回傳一個結構化請求:{"function": "get_weather", "args": {"city": "Taipei"}}
  3. 你的程式收到這個請求,去執行真正的 get_weather API,拿到結果(例如 28°C 晴)。
  4. 你把結果回給模型。
  5. 模型用真實資料組織成自然語言回答:「台北今天約 28 度,天氣晴朗。」

重點:模型只負責決定「要調哪個工具、參數多少」,實際執行是你的程式。

怎麼定義一個工具?

你需要用 JSON Schema 描述這個函式,讓模型知道有哪些參數、什麼類型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"type": "function",
"function": {
"name": "get_weather",
"description": "取得指定城市目前的天氣",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名稱,例如 Taipei、Tokyo"
}
},
"required": ["city"]
}
}
}

完整實作(Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import os, json
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

# 你的真實工具:實際去呼叫天氣 API
def get_weather(city):
# 這裡換成真正的 API 呼叫
return f"{city} 現在 28°C,晴"

tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "取得指定城市目前的天氣",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名稱"}
},
"required": ["city"]
}
}
}]

# 第一步:送出問題與工具定義
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "台北今天適合出門嗎?"}],
tools=tools,
)

message = response.choices[0].message

# 模型決定要呼叫工具
if message.tool_calls:
for call in message.tool_calls:
args = json.loads(call.function.arguments)
# 第二步:你的程式執行真實函式
result = get_weather(**args)
# 第三步:把結果回給模型
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result
})
# 第四步:讓模型根據實資組織回答
final = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages
)
print(final.choices[0].message.content)

實際應用場景

  • 查即時資訊:天氣、股價、交通、匯率。
  • 操作資料庫:查詢訂單、用戶資料後作答。
  • 觸發動作:寄郵件、建立 ticket、發送通知。
  • 計算器/程式碼執行:讓模型呼叫計算工具,避免算錯。
  • 結合 RAG:RAG 給「讀」的能力,Function Calling 給「做」的能力,兩者常一起用。

注意事項

  • 驗證參數:模型可能傳入錯誤或惡意參數,執行前務必檢查。
  • 安全邊界:不要給模型能刪除資料、付款等高危工具的未經審查存取。
  • 網路延遲:每次工具來回都是一次等待,多輪工具會變慢。
  • 成本:每調一次工具就多一次請求,注意 token 累積。

小結

  • Function Calling = 定義工具讓模型決定何時呼叫,你的程式負責實際執行
  • 流程:問 → 模型回傳工具請求 → 你執行 → 回結果 → 模型組織回答
  • 用 JSON Schema 描述函式參數。
  • 結合 RAG 與 Agent,就能打造能「讀又能做」的完整助理。

學會單個工具後,下一篇我們玩更大的:用 Ollama 在自己的電腦本地部署大模型,完全離線、免費、隱私。


《AI 新時代》系列第 07 篇。上一篇:RAG · 下一篇預告:Local LLM