iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0

昨天我們成功地端出了第一道 AI 料理 Hello, Kernel!,感受到了 Semantic Kernel (SK) 的神奇之處。但你可能會有疑問:「這個 Kernel 物件到底是什麼?它為什麼能辦到這些事?」

如果說昨天的程式碼只是「看見」一位廚師完成了料理,那麼今天,我們就要深入他的內心,解剖他的「心臟」。

Kernel:不只是個物件,它是廚房的總指揮!

在 Semantic Kernel 的世界裡,Kernel 不僅僅是一個單純的類別實例。它更像是你整個 AI 應用程式的核心大腦調度中心。它扮演著以下幾個關鍵角色:

  • 中央服務台:所有你註冊的 AI 服務 (如 OpenAI 或 Gemini) 都會被它統一管理。這就像是廚房裡一個巨大的白板,上面記錄了所有可用的爐子、烤箱和微波爐,廚師可以隨時調用。
  • 工具箱總管:除了 AI 服務,Kernel 也負責管理你所有自訂的「工具」—也就是我們之後會詳細介紹的 Plugins。這就像是廚師的萬用刀具組,每把刀都有不同的用途。
  • 依賴注入容器 (DI Container):對於軟體工程師來說,Kernel 的一個重要特性是它內部是一個簡易的 DI 容器。這意味著你可以向它註冊服務和外掛,讓它在需要時自動為你提供這些物件,保持程式碼的整潔與低耦合。

Kernel 的工作流程圖解

當你呼叫 kernel.InvokePromptAsync(prompt) 時,這位廚師的心臟會啟動一系列的精密動作。讓我們用一張簡單的流程圖來想像這個過程:
https://ithelp.ithome.com.tw/upload/images/20250918/20168312H6sTOlSIs5.png

  1. 接收請求:你將提示詞傳給 InvokePromptAsync
  2. 渲染提示詞Kernel 會解析你的提示詞。如果裡面有變數(例如 {{$name}}),它會用你傳入的參數來替換,產生最終要傳給 AI 的內容。
  3. 選擇服務Kernel 會根據你註冊的服務,選擇一個最適合的 AI 模型來處理這個請求。
  4. 發送請求:它會處理所有底層的 HTTP 呼叫,將渲染好的提示詞送給 AI 服務。
  5. 處理回應:當 AI 模型返回 JSON 格式的回應時,Kernel 會進行解析,取出有用的內容。
  6. 返回結果:最後,它會將這個結果包裝成 FunctionResult 物件,並返回給你。

整個過程對你來說是完全透明的,你只需要專注於最外層的呼叫,而不需要去煩惱複雜的網路請求或 JSON 解析。這就是 Kernel 作為一個中介層的價值所在!


為什麼 Kernel 建議用 Transient 服務?

在 ASP.NET Core 等現代框架中,我們通常會將 Kernel 註冊到 DI 容器裡。這裡有一個重要的最佳實踐:Kernel 註冊為 Transient 服務

// 在你的 Startup.cs 或 Program.cs
builder.Services.AddTransient<Kernel>();

為什麼呢?這就像一位有潔癖的頂級廚師,每做一道新菜,都會換上全新的砧板和刀具。

Kernel 物件本身會持有 ChatHistory 或其他狀態。如果你把它註冊為 Singleton (單例),那麼所有使用者都會共享同一個 Kernel 實例。這會導致以下問題:

  • 狀態汙染:使用者 A 的對話歷史可能會混入使用者 B 的請求中,導致 AI 給出錯誤或混亂的回應。
  • 資源浪費:如果你為 Kernel 註冊了大量的 Plugins,所有使用者都會載入這些外掛,造成不必要的記憶體消耗。

Transient 則保證了每次請求都會建立一個全新的 Kernel 實例,讓每次互動都是乾淨、獨立的,避免了狀態汙染,也更符合多使用者應用的設計。


今天我們深入了解了 Kernel 的內部運作原理,並學到了如何正確地管理它。接下來,既然我們已經懂了廚師的工作,明天就來好好研究他的「食譜」吧!我們將會探討提示詞的藝術與模板的使用方式,讓你的 AI 料理更具風味。不見不散!


上一篇
Day 3: 第一道菜 - Hello, Kernel! 你的第一個 AI 應用
下一篇
Day 5: 食材的藝術:什麼是提示詞 (Prompts) 與模板?
系列文
AI 全餐,好吃嗎?用 Semantic Kernel 打造你的客製化滿漢全席!8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言