iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
AI & Data

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

Semantic Kernel的實踐:Semantic Kernel v1.0.0 Beta1 變化

  • 分享至 

  • xImage
  •  

前言

一如先前所提,本週迎來Semantic Kernel v1.0.0 Beta1,做為v1.0.0的暖身,當然從preview到v1.0.0不意外的有些破壞性的變化,在先前的文章內也提到了改變影響較大的會是一直以來稱為Skills轉換成Plugins,另外有些變化是關於套件的歸屬以及舊的或未使用設計的移除,這部份的影響不大。本篇來把幾個從preview到v1.0.0的改變寫法整理一下,做為後續範例的參考。

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

本文以Semantic Kernel v1.0.0 Beta1版號做為教學說明

InlineFunction (semantic function)

透過CreateSemanticFunction建立semantic function,requestSettings參數則為OpenAI/Azure OpenAI API調用模型參數值

//建立kernel 
var kernel = new KernelBuilder()
            .WithOpenAIChatCompletionService(
                modelId: openAIModelId,
                apiKey: openAIApiKey)
            .Build();

const string FunctionDefinition = "xxxxx your prompt template";

//建立 semantic function
var excuseFunction = kernel.CreateSemanticFunction(FunctionDefinition, requestSettings: new OpenAIRequestSettings() { MaxTokens = 100, Temperature = 0.4, TopP = 1 });

//調用semantic function
var result = await kernel.RunAsync("什麼是LLM", excuseFunction);
Console.WriteLine(result.GetValue<string>());

ImportSemanticFunctionsFromDirectory (semantic function from directory)

ImportSemanticFunctionsFromDirectory由指定目錄引用semantic function(舊名ImportSemanticSkillFromDirectory),

var summarizeFunctions = kernel.ImportSemanticFunctionsFromDirectory(folder, "SummarizePlugin");

 var result = await kernel.RunAsync(
            ask,
            summarizeFunctions["Summarize"]
        );

ImportFunction (native function)

Kernel使用ImportFunctions方法附掛native function(舊名ImportSkill),參數1:Plugin物件(functionsInstance),參數2:Plugin別名(pluginName)

var textFunctions = kernel.ImportFunctions(new StaticTextPlugin(), "text");

//調用Plugin裡的native function
KernelResult result = await kernel.RunAsync(textFunctions["AppendDay"]);

開箱即用Plugins

使用ImportFunctions方法附掛開箱即用Plugins(native function),kernel.Functions.GetFunction調用某個Plugin裡的native function

var bingConnector = new BingConnector(bingApiKey);
var bing = new WebSearchEnginePlugin(bingConnector);

//引用Plugins
kernel.ImportFunctions(bing, "bing");

//取得Plugins裡的某個native function
var function = kernel.Functions.GetFunction("bing", "search");

//調用Plugin裡的native function
var question = "What's the largest building in the world?";
var result = await kernel.RunAsync(question, function);

總結

  • 原Skill均重新命名為function或plugin,重新劃分定位
  • kernel.RunAsync 取代 InvokeAsync,成為調用funciton的主要方式
  • 底層套件抽離重構,目前開發使用上影響不大
  • 套件名稱有用到skill的也改為Functions 或 plugins,例如
    • Microsoft.SemanticKernel.Skills.Core -> Microsoft.SemanticKernel.Skills.Core
    • Microsoft.SemanticKernel.Skills.Document -> Microsoft.SemanticKernel.Plugins.Document
    • Microsoft.SemanticKernel.Skills.Web -> Microsoft.SemanticKernel.Plugins.Web
    • Microsoft.SemanticKernel.Skills.OpenAPI -> Microsoft.SemanticKernel.Functions.OpenAPI

結語

Semantic Kernel終於迎來了v1.0.0 Beta1,相信v1.0.0 正式版也會很快發行,從preview到v1.0.0破壞性的改變會比較多一點,不過在使用原理上仍維持大致相同的方向,適應上應該沒什麼太大問題,先前的範例待鐵人賽後再做修正,而後面的文章範例則會使用v1.0.0 Beta1撰寫。

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


上一篇
Semantic Kernel的實踐:Semantic Kernel - 串連多個semantic function共享上下文
下一篇
Semantic Kernel - planner 規劃器
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言