iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
AI & Data

OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐系列 第 14

Semantic Kernel的實踐:Semantic Kernel first sample

  • 分享至 

  • xImage
  •  

前言

前一篇從概觀的角度理解 Semantic Kernel,並且概述了Semantic Kernel核心的5個元素,本篇以一個簡單的Sample來體會一下如何使用Semantic Kernel。

範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實上也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。

Semantic Kernel first sample

這個範例會示範如何串接Azure OpenAI GPT-4模型,並以建立具有童話創造能力的LLM應用。

  1. 首先安裝 Microsoft.SemanticKernel 套件,本範例使用的是 0.24.230918.1-preview 版本

  2. 建立Plugins/WriterPlugin/FairyTales目錄
    這個程序是待會我們會使用一種稱為"範本語義函數(Templatizing semantic functions)"的技巧,它是屬於 Semantic Kernel Plugins 的一種做法,具體的部份,我們後面章節再來說明。
    https://ithelp.ithome.com.tw/upload/images/20230929/20126569KHmgr3n9NW.png

  3. 接著在FairyTales目錄建立二個檔案,分別是config.json以及skprompt.txt

  • config.json:配置OpenAI API參數,這些API參數在前面章節已有介紹,這裡就不再重覆。這裡的description是用以描述這個function的作用,而type目前僅支援使用completion,具體細節部份,我們後面文章再來說明。
{
  "schema": 1,
  "type": "completion",
  "description": "根據主題及角色創造童話故事給小朋友聽",
  "completion": {
    "max_tokens": 2000,
    "temperature": 0.8,
    "top_p": 0.0,
    "presence_penalty": 0.0,
    "frequency_penalty": 0.0
  }
}

  • skprompt.txt:Prompt 樣版,這裡面可以運用先前我們提到的一些Prompt技巧,另外使用**{{xxx}}用於定義參數**,屆時從外部動態的傳入。
現在你是一位童話故事創作高手,請根據下列主題
"""
{{$story_subject}}
""" 

以及以下角色,創造故事給3到7歲小朋友聽,使用繁體中文
"""
{{$story_role}}
""" 
  1. 開啟 Program.cs 檔案,建立對話模式,並保存相關參數值,這個範例不涉及對話記憶。
Console.WriteLine("bot: 你想聽什麼主題的故事呢? \n");
Console.Write("you: ");
string storySubject = Console.ReadLine();
Console.Write("\n");
Console.WriteLine("bot: 故事的角色是什麼呢? \n");
Console.Write("you: ");
string storyRole = Console.ReadLine();
Console.Write("\n");
  1. 開啟 Program.cs 檔案,建立Kernel物件並接上大腦(模型服務)
  • 首先前一篇提到過,使用Semantic Kernel,一切從Kernel開始,先前先建立Kernel物件,並且這個範例中我們採用Azure OpenAI,所以需要給與相關參數,例如Endpoint、API Key等。
var kernel = new KernelBuilder()
            .WithAzureChatCompletionService(
             deploy_model,   // Azure OpenAI Deployment Name
             aoai_Endpoint, // Azure OpenAI Endpoint
             api_Key  // Azure OpenAI Key
            ).Build();
  • 若要更換成OpenAI API也可以
var kernel = new KernelBuilder()
            .WithOpenAIChatCompletionService(
                OpenAIModelId,  // The name of your deployment (e.g., "gpt-3.5-turbo")
                OpenAIApiKey,   // The API key of your Azure OpenAI service
                OpenAIOrgId    // The endpoint of your Azure OpenAI service
            )
            .Build();
  1. 開啟 Program.cs 檔案,為Kernel物件接上接上Plugins(手腳能力)
 var pluginsDirectory = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Plugins");
            var writerPlugin = kernel.ImportSemanticSkillFromDirectory(pluginsDirectory, "WriterPlugin");

  1. 傳入Prompt Template 參數
var variables = new ContextVariables
{
    ["story_subject"] = storySubject,
    ["story_role"] = storySubject
};
  1. 叫用GPT模型等得生成結果
var result = (await kernel.RunAsync(variables, writerPlugin["FairyTales"])).Result;

Console.WriteLine(result);
  1. 生成結果
    https://ithelp.ithome.com.tw/upload/images/20230929/20126569I8SrKt5HPN.png

本範例完整原始碼:https://github.com/iangithub/sklearn/tree/main/IntroSample

結語

本篇內容主要以一個較簡單的範例,走一遍怎麼開始使用Semantic Kernel,整個範例從如何建立Kernel物件連結GPT模型服務,再加上Plugins,剛好就是前篇文章中我們提及的這張圖,相信走過這個相對簡單的範例後,就能對使用Semantic Kernel有一個初步的認識,當然技術細節的部份在本篇並未深入說明,這部份會在接下來的系列文中做更深入的教學。

https://ithelp.ithome.com.tw/upload/images/20230929/201265695DhReS5xBQ.png

嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500


上一篇
Semantic Kernel的實踐:Semantic Kernel 概觀
下一篇
Semantic Kernel的實踐:Semantic Kernel - 配置 Kernel
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言