iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0

如果說,我們前幾天學會的提示詞(Prompts)是 AI 廚師的食譜,那麼到目前為止,我們教的都只是「文字食譜」。但一個頂級廚師怎麼能只會讀文字?他還得能「看」!

今天,我們要為我們的 AI 廚師打開一扇新的窗戶,讓它不只會讀文字,還能處理圖片,甚至未來是聲音、影片等多種感官的輸入。這就是所謂的 多模態(Multi-modal) 應用。想像一下,你把一張照片放在廚師面前,問他:「這道菜是什麼?」他立刻就能回答你,是不是很酷?


如何讓 AI 看到圖片?

在 Semantic Kernel 的世界裡,要讓 AI 看到圖片,我們需要引入一個新的食材:ImageContent

在過去,我們使用 ChatHistory 類別來儲存對話內容,並用 AddUserMessage() 來新增使用者的文字訊息。現在,我們可以直接在 AddUserMessage() 中,傳入包含 ImageContent 的訊息。這就像是把一份圖文並茂的菜單交給廚師,讓它能夠同時參考文字和圖片。

關鍵步驟:

  1. 準備圖片: 你需要將圖片轉換為 ImageContent 物件。這個物件可以從圖片的 URL 創建,也可以從本機檔案的位元組陣列 (byte array) 創建。
  2. 放入 ChatHistoryImageContent 物件,連同你的文字問題,一起放入 ChatHistory 中。

實戰範例:讓 AI 描述一張照片

接下來,讓我們用一段完整的程式碼,來展示如何實現這個「圖文並茂」的互動。在這個範例中,我們會使用一個支援多模態的 AI 模型(例如:Azure OpenAI 的 gpt-4ogpt-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 模型了。它會自動解析這些不同類型的內容,並生成一個完整的、結合了視覺和文字的答案。


Day 14 總結

今天我們解鎖了 AI 的「視覺」能力,讓它不再是個只會讀書的書呆子,而是個能觀察世界的實習生。透過 ImageContentChatHistory 的完美搭配,我們可以輕鬆地打造出更具互動性、能處理真實世界複雜資料的 AI 應用。

明天,我們的旅程將進入下一個令人興奮的階段:主廚的私房菜。我們將深入探討如何使用更強大的 Handlebars 模板引擎,來打造那些複雜到超乎你想像的提示詞!準備好你的味蕾,因為明天的菜色會更精緻!

完整程式碼範例


上一篇
Day 13: 當季特選:Text Search 抽象化你的 RAG 流程
下一篇
Day 15: 主廚的私房菜:使用 Handlebars 打造複雜的提示詞模板
系列文
AI 全餐,好吃嗎?用 Semantic Kernel 打造你的客製化滿漢全席!21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言