許多開發者在聽到 Semantic Kernel 是 Microsoft 開源的時後,會自然聯想到是不是只能搭配 OpenAI 或 Azure OpenAI,再加上許多教學或官方示範多數使用 OpenAI 或 Azure OpenAI,更加深覺得這工具就是專門為它們設計的。
是的,OpenAI的模型非常厲害,Semantic Kernel 和 Azure OpenAI 搭配起來也很方便,但今天我要帶大家來打破這個「迷思」:Semantic Kernel 不只支援 OpenAI 和 Azure,它還能跟 Hugging Face 一起玩得超級開心!
也許有部份開發者可能還不認識Hugging Face,會疑惑:「Hugging Face?那是什麼?另一個模型?能吃嗎?」(對不起,中秋節已過)。Hugging Face 是一個專門提供開源 AI 工具和模型的社群平台。在這個平台上有各種你想像得到的模型庫,從自然語言處理(NLP)到電腦視覺(CV),應有盡有。如果你在開發 AI 應用時需要現成的模型來進行訓練、微調或是直接使用,Hugging Face 就像是個超大的「模型超市」,從大模型到小模型裡面應有盡有,而 Hugging Face 本身也提供許多免費的服務。
使用方式也很容易,你只需要上 Hugging Face 官網註冊一個帳號,便能開始使用它。當你找到想要測試或試用的模型時,可以先透過 serverless 服務透過 Serverless Inference API 呼叫,便能開始試用。首先必須先取得 HuggingFace API Tokens,只要登入平台在右上角的個人圖象進入設定頁,便能找到 Access Tokens 選項,點選後便能建立 Token,每一個Token 可以依使用情境給予不同的權限。
首先專案除了原本必要安裝的 Semantic Kernel 套件外,為了連接 Hugging Face,所以需要再加上 Microsoft.SemanticKernel.Connectors.HuggingFace 套件,它是 Semantic Kernel 內建包含的 Hugging Face 連接器。
接者下來取得 IChatCompletionService 實作的類別,也是 Semantic Kernel 內建針對 HuggingFace Chat Completion 服務所提供的實作類別。接下來的程式碼就與先前使用 Azure OpenAI 完全一樣。
string model = "mistralai/Mistral-Nemo-Instruct-2407";
var kernel = Kernel.CreateBuilder()
.AddHuggingFaceChatCompletion(
endpoint: new Uri(Config.huggingface_endpoint), //https://api-inference.huggingface.co/
model: model,
apiKey: Config.huggingface_apiKey)
.Build();
var chatCompletion = kernel.GetRequiredService<IChatCompletionService>();
var chatHistory = new ChatHistory("You are a helpful assistant. respond to the user's questions with zh-tw language.");
chatHistory.AddUserMessage("世界最大的動物是什麼?");
Console.WriteLine(await chatCompletion.GetChatMessageContentAsync(chatHistory) + "\n\n");
/*生成結果
地球上最大的動物是藍鲸(Bystaurus),它们身長可達30公尺,重量超過180噸。
*/
接者下來取得 IImageToTextService 實作的類別,也是 Semantic Kernel 內建針對 HuggingFace ImageToText 服務所提供的實作類別。並且設定了 Prompt 執行參數,配置 MaxTokens 數為 500。
string imageToTextModel = "Salesforce/blip-image-captioning-base";
string imagePath = Path.Combine(Directory.GetCurrentDirectory(), "testimg.png"); //實驗圖
var kernel = Kernel.CreateBuilder()
.AddHuggingFaceImageToText(
model: imageToTextModel,
apiKey: Config.huggingface_apiKey)
.Build();
var imageToTextService = kernel.GetRequiredService<IImageToTextService>();
HuggingFacePromptExecutionSettings executionSettings = new()
{
MaxTokens = 500
};
接著將圖片以 byte[] 型式讀取進來,轉換成 ImageContent 類型,這是 Semantic Kernel 所定義的型別。就緒後,便可以呼叫 ImageToTextService 的 GetTextContentAsync方法,將圖片資料送給模型去分析,最後取得分析結果。
// Read image content from a file
ReadOnlyMemory<byte> imageData = await File.ReadAllBytesAsync(imagePath);
ImageContent imageContent = new(new BinaryData(imageData), "image/jpeg");
// Convert image to text
var textContent = await imageToTextService.GetTextContentAsync(
imageContent,
new HuggingFacePromptExecutionSettings() { MaxTokens = 500 });
// Output image description
Console.WriteLine(textContent.Text);
/*
生成結果
a robot standing in front of a network
*/
與 Hugging Face 搭配的最大好處就是靈活性。Hugging Face 上有數不清的開源模型,這表示你能夠輕鬆選擇最適合自己應用的模型。而且,這裡的模型有些可能比商業模型更具特定領域的專業性,例如醫療文本分析、法律文本生成等等。這樣的多樣性,可以讓你的應用更加專業化、個性化,而不僅僅依賴於特定的商業平台。
但別誤會,這並不代表取代或放棄 OpenAI 或 Azure OpenAI。有了 Hugging Face,這兩者完全可以並行!Semantic Kernel 支援多種模型來源,所以你可以根據需求選擇最適合的工具。今天想用 OpenAI 的 GPT-4,那就連接 OpenAI;明天想切換到 Hugging Face 上的 LLama 模型,也完全沒問題。就像選擇你今天要喝哪一杯咖啡,都是看心情的事。