iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0

昨天我們深入探索了 Kernel 這位頂級廚師的心臟。今天,我們不急著切菜下鍋,而是要來研究最關鍵的東西 — 食譜

在 AI 的世界裡,這個食譜就是我們與 AI 溝通的魔法咒語,它的正式名稱叫做提示詞 (Prompt)。好的提示詞,就像一份米其林星級的食譜,能引導 AI 創作出令人驚豔的料理;而糟糕的提示詞,則可能讓 AI 煮出黑暗料理,甚至交出白卷。

提示詞工程:不只是輸入,更是藝術!

提示詞工程 (Prompt Engineering) 的核心,就是學習如何精準地與 AI 溝通。這不再只是輸入一個問題,而是要思考如何透過清晰、具體的指令,引導 AI 產生你想要的結果。

例如,你問 AI:「幫我寫一首詩。」AI 可能會給你一首平淡無奇的詩。但如果你說:「請用一位浪漫主義詩人的風格,為春天的雨後景象寫一首五言絕句,內容需包含新芽與泥土的氣味。」這道指令就具體得多,AI 也能更精準地掌握你的意圖,寫出更有質感的作品。


Semantic Kernel 的食譜語法

為了讓你的食譜更具彈性,Semantic Kernel 提供了內建的提示詞模板語法,讓你可以輕鬆地在提示詞中插入變數和動態內容。這就像是食譜上的 {{鹽}}{{糖}},可以讓你根據個人口味調整用量。

1. 變數 {{$variable}}

最常見的變數是 {{$input}},它代表使用者提供的主要輸入內容。

範例食譜 (prompt.txt)

{{$input}}

程式碼

var kernel = builder.Build();
var prompt = kernel.CreateFunctionFromPrompt("請將以下文字翻譯成繁體中文:\n\n{{$input}}");

var result = await kernel.InvokeAsync(prompt, new() { ["input"] = "Hello world, this is a sunny day." });
Console.WriteLine(result.ToString());

當你執行這段程式碼時,{{$input}} 會被自動替換成 "Hello world, this is a sunny day.",最終產生的完整提示詞將是:「請將以下文字翻譯成繁體中文:\n\nHello world, this is a sunny day.」。

你也可以定義自己的變數,例如 {{$language}},來讓提示詞更加通用。

2. 函式呼叫 {{plugin.function}}

這是 SK 模板語法中最迷人的地方。你可以在提示詞中直接呼叫已經註冊好的函式(Plugins)。

範例食譜 (skprompt.txt)

我需要一份關於 {{request}} 的報告。
報告的字數請限制在 {{word_count}} 字以內。

請開始撰寫:

你可以建立一個 ResearchPlugin,裡面有一個 GetInformation 的函式。在提示詞中,你可以這樣設計:

請根據以下資訊,總結出重點:

資訊來源:{{ResearchPlugin.GetInformation}}

當你執行這個提示詞時,Kernel 會先暫停,執行 ResearchPlugin.GetInformation 這個函式,然後將函式的回傳值插入到提示詞中,再將完整的內容發送給 AI。這實現了一個強大的概念:AI 不只會思考,它還會主動去調用工具來獲取資訊,再進行創作。 我們在後續文章中會詳細討論這個神奇的機制!


將食譜結構化:用 YAML 讓你的提示詞更清晰

當你的提示詞越來越複雜時,把它們寫在程式碼裡會變得很難管理。這時,我們就可以用 YAML 格式來將提示詞獨立出來。這就像是把你的食譜卡片從記事本裡抽出來,單獨歸檔。

一個簡單的提示詞 YAML 檔案 joke.prompt.yaml 看起來會是這樣:

template: "Tell a joke about {{$input}}."
description: "Generates a joke based on the input."
input_variables:
  - name: "input"
    description: "The topic for the joke."
    is_required: true
execution_settings:
  default:
    temperature: 1

小撇步:將 template_format 設為 semantic-kernel,可以確保 SK 能正確解析你使用的語法。

在程式碼中,你只需要簡單地載入這個檔案,就可以使用這個提示詞了,讓你的程式碼更乾淨,提示詞也更易於維護和版本控制。

var kernel = builder.Build();
var jokeFunction = kernel.CreateFunctionFromPromptYaml(File.ReadAllText("joke.prompt.yaml"));

var result = await kernel.InvokeAsync(jokeFunction, arguments: new() { { "input", "IT工程師" } });
Console.WriteLine(result);

恭喜你,今天我們學會了如何設計一份專業的 AI 食譜。有了好的食譜,下一步我們就要為這位廚師打造專屬的「刀具組」,讓他能真正動手解決問題。

明天,我們將正式介紹 Plugins 這個強大的概念,以及如何用它來擴展 AI 的能力!敬請期待!


完整程式碼範例


上一篇
Day 4: 廚師的心臟:深入理解 Kernel 的核心角色
下一篇
Day 6: 廚師的刀具組:初探 Plugins,讓你的 AI 不再空談
系列文
AI 全餐,好吃嗎?用 Semantic Kernel 打造你的客製化滿漢全席!8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言