昨天我們成功地端出了第一道 AI 料理 Hello, Kernel!
,感受到了 Semantic Kernel (SK) 的神奇之處。但你可能會有疑問:「這個 Kernel
物件到底是什麼?它為什麼能辦到這些事?」
如果說昨天的程式碼只是「看見」一位廚師完成了料理,那麼今天,我們就要深入他的內心,解剖他的「心臟」。
在 Semantic Kernel 的世界裡,Kernel
不僅僅是一個單純的類別實例。它更像是你整個 AI 應用程式的核心大腦與調度中心。它扮演著以下幾個關鍵角色:
Kernel
也負責管理你所有自訂的「工具」—也就是我們之後會詳細介紹的 Plugins。這就像是廚師的萬用刀具組,每把刀都有不同的用途。Kernel
的一個重要特性是它內部是一個簡易的 DI 容器。這意味著你可以向它註冊服務和外掛,讓它在需要時自動為你提供這些物件,保持程式碼的整潔與低耦合。當你呼叫 kernel.InvokePromptAsync(prompt)
時,這位廚師的心臟會啟動一系列的精密動作。讓我們用一張簡單的流程圖來想像這個過程:
InvokePromptAsync
。Kernel
會解析你的提示詞。如果裡面有變數(例如 {{$name}}
),它會用你傳入的參數來替換,產生最終要傳給 AI 的內容。Kernel
會根據你註冊的服務,選擇一個最適合的 AI 模型來處理這個請求。Kernel
會進行解析,取出有用的內容。FunctionResult
物件,並返回給你。整個過程對你來說是完全透明的,你只需要專注於最外層的呼叫,而不需要去煩惱複雜的網路請求或 JSON 解析。這就是 Kernel
作為一個中介層的價值所在!
在 ASP.NET Core 等現代框架中,我們通常會將 Kernel
註冊到 DI 容器裡。這裡有一個重要的最佳實踐:將 Kernel
註冊為 Transient
服務。
// 在你的 Startup.cs 或 Program.cs
builder.Services.AddTransient<Kernel>();
為什麼呢?這就像一位有潔癖的頂級廚師,每做一道新菜,都會換上全新的砧板和刀具。
Kernel
物件本身會持有 ChatHistory
或其他狀態。如果你把它註冊為 Singleton
(單例),那麼所有使用者都會共享同一個 Kernel
實例。這會導致以下問題:
Kernel
註冊了大量的 Plugins,所有使用者都會載入這些外掛,造成不必要的記憶體消耗。而 Transient
則保證了每次請求都會建立一個全新的 Kernel
實例,讓每次互動都是乾淨、獨立的,避免了狀態汙染,也更符合多使用者應用的設計。
今天我們深入了解了 Kernel
的內部運作原理,並學到了如何正確地管理它。接下來,既然我們已經懂了廚師的工作,明天就來好好研究他的「食譜」吧!我們將會探討提示詞的藝術與模板的使用方式,讓你的 AI 料理更具風味。不見不散!