iT邦幫忙

2024 iThome 鐵人賽

DAY 8
1

開發者們應該都了解,Prompt 是啟動生成式 AI 的關鍵。Prompt 的品質好壞,直接影響生成結果是否符合預期。因此,在開發生成式應用時,常會需要設計 Prompt Template,透過樣板方式將固定的 Prompt 內容與可變的動態內容結合,最終生成並傳送給 LLMs(大型語言模型)使用的 Prompt。而可變的動態內容又可以分成來自於 Plugin (程式) 或是使用者(人為)提供的。

因此做為一個生成式AI的開發框架,Semantic Kernel 自然也支援這樣的一個需求場景。KernelPromptTemplate 是 Semantic Kernel 內部基於 IPromptTemplate 介面的實作類別,外部透過 KernelPromptTemplateFactory (基於工廠模式)類別所提供的 Create 擴充方法來建立 KernelPromptTemplate,過程中透過參數的安排便能渲染最終的 Prompt。

Let's Go

假設設計一個應用,透過使用者提供的旅遊行程內容,AI 助手可以針對該行程給出評估建議,並提取行程中的景點,以項目符號列表的方式呈現。

  • 建立 kernel並且掛載 Semantic Kernel 內建的 TimePlugin
    掛載的 TimePlugin 同時給它一個 Plugin 的別名 : time,如果沒有給予名稱,則 Plugin 的名稱會預設使用該 Plugin 的類別名稱,接下來在 Prompt Template會使用到。
var builder = Kernel.CreateBuilder()
                .AddAzureOpenAIChatCompletion(
                    endpoint: Config.aoai_endpoint,
                    deploymentName: Config.aoai_deployment,
                    apiKey: Config.aoai_apiKey);
builder.Plugins.AddFromType<TimePlugin>("time");
Kernel kernel = builder.Build();
  • 定義 system prompt
    這個 prompt 內置二個可以彈性抽換的部份,分別是 {{ time.now }} 以及 {{ $userTravelContext }},其中 {{ time.now }} 是表達呼叫 time Plugin 的 now function,把取得的值置換到Prompt 裡,而{{ $userTravelContext }}表達的是變數的概念,透過 KernelArguments 置換其值。
string system_prompt =
        """
        You are a travel planning expert. Based on the travel dates, city, and number of travel days, review the user's travel itinerary
        and provide your professional suggestions in the response to user. Use zh-TW language to communicate with the user.

        The current time in Taiwan is : {{ time.now }}
        The user's travel itinerary is as follows:
        {{ $userTravelContext }}
        """;
  • 定義 user 旅行計劃內容
string userTravelContext =
        """
        我預計要去韓國釜山旅行5天,這是我的旅行行程,只帶短袖衣服跟薄外套:
        1. Day 1: 富平罐頭夜市,吃冰,吃烤肉跟炸雞,住釜山索拉利亞西鐵酒店。
        2. Day 2: 位於韓國東海與南海交界的此處,在2012年9月12日開始動工,於2013年
        10 月18日正式開放,以「行走在天上」之意將步道命名為「五六島Skywalk」。 Skywalk位於高達
        35 公尺的懸崖上,用鐵製的支柱加上24片玻璃板,做成呈馬蹄型,全長15公尺的玻璃步道。腳下所
        踩的玻璃是用4片厚12mm的玻璃板貼上防彈包膜,特別製作成厚55.49mm的高荷重防彈玻璃,十分安全。
        透過下方的透明玻璃可以看到海浪拍打著絕壁,給人強烈的刺激感。Skywalk也是知名的攝
        影勝地,站在此處,可見大海於眼前開展,無時無刻都呈現美麗的姿態,依天氣瞬時變幻各種色彩。
        當天氣晴朗時,甚至還可以看到日本的對馬島。五六島Skywalk,戀人燈塔.雙子燈塔。
        3. Day 3: :暴擊心臟的100層樓
        釜山XtheSKY觀景臺,位於釜山海雲臺區的「海雲臺LCTLandmarkTower」,是韓國最高的建築物,
        高空釜山全景觀景臺,是釜山廣域市海雲臺區的新地標,高達411.6公尺、共101樓的釜山最高建
        築「海雲臺LCTLandmarkTower」,其中位於大樓98~100樓的釜山XtheSKY觀景臺,是韓國最
        大的觀景平台!世界最高的星巴克就在這裡,您可自行前往朝聖打卡喔! 
        海東龍宮寺,海雲台海岸觀光列車,松島天空步道。
        4. Day 4: 甘川洞文化村,韓流文化體驗館,逛當地超市跟彩妝店,夢之城釜山的馬丘比丘《藝術工廠多大浦》的公共項目建設讓老城區脫胎換骨。 將
        沙下區甘川二洞一帶的空房和胡同改造成小區歷史畫廊和酒吧等,重新創造夢之文化藝術平台。彩
        色的房子層疊出別具特色的景致,是一個適合探索、拍照的好地方。近來因為綜藝節目
        RunningMan 前往拍攝,也成了熱門景點。
        5. Day 5: 釜山XtheSKY觀景臺,然後回台灣。
        """;
  • 定義 user prompt
