昨天我們深入探索了 Kernel
這位頂級廚師的心臟。今天,我們不急著切菜下鍋,而是要來研究最關鍵的東西 — 食譜。
在 AI 的世界裡,這個食譜就是我們與 AI 溝通的魔法咒語,它的正式名稱叫做提示詞 (Prompt)。好的提示詞,就像一份米其林星級的食譜,能引導 AI 創作出令人驚豔的料理;而糟糕的提示詞,則可能讓 AI 煮出黑暗料理,甚至交出白卷。
提示詞工程 (Prompt Engineering) 的核心,就是學習如何精準地與 AI 溝通。這不再只是輸入一個問題,而是要思考如何透過清晰、具體的指令,引導 AI 產生你想要的結果。
例如,你問 AI:「幫我寫一首詩。」AI 可能會給你一首平淡無奇的詩。但如果你說:「請用一位浪漫主義詩人的風格,為春天的雨後景象寫一首五言絕句,內容需包含新芽與泥土的氣味。」這道指令就具體得多,AI 也能更精準地掌握你的意圖,寫出更有質感的作品。
為了讓你的食譜更具彈性,Semantic Kernel 提供了內建的提示詞模板語法,讓你可以輕鬆地在提示詞中插入變數和動態內容。這就像是食譜上的 {{鹽}}
和 {{糖}}
,可以讓你根據個人口味調整用量。
{{$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}}
,來讓提示詞更加通用。
{{plugin.function}}
這是 SK 模板語法中最迷人的地方。你可以在提示詞中直接呼叫已經註冊好的函式(Plugins)。
範例食譜 (skprompt.txt):
我需要一份關於 {{request}} 的報告。
報告的字數請限制在 {{word_count}} 字以內。
請開始撰寫:
你可以建立一個 ResearchPlugin
,裡面有一個 GetInformation
的函式。在提示詞中,你可以這樣設計:
請根據以下資訊,總結出重點:
資訊來源:{{ResearchPlugin.GetInformation}}
當你執行這個提示詞時,Kernel
會先暫停,執行 ResearchPlugin.GetInformation
這個函式,然後將函式的回傳值插入到提示詞中,再將完整的內容發送給 AI。這實現了一個強大的概念:AI 不只會思考,它還會主動去調用工具來獲取資訊,再進行創作。 我們在後續文章中會詳細討論這個神奇的機制!
當你的提示詞越來越複雜時,把它們寫在程式碼裡會變得很難管理。這時,我們就可以用 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 的能力!敬請期待!