iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0

如果說之前的互動都只是在跟 AI「聊天」,那 Function Calling 就是賦予 AI「行動」能力的魔法。它讓我們的 AI 不再只是一個會說話的腦袋,而是真正能捲起袖子、走進廚房、拿起鍋鏟為我們解決問題的得力助手。這道菜,絕對是整場盛宴的 C 位!

幕後解密:Function Calling 的神奇烹飪流程

當我們啟用 Function Calling 時,SK 廚房裡其實正在上演一齣分工精密的歌舞劇。整個流程就像是客人點餐,聰明的服務生(LLM)判斷菜色,再交由廚房(你的程式碼)製作,最後送上桌的完整循環。

根據官方食譜,這個神奇的流程可以拆解成以下幾個步驟 :

  1. 序列化菜單 (Serialize functions):首先,主廚 SK 會把你廚房裡所有的刀具(也就是你提供的 Plugins 裡的函式)和它們的使用說明(參數、描述),整理成一份 AI 能看懂的精美菜單(JSON Schema) 。
  2. 遞送菜單與訂單 (Send messages and functions to the model):當客人(使用者)提出需求時(例如:「我想訂個披薩!」),SK 會將客人的需求(聊天歷史)和剛剛那份精美的菜單,一起遞給我們最聰明的服務生——大型語言模型 (LLM) 。
  3. 服務生的大腦 (Model processes the input):服務生 (LLM) 看完客人需求和菜單後,會開始思考。它可能會發現:「嗯?客人想訂披薩,但沒說要什麼尺寸和配料啊!」這時,它會決定先回頭問客人,而不是直接下單給廚房 。如果資訊充足,它就會決定要「呼叫」哪個廚房裡的函式 。
  4. 解析訂單 (Handle the response):SK 接收到服務生的決定。如果只是單純回話,就直接傳回給客人。但如果服務生決定要呼叫函式(例如:add_pizza_to_cart),SK 就會精準地解析出函式名稱和需要的參數 。
  5. 廚房開火 (Invoke the function):SK 拿著解析好的訂單,跑到對應的爐台(你的 C# 程式碼),呼叫 add_pizza_to_cart 這個函式,並把客人指定的尺寸、配料等參數傳進去 。
  6. 回報進度 (Return the function result):函式執行完畢後,會回傳一個結果(例如:「披薩已成功加入購物車」)。SK 會把這個執行結果加回到對話歷史中,再次遞給服務生 (LLM),告訴他:「第一道菜做好了,接下來呢?」

這個

「模型思考 → SK 執行 → 回報結果 → 模型再思考」 的循環會不斷進行,直到滿足客人的所有需求,服務生 (LLM) 才會給出最終的總結性回覆 。

經典菜色實演:來訂一份 AI 披薩!

光說不練假把戲,我們直接來看一個經典的「訂披薩」範例,感受一下 AI 是如何自主決定呼叫哪個函式的。

假設我們有一個

OrderPizzaPlugin,裡面有一個函式 AddPizzaToCart

public class OrderPizzaPlugin
{
    [KernelFunction("add_pizza_to_cart")]
    [Description("將指定口味與尺寸的披薩加入使用者的購物車")]
    public async Task<string> AddPizzaToCartAsync(
        [Description("披薩的尺寸,例如:大、中、小")] string size,
        [Description("披薩的配料清單")] List<string> toppings
    )
    {
        // 實際將披薩加入購物車的商業邏輯...
        var result = $"已將一個{size}尺寸,包含 {string.Join(", ", toppings)} 配料的披薩加入購物車。";
        Console.WriteLine($"[執行 add_pizza_to_cart]: {result}");
        return result;
    }
}

現在,讓我們來看看使用者、AI (Assistant) 和工具 (Tool/Plugin) 之間的互動:

  1. 使用者: "你好,我想訂一個披薩。"

  2. AI (Assistant): (看了一下 add_pizza_to_cart 的菜單,發現 sizetoppings 是必填的 ) "當然!請問您需要什麼尺寸和配料呢?"

  3. 使用者: "我要一個大的,配料有義式臘腸和蘑菇。"

  4. AI (Assistant): (太好了,資訊都齊了!可以下單給廚房了!)
    (送往 SK 的內部請求):

    tool_calls: [ { "function": { "name": "OrderPizza-add_pizza_to_cart", "arguments": "{\"size\": \"大\", \"toppings\": [\"義式臘腸\", \"蘑菇\"]}" } } ]

  5. 工具 (Tool): (SK 收到請求,執行 C# 程式碼 AddPizzaToCartAsync)
    (函式回傳結果):
    tool_result: "已將一個大尺寸,包含 義式臘腸, 蘑菇 配料的披薩加入購物車。"

  6. AI (Assistant): (看到廚房回報成功了,給客人一個最終回覆) "好的,您的大尺寸義式臘腸蘑菇披薩已經成功加入購物車了!還需要什麼嗎?"

看到了嗎?AI 就像一個真正聰明的店員,它會主動引導對話,收集必要的資訊,然後才去執行對應的動作。這就是 Function Calling 的魅力所在!

平行函式呼叫:當客人一次點好幾道菜

現代的 LLM 越來越厲害,它們甚至可以在一次思考中,決定要同時呼叫多個函式!這就像客人一次點了主餐、湯和飲料,聰明的服務生會把訂單分開,讓廚房、吧檯可以同時準備,大大提升了效率 。

例如,當使用者說:「幫我查一下臺北的天氣,並訂一張明天去高雄的高鐵票。」

AI 可能會同時發出兩個函式呼叫請求:一個給

WeatherPluginGetWeather,另一個給 HSRPluginBookTicket。SK 就會並行處理這兩個請求,讓整個流程更加順暢快速 。

小結

今天我們品嚐了 Function Calling 這道令人驚豔的招牌絕活,它徹底改變了我們與 AI 的互動方式。透過這個強大的功能,我們的 AI 不再只是個聊天機器人,而是能串連起各種服務、執行複雜任務的智能代理 (Agent)。

明天,我們將繼續深入這道主菜,探討如何更精準地控制 AI 的「出菜策略」,也就是 Function Calling 的進階選項 (Behaviors)。

各位夥伴,今天的料理還滿意嗎?記得動手試試看,打造你自己的 AI 主廚!我們明天見!


完整程式碼範例


上一篇
Day 7: 聊天的記憶:用 ChatHistory 讓對話有溫度
系列文
AI 全餐,好吃嗎?用 Semantic Kernel 打造你的客製化滿漢全席!8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言