如果說,我們前幾天學會的提示詞(Prompts)是 AI 廚師的食譜,那麼到目前為止,我們教的都只是「文字食譜」。但一個頂級廚師怎麼能只會讀文字?他還得能「看」!
今天,我們要為我們的 AI 廚師打開一扇新的窗戶,讓它不只會讀文字,還能處理圖片,甚至未來是聲音、影片等多種感官的輸入。這就是所謂的 多模態(Multi-modal) 應用。想像一下,你把一張照片放在廚師面前,問他:「這道菜是什麼?」他立刻就能回答你,是不是很酷?
在 Semantic Kernel 的世界裡,要讓 AI 看到圖片,我們需要引入一個新的食材:ImageContent
。
在過去,我們使用 ChatHistory
類別來儲存對話內容,並用 AddUserMessage()
來新增使用者的文字訊息。現在,我們可以直接在 AddUserMessage()
中,傳入包含 ImageContent
的訊息。這就像是把一份圖文並茂的菜單交給廚師,讓它能夠同時參考文字和圖片。
關鍵步驟:
ImageContent
物件。這個物件可以從圖片的 URL 創建,也可以從本機檔案的位元組陣列 (byte array) 創建。ChatHistory
: 將 ImageContent
物件,連同你的文字問題,一起放入 ChatHistory
中。接下來,讓我們用一段完整的程式碼,來展示如何實現這個「圖文並茂」的互動。在這個範例中,我們會使用一個支援多模態的 AI 模型(例如:Azure OpenAI 的 gpt-4o
或 gpt-4-vision-preview
),並傳送一張圖片給它,讓它描述圖片中的內容。
注意: 確保你的 AI 服務已經配置為支援多模態,並在 Kernel
中正確加入。
using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
// 假設你已經設定好 Kernel,並加入支援 Vision 的 AI 服務
// 以下的程式碼只展示 ChatHistory 的使用方式
var config = new ConfigurationBuilder()
.AddUserSecrets<Program>()
.Build();
var builder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: "gpt-4o-mini",
apiKey: config["OpenAI:ApiKey"]!);
var kernel = builder.Build();
// 建立一個新的 ChatHistory
var chatHistory = new ChatHistory();
// 準備圖片內容,這裡使用一個公開的圖片 URL
var imageUrl = "https://picsum.photos/200";
using var httpClient = new HttpClient();
var imageBytes = await httpClient.GetByteArrayAsync(imageUrl);
await File.WriteAllBytesAsync("image.jpg", imageBytes);
var imageContent = new ImageContent(imageBytes, "image/jpg");
// 將圖文訊息放入 ChatHistory
// 我們將圖片和文字作為一個完整的訊息傳送
chatHistory.AddUserMessage(
[
new TextContent("這張圖片裡有什麼?請詳細描述。"),
imageContent,
]);
// 使用 Kernel 呼叫 AI 服務
Console.WriteLine("使用者提問:這張圖片裡有什麼?(已附上圖片)");
try
{
var result = await kernel.GetRequiredService<IChatCompletionService>().GetChatMessageContentAsync(chatHistory);
Console.WriteLine($"AI 回覆:{result.Content}");
}
catch (Exception ex)
{
Console.WriteLine($"發生錯誤:{ex.Message}");
Console.WriteLine("請確認您的 AI 模型是否支援 Vision,以及 API 金鑰是否正確。");
}
這段程式碼是不是很直觀?我們只需要將 ImageContent
和文字訊息一起包裝成一個 ChatMessageContent
,然後傳入 ChatHistory
,後續的處理就交給 Semantic Kernel 和 AI 模型了。它會自動解析這些不同類型的內容,並生成一個完整的、結合了視覺和文字的答案。
今天我們解鎖了 AI 的「視覺」能力,讓它不再是個只會讀書的書呆子,而是個能觀察世界的實習生。透過 ImageContent
和 ChatHistory
的完美搭配,我們可以輕鬆地打造出更具互動性、能處理真實世界複雜資料的 AI 應用。
明天,我們的旅程將進入下一個令人興奮的階段:主廚的私房菜。我們將深入探討如何使用更強大的 Handlebars 模板引擎,來打造那些複雜到超乎你想像的提示詞!準備好你的味蕾,因為明天的菜色會更精緻!