iT邦幫忙

2023 iThome 鐵人賽

DAY 30
1
AI & Data

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

Semantic Kernel的實踐:Kernel 與 OpenAI Chat Completions

  • 分享至 

  • xImage
  •  

前言

前一篇提到 Semantic Kernel對於OpenAI Chat Completions封裝了一些方法,可以幫助開發人員快速的使用以對話為模式的Chat Completions API。然而如果有仔細觀看範例程式碼的話,應該會發現沒用Kernel物件,本篇就延續上一個範例,來看看如何透過Kernel來搭配Chat Completions。

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

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

Kernel 與 OpenAI Chat Completions

前題假設已申請好GPT-4模型服務,且Chat Completions只能用於GPT3.5與GPT4以上的模型,本範例使用Azure OpenAI 服務

  • 建立Kernel物件
 var kernel = new KernelBuilder()
        .WithAzureChatCompletionService(
         deploy_Model,   // Azure OpenAI Deployment Name
         aoai_Endpoint, // Azure OpenAI Endpoint
         api_Key  // Azure OpenAI Key
        ).Build(); 
  • 建立OpenAIRequestSettings物件,配置API參數,例如最大Token數 MaxTokens、溫度Temperature等
var requestSettings = new OpenAIRequestSettings()
{
    MaxTokens = 1024,
    FrequencyPenalty = 0,
    PresencePenalty = 0,
    Temperature = 0.2,
    TopP = 0.5
};
  • 透過kernel.GetService取得chatCompletion實作,實際拿到的是型別Microsoft.SemanticKernel.Connectors.AI.OpenAI.ChatCompletion.AzureChatCompletion物件,可以發現其實它就是採用Connectors連結器機制(前幾篇文章有介紹Connectors連結器)與AOAI溝通的
var chatCompletion = kernel.GetService<IChatCompletion>();
  • 透過AzureChatCompletion開始新一輪對話,此時建構子給與的內容就是system Role的prompt
 var chatHistory = chatCompletion.CreateNewChat("你是一位自然語言人工智慧研究專家");
  • 接著新增 user Role的prompt
chatHistory.AddUserMessage("ChatGPT與過去的自然語言模型有什麼不同,舉個簡單的例子說明");
  • 調用Chat Completion API,取得生成結果,調用時參入"對話記錄"與"API參數配置",在本範例裡就是chatHistory與requestSettings物件。透過GetChatMessageAsync取得生成結果的Message物件,這個Message物件會是assistant Role與其內容
foreach (IChatResult chatCompletionResult in await chatCompletion.GetChatCompletionsAsync(chatHistory, requestSettings))
{
    ChatMessageBase chatMessage = await chatCompletionResult.GetChatMessageAsync();
    chatHistory.Add(chatMessage); //加入對話歷程
    Console.WriteLine($"Completions : {chatMessage.Content.ToString()}"); //生成結果
}
  • 透過chatHistory物件可以查看所有對話歷程
foreach (var message in chatHistory.Messages)
{
    Console.WriteLine($"{message.Role}: {message.Content}");
}
  • 生成結果
    https://ithelp.ithome.com.tw/upload/images/20231015/20126569w6Y7elttde.png

範例原始碼 : https://github.com/iangithub/sklearn/tree/main/MultiChatCompletionSample

結語

本篇範例與上一篇差別的是AzureChatCompletion物件的取得,是由Kernel提供的,相較於透過new AzureChatCompletion自行建立,以Kernel為核心出發這種方式能進一步整合Kernel的其它功能,例如先前提到的Plugins等,對於較複雜的場景應用是比較有利的。

30天的鐵人賽終於結束了,這是第一次參加也順利完賽,礙於時間壓力,內容編寫上有諸多不順或說明不夠清楚的地方,思路上也較混亂一些,就請讀者多多包涵啦(ㄟ..有人看嗎? 你要確定吶.....),而關於Semantic Kernel還有許多想談來不及談的內容,咱們後續就blog見囉(oh ya,不用每天趕稿了XDD)。

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


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

1 則留言

0
oxxo
iT邦研究生 1 級 ‧ 2023-10-15 23:41:45

恭喜完賽哈哈!

我要留言

立即登入留言