Azure OpenAI GPT-4 API Sample

由於GPT-4已經在Azure OpenAI 開放申請使用,並且在API的端點及參數與先前GPT3.5不太一樣,因此以C#為範例整理了一下API的請求及回應參數,給有需要的開發者參考使用。(圖為使用Bing Create所產生)
 

bot write code in coffee on street

不知怎麼,在使用Azure OpenAI總覺得在找API相關的說明很不容易找到文件,或是找到的文件只有片段,不若以往的完整,到後來都是直接從Chat playground / View Code參考,但是Chat playground到是沒有.NET版本。

隨著GPT-4在Azure OpenAI開放,原以為參數及端點應該沒有變,頂多是指定Model值換一下,但事實證明我錯了,在GPT-4在參數及端點都做了改變,以下就整理成Sample Code給大家參考,其中幾個重要的參數也做了一些註解說明。

在這個範本專案中,我分別建立了二個類別AoaiRequestModel及Completion,做為API的請求及回應參數,重要參數說明如下

  • API端點:改為/chat/completions
  • 訊息傳送:改為Message,並具備system/assistant/user等3個角色,在API調用上是以陣列格式傳送,如果要做來回多次的對話控制,則必須記錄下歷史記錄再一併傳送
    • system,可以用於描述ChatGPT的個性,告訴它應該回答什麼和不應該回答什麼,以及如何格式化回應,這部分沒有Token的限制,但將與API調用一起使用,因此它會計入Token總數限制。
    • assistant,扮演對話回應的角色。
    • user,扮演發話的角色。
  • Temperature:介於 0 ~ 2間的數值,default是1,數值愈高隨機性較強,設為0表示每次回應都相同。
  • Top_p:介於 0 ~1間的數值,default是1,用於控制語言模型在嘗試預測下一個單詞時考慮多少個不同的單詞(token),數值愈高,輸出的回答愈多樣化。例如:top_p值設置為 0.5,則語言模型將僅考慮接下來可能出現的 50% 最有可能出現的單詞(token),如果將top_p值設置為 0.9,則語言模型將考慮 90% 最有可能的單詞(token)。
  • Frequency_Penalty:介於 -2.0 ~ 2.0 間的數值,設定為正值會根據新標記到目前為止在文本中的現有頻率來懲罰新標記,值越大越會懲罰出現頻率高的token,從而降低模型逐字重複同一行的可能性。
  • Presence_Penalty:介於 -2.0 ~ 2.0 間的數值,當設定為正值時,減少模型產生之前已經出現過的 token 的機率,減少模型直接重複之前的回應。這樣設定可以讓模型更傾向於產生新的內容。

並且在AoaiRequestModel類別的建構子,初始化了相關參數,並賦予一個system角色的設定。

    public AoaiRequestModel(string sysContent)
    {
        /*
         * sysContent Sample : 
         * "你是一位客服人員,我會給你準備要回答客戶的答案,請你進行內容文字的調整並以客服語氣產生500個字以內的回答"
         * You are a customer service representative, and I will provide you with the answer that I have prepared for the customer. 
         * Please adjust the content wording and generate a response in a customer service tone within 500 words.
         */

        Messages = new List<Message>
            {
                new Message() { Role = "system", Content = sysContent }
            };
        Temperature = 0.8f;
        Top_p = 0.95f;
        Frequency_Penalty = 0;
        Presence_Penalty = 0;
        Max_Tokens = 1000;
    }

另外AoaiRequestModel類別同時也具有二個方式,分別用於加入user角色的message,以及assistant角色的message。

    public void AddUserMessages(string message)
    {
        this.Messages.Add(new Message() { Role = "user", Content = message });
    }
    public void AddGptMessages(string message)
    {
        this.Messages.Add(new Message() { Role = "assistant", Content = message });
    }

這個範本直接採用主控台應用做示範,情境是一個客服ChatGPT,其中az_OpenAi_Endpoint 、az_OpenAi_Key、az_OpenAi_DeploymentName 參數值,請自行替換為實際值,而az_OpenAi_Api_Version目前最新的版本是2023-03-15-preview。

string az_OpenAi_Endpoint = "https://xxxx.openai.azure.com/openai/deployments";
string az_OpenAi_Key = "xxxxxx";
string az_OpenAi_Api_Version = "2023-03-15-preview";
string az_OpenAi_DeploymentName = "xxxxx";

Console.WriteLine("Hello, GPT4!");

string azureOpenApiEndpoint = $"{az_OpenAi_Endpoint}/{az_OpenAi_DeploymentName}/chat/completions?api-version={az_OpenAi_Api_Version}";

using (HttpClient client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("api-key", az_OpenAi_Key);
    var requestModel = new AoaiRequestModel("你是一位客服人員,我會給你準備要回答客戶的答案,請你進行內容文字的調整並以客服語氣產生200個字以內的回答");
    requestModel.AddUserMessages("在6樓及B2有客服中心可以辦理外籍人士退稅服務");

    var json = JsonConvert.SerializeObject(requestModel);
    var data = new StringContent(json, Encoding.UTF8, "application/json");

    var response = await client.PostAsync(azureOpenApiEndpoint, data);
    var responseContent = await response.Content.ReadAsStringAsync();

    var completion = JsonConvert.DeserializeObject<Completion>(responseContent);

    Console.WriteLine(completion.Choices[0].Message.Content);
}

完整的Code,請上Github參考 => https://github.com/iangithub/AOAI_Template/tree/main/GPT4/ConsoleApp

程式碼範本並未最佳化,使用於生產環境請自行改善

GPT-4 在AOAI上仍屬於必須申請才能使用的,申請表格往這走

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18