string user_prompt =
        """
        幫我把旅行計劃中景點資料,使用項目符號列表列出
        """;
  • 建立 KernelArguments
    將user 旅行計劃內容置入 system prompt裡的 {{ $userTravelContext }} 變數值。
var arguments = new KernelArguments
{
    ["userTravelContext"] = userTravelContext
};
  • 建立 KernelPromptTemplateFactory 工廠物件
var promptTemplateFactory = new KernelPromptTemplateFactory();
  • 接著透過 promptTemplateFactory 以及 KernelArguments 渲染最終的 Prompt 內容
    為了方便觀察因此加入了console的輸出
string systemMessage = await promptTemplateFactory.Create(new PromptTemplateConfig(system_prompt)).RenderAsync(kernel, arguments);
Console.WriteLine($"------system prompt ---------------\n{systemMessage}");

string userMessage = await promptTemplateFactory.Create(new PromptTemplateConfig(user_prompt)).RenderAsync(kernel, arguments);
Console.WriteLine($"------user prompt -----------------\n{userMessage}");
  • 建立 ChatCompletionService 物件以及 ChatHistory 對話記憶物件,以進行對話以及生成
var chatCompletion = kernel.GetRequiredService<IChatCompletionService>();
var chatHistory = new ChatHistory(systemMessage);

chatHistory.AddUserMessage(userMessage);
var answer = await chatCompletion.GetChatMessageContentAsync(chatHistory);
Console.WriteLine($"-------Gen AI-------------------\n{answer}");

system prompt 輸出結果:

system prompt template 填入了日期時間以及使用者的旅行行程內容
------system prompt ---------------
You are a travel planning expert. Based on the travel dates, city, and number of travel days, review the user's travel itinerary
and provide your professional suggestions in the response to user. Use zh-TW language to communicate with the user.

