有使用過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版號做為教學說明
前題假設已申請好GPT-4模型服務,且Chat Completions只能用於GPT3.5與GPT4以上的模型,本範例使用Azure OpenAI 服務
var chatCompletion = new AzureChatCompletion(
deploy_model, // Azure OpenAI Deployment Name
aoai_Endpoint, // Azure OpenAI Endpoint
api_Key // Azure OpenAI Key
);
var requestSettings = new OpenAIRequestSettings()
{
MaxTokens = 1024,
FrequencyPenalty = 0,
PresencePenalty = 0,
Temperature = 0.2,
TopP = 0.5
};
var chatHistory = chatCompletion.CreateNewChat("你是一位自然語言人工智慧研究專家");
chatHistory.AddUserMessage("ChatGPT與過去的自然語言模型有什麼不同,舉個簡單的例子說明");
foreach (IChatResult chatCompletionResult in await chatCompletion.GetChatCompletionsAsync(chatHistory, requestSettings))
{
ChatMessageBase chatMessage = await chatCompletionResult.GetChatMessageAsync();
chatHistory.Add(chatMessage); //加入對話歷程
Console.WriteLine($"Completions : {chatMessage.Content.ToString()}"); //生成結果
}
foreach (var message in chatHistory.Messages)
{
Console.WriteLine($"{message.Role}: {message.Content}");
}
範例原始碼 : 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