🧮iOS 本地 AI:Foundation Models 的 Tool Calling,真正的問題是什麼時候該用
語言模型雖然有很多知識,但沒有即時資訊,也不擅長數學計算。如果需要存取模型以外的資訊或運算,我們可以提供呼叫外部的工具。不過,重點是判斷什麼情況才該使用。
Foundation Models framework 跟大多成熟的 LLM 工具一樣,具有呼叫外部工具的能力,而且實作起來很容易,甚至能令人不假思索地便開始使用。
但是我想說的是,並不是所有情況都需要使用外部工具。我們應該先考慮能否用一般的方式來存取資訊、運算,只有在必要時才對語言模型進行工具的整合。
在這篇文章中,我會先示範工具呼叫的語法,再回頭來談什麼時候適合使用這項機制。
以取得當地天氣的工具為例
你可以把以下的程式碼範例新增並貼到 Tool Calling - Weather.swift 檔案中。
import FoundationModels
import Playgrounds
@Generable
private struct WeatherCondition {
var temperature: Double
var chanceOfRain: Double
var humidity: Double
}
private struct WeatherConditionTool: Tool {
let name = "weatherCondition"
let description = "Get current weather conditions for a location"
@Generable
struct Arguments {
let locationName: String
}
func call(arguments: Arguments) async throws -> some PromptRepresentable {
// 示範用的假資料。實際上這裡可能會呼叫外部 API
let weatherCondition = WeatherCondition(
temperature: 16,
chanceOfRain: 0.3,
humidity: 0.7,
)
return weatherCondition
}
}
#Playground {
let session = LanguageModelSession(
tools: [WeatherConditionTool()], // 模型會根據語意來判斷需要天氣資料,而自動呼叫工具
instructions: "描述當地天氣資訊"
)
let response = try await session.respond(to: "全糖市")
print(response.content) // "目前全糖市的氣溫是16度,有30%的機會會下雨,濕度是70%。"
let transcript = session.transcript // 顯示 session 呼叫過程
}
這個範例宣告了 WeatherConditionTool 的工具型別。要滿足 Tool protocol,必須實作 name、description、call(arguments: Arguments) 以及一個 @Generable struct Arguments。
顧名思義,name 與 description 是以文字提示的形式告訴模型工具的用途。Arguments 是模型會丟給工具的參數,使用我們已經很熟悉的 @Generable macros。而最重要的工具實作功能,就是在 func call() 完成。
在我的範例中,是直接回傳一個固定的假天氣資料。實際上,這邊應該會是去呼叫外部的資訊來源,例如 WeatherKit API。
建立好這個 Tool 以後,我們要在 LanguageModelSession 建立時,就放入tools: [WeatherConditionTool()] 參數。在整個 session 過程中,遇到有需要的任務指示,模型會自動判斷要不要使用對應的工具。
什麼情況需要 Tool Calling
第一次接觸 Tool Calling 機制,你可能會覺得很合理,甚至會想到可以做很多工具來給模型使用。
但是有些 Tool 在真正的 App 開發流程中,沒有太大的必要。比如上述的例子中,取得當地天氣 API 的輸入參數,其實不需要先被語言模型解析才能獲得,使用 Core Location 取得 GPS 座標做為參數更實際。
而且另一方面,一旦我們宣告了 Tool,就會佔用當前 session 一部分的記憶空間,官方文件也建議限制工具在 3~5 個以內(之後我會專文探討 context window),所以外部工具不是免費與萬能的。
那麼,什麼情況才適合使用 Tool 呢?