The current time in Taiwan is : Thursday, 19 September 2024 15:15
The user's travel itinerary is as follows:
我預計要去韓國釜山旅行5天,這是我的旅行行程,只帶短袖衣服跟薄外套:

  1. Day 1: 富平罐頭夜市,吃冰,吃烤肉跟炸雞,住釜山索拉利亞西鐵酒店。
  2. Day 2: 位於韓國東海與南海交界的此處,在2012年9月12日開始動工,於2013年
    10 月18日正式開放,以「行走在天上」之意將步道命名為「五六島Skywalk」。 Skywalk位於高達
    35 公尺的懸崖上,用鐵製的支柱加上24片玻璃板,做成呈馬蹄型,全長15公尺的玻璃步道。腳下所
    踩的玻璃是用4片厚12mm的玻璃板貼上防彈包膜,特別製作成厚55.49mm的高荷重防彈玻璃,十分安全。
    透過下方的透明玻璃可以看到海浪拍打著絕壁,給人強烈的刺激感。Skywalk也是知名的攝
    影勝地,站在此處,可見大海於眼前開展,無時無刻都呈現美麗的姿態,依天氣瞬時變幻各種色彩。
    當天氣晴朗時,甚至還可以看到日本的對馬島。五六島Skywalk,戀人燈塔.雙子燈塔。
  3. Day 3: :暴擊心臟的100層樓
    釜山XtheSKY觀景臺,位於釜山海雲臺區的「海雲臺LCTLandmarkTower」,是韓國最高的建築物,
    高空釜山全景觀景臺,是釜山廣域市海雲臺區的新地標,高達411.6公尺、共101樓的釜山最高建
    築「海雲臺LCTLandmarkTower」,其中位於大樓98~100樓的釜山XtheSKY觀景臺,是韓國最
    大的觀景平台!世界最高的星巴克就在這裡,您可自行前往朝聖打卡喔!
    海東龍宮寺,海雲台海岸觀光列車,松島天空步道。
  4. Day 4: 甘川洞文化村,韓流文化體驗館,逛當地超市跟彩妝店,夢之城釜山的馬丘比丘《藝術工廠多大浦》的公共項目建設讓老城區脫胎換骨。 將
    沙下區甘川二洞一帶的空房和胡同改造成小區歷史畫廊和酒吧等,重新創造夢之文化藝術平台。彩
    色的房子層疊出別具特色的景致,是一個適合探索、拍照的好地方。近來因為綜藝節目
    RunningMan 前往拍攝,也成了熱門景點。
  5. Day 5: 釜山XtheSKY觀景臺,然後回台灣。

user prompt 輸出結果:

------user prompt -----------------
幫我把旅行計劃中景點資料,使用項目符號列表列出

AI生成內容輸出結果:
你的釜山旅行行程看起來非常豐富多彩!這裡有一些專業的建議,可以讓你的旅程更加順利和愉快:

  1. 衣物準備:釜山9月的天氣通常是溫暖的,但早晚可能會有些涼,尤其是在海邊。建議再帶一件長袖或輕便的外套,以應對氣溫變化。

  2. 美食方面:在富平罐頭夜市,除了烤肉和炸雞,可以試試當地的海鮮,特別是生蠔和鮮魚,這些都相當受歡迎。也不要忘了嘗試一些當地的小吃,例如辣炒年糕(Ddokbokki)。

  3. 五六島Skywalk:這是一個非常讓人期待的行程!建議你早點去避開人潮,特別是在拍攝的時候可以有更好的視野和靜謐的環境。

  4. 釜山X the SKY觀景台:因為這裡是釜山最新的地標,建議提前在線預訂票。這樣可以避免長時間排隊,也確保你能夠在最佳時刻欣賞到釜山的美景。

  5. 健身與活動:如果有時間,建議你嘗試一下釜山的海岸步道,步道旁的海景非常迷人,運動後再享受美食也是一種享受。

  6. 交通建議:釜山的公共交通相當便利,建議下載一個交通地圖應用程式,這樣可以幫助你更好地導航並掌握時間。

最後,祝你在釜山的旅行愉快,充滿美好的回憶!如果有任何其他問題或需要進一步的建議,隨時告訴我!

結語

較為複雜的應用通常需要使用 Prompt Template。透過 Semantic Kernel 所提供的 Prompt Template 機制,可以利用 KernelArguments 替換模板中預設的變數。此外,Prompt Template 也支援在模板中配置呼叫 Plugin 的方式。這種靈活的機制為 Prompt Template 提供了極大的設計彈性,能應用於各種動態 Prompt 的場景。


上一篇
Plugin 的魔力 — Function 的設計策略
下一篇
Prompt — 呼叫 LLMs 的多種寫法
系列文
Semantic Kernel 的魔力-用.NET探索生成式應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言