Azure OpenAI Service 05 - 透過 Azure OpenAI client library for .NET 實做串接 OpenAI Api

雖然微軟或 OpenAI 都有提供 PlayGround 可以方便我們測試 OpenAI ,但是最後還是得串接 API 來客制化或整合 OpenAI 到現有程式或產品中,一開始在常識的過程都只能直接呼叫 REST API 或是只有 Python 套件,身為懶惰的開發人員當然不想自己包套件去呼叫 REST Api,最近在找資料過程發現微軟也終於推出 prerelease 版的 SDK 套件 Azure OpenAI client library for .NET,雖然還在 Preview 階段,但是還是記錄一下使用的經驗。

實做

安裝

首先安裝 NuGet 套件,可以直接透過底下 Cli 來安裝

dotnet add package Azure.AI.OpenAI --prerelease

或是透過 NuGet 套件管理員來安裝,記得需要勾選包括搶先版,不然是搜尋不到的,因為目前都還在 Preview,等之後正式推出就可以直接搜尋到

驗證

這個套件可以同時支援 OpenAI Api 和 Azure OpenAI Service Api,在呼叫的時候略有不同。

OpenAI

只需要從 OpenAI 取得的 Api Key 當作參數即可。

var client = new OpenAIClient("Your OpenAI Api Key");

Azure OpenAI Service

一樣需要 API Key ,除此以外還需要輸入 Azure OpenAI Service 的 Endpoint,可以參考前面文章取得相關資訊。

var client = new OpenAIClient(
		new Uri("https://{your account}.openai.azure.com"),
		new AzureKeyCredential("Your Azure OpenAI Sservice Api Key"));

而 Azure OpenAi Service 除了使用 Api Key 的方式來驗證之外,還支援微軟 oAuth 的驗證方式,會需要額外安裝 Azure.Identity 套件,DefaultAzureCredential 的驗證可以參考之前文章介紹和說明。

var client = new OpenAIClient(
		new Uri("https://{your account}.openai.azure.com"),
		new DefaultAzureCredential());

Sample

Completions

驗證完成之後先來做簡單的測試,需要用到我們之前建立部署的模型名稱,以我範例來說之前文章建立的部署名稱為 GPT-3,因此輸入 GPT-3,如果是呼叫 OpenAI Api 則輸入模型名稱,比如說 text-davinci-003 就可以了。 

var completionsOptions = new CompletionsOptions()
{
	DeploymentName = "{Your Deployment Name}",
	Prompts = { "Hello, world!" },
};

Response<Completions> response = client.GetCompletions(completionsOptions);

foreach (Choice choice in response.Value.Choices)
{
	Console.WriteLine(choice.Text);
}

執行結果就可以得到結果了。

另外把回應結果整個呈現出來的話, Api 都會回應 Usage 這個資訊,其中就會包含我們傳出去的 Token 數和回應結果的 Toekn,以及加總的 Token,可以把這些資訊記錄下來,未來計算費用時候就是這些 Token 數來計費的。

ChatCompletions

如果是 ChatGPT 或是 GPT-4 模型的話,因為它們是屬於 Chat 最佳化的模型,所以要使用 ChatCompletions 相關的方法來呼叫,傳入的參數也會不同,會針對傳入的訊息設定 ChatRole,而定義裡面的 ChatRole 分為 System、User、Assistant 三個,如果還記得前面我們透過 Azure OpenAI Studio 中 Playground 在做測試的時候,也可以輸入這些角色,透過這些角色可以傳入初始設定的聊天範例以及過往的聊天訊息,可以讓結果回應更準確。

角色說明
System

系統角色,可以定義聊天機器人初始指示,讓聊天機器人回應上更符合情境,根據官方建議可以輸入以下的資訊:

  • 助理的特質特性
  • 您希望助理遵循的指示或規則
  • 模型所需的資料或資訊,例如常見問題中的相關問題
User使用者,也就是我們和聊天機器人對話的內容。
Assistant助理,也就是聊天機器人回應的內容。

在範例程式碼裡面使用非同步的方法,如果是 ChatCompletions 會蠻推薦非同步方法來呼叫,因為回應得結果可能很多,透過非同步可以呈現出 ChatGPT 網站聊天那樣的逐步回應的效果。

var chatCompletionsOptions = new ChatCompletionsOptions()
{
	DeploymentName = "{Your Deployment Name}",
	Messages =
	{
		new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."),
		new ChatRequestUserMessage("Can you help me?"),
		new ChatRequestAssistantMessage("Arrrr! Of course, me hearty! What can I do for ye?"),
		new ChatRequestUserMessage("What's the best way to train a parrot?"),
	},
	MaxTokens = 100
};

Response<ChatCompletions> response = client.GetChatCompletions(chatCompletionsOptions);

await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions))
{
	if (chatUpdate.Role.HasValue)
	{
		Console.Write($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");
	}
	if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate))
	{
		Console.Write(chatUpdate.ContentUpdate);
	}
}

參數

另外如果需要針對 OpenAI 調整一些參數,像是 temperature、max_tokens 等參數,就可以透過 CompletionsOptions 或 ChatCompletionsOptions 來設定,針對參數更詳細說明,可以參考微軟官方 Api 文件介紹。

結論

官方終於推出了 SDK,讓我們可以更方便的來使用 Azure OpenAI Service 和 OpenAI Api,接下來就是各種服務串接和整合,看如何讓 OpenAI 可以改善和加強或是推出怎樣有趣的應用了。

參考資料