前一篇提到 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版號做為教學說明
前題假設已申請好GPT-4模型服務,且Chat Completions只能用於GPT3.5與GPT4以上的模型,本範例使用Azure OpenAI 服務
var kernel = new KernelBuilder()
.WithAzureChatCompletionService(
deploy_Model, // Azure OpenAI Deployment Name
aoai_Endpoint, // Azure OpenAI Endpoint
api_Key // Azure OpenAI Key
).Build();
var requestSettings = new OpenAIRequestSettings()
{
MaxTokens = 1024,
FrequencyPenalty = 0,
PresencePenalty = 0,
Temperature = 0.2,
TopP = 0.5
};
var chatCompletion = kernel.GetService<IChatCompletion>();
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
本篇範例與上一篇差別的是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