iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
AI & Data

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

Semantic Kernel的實踐:Semantic Kernel - OpenAI Chat Completions

  • 分享至 

  • xImage
  •  

前言

有使用過OpenAI或Azure OpenAI平台的開發者,對於Chat Completions API應該不陌生,Chat Completions API與過去Completions API不同的地方在於它是以連續對話為概念設計的,在使用上採用了Role & Content的資料結構,其中Role有三個類型,分別是system、user、assistant,其中system最常扮演的是賦予ChatGPT一個角色,可以把它視為初始化設定的內容,而user、assistant分別表示接下來使用者與ChatGPT的對話。

Semantic Kernel裡也提供針對Chat Completions API的方法,可以讓開發者採用已熟知的方式與ChatGPT進行對話,本篇就來看看Semantic Kernel是怎麼封裝Chat Completions API。

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

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

Chat Completions

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

  • 建立AzureChatCompletion物件,並配置相關參數
var chatCompletion = new AzureChatCompletion(
        deploy_model, // Azure OpenAI Deployment Name
        aoai_Endpoint, // Azure OpenAI Endpoint
        api_Key // Azure OpenAI Key
        ); 
  • 建立OpenAIRequestSettings物件,配置API參數,例如最大Token數 MaxTokens、溫度Temperature等
var requestSettings = new OpenAIRequestSettings()
{
    MaxTokens = 1024,
    FrequencyPenalty = 0,
    PresencePenalty = 0,
    Temperature = 0.2,
    TopP = 0.5
};
  • 透過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/20231014/20126569wSbibZKhi9.png

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

結語

semantic kernel將OpenAI的Chat Completion API做了一層的封裝,使得開發人員可以快速調用,不需要再手刻RESET API的調用,並且透過ChatHistory可以將所有先前的對話一併記錄起來,範例為求簡化只做了一輪對話,實務上可以使用相同的機制,連續把Message內容寫入ChatHistory,就能實現連續對話的場景,但是要注意的是模型有Token上限,由於每次都是把ChatHistory內容送回API,所以要小心Token爆炸問題。

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


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

尚未有邦友留言

立即登入留言