第六節:基於.Net的OpenAI包測試使用ChatGPT的各種Api

一. 前置

1.  說明

 支持多種語言,詳見:https://platform.openai.com/docs/libraries/community-libraries

 以.Net爲例,主要有三個包

   OpenAI                      https://github.com/OkGoDoIt/OpenAI-API-dotnet

   Betalgo.OpenAI          https://github.com/betalgo/openai

   OpenAI-DotNet           https://github.com/RageAgainstThePixel/OpenAI-DotNet

 其中Betalgo.OpenAI的stars最多1.9k,OpenAI下載次數最多9w,本節先以【OpenAI】這個爲主,研究樣例

 

2.  準備

string openAiKey = "sk-xxxx";
var api = new OpenAI_API.OpenAIAPI(openAiKey);

 

二.  Chat Api

1. 說明

  給定一組描述對話的消息列表(可以訓練格式),模型將返回一個響應。

 

2. 樣例1-訓練的模式

{

    var chat = api.Chat.CreateConversation();

    //1. 事先訓練chatgpt的回答格式
    chat.AppendSystemMessage("You are a teacher who helps children understand if things are animals or not. " +
        " If the user tells you an animal, you say \"yes\". " +
        " If the user tells you something that is not an animal, you say \"no\". " +
        " You only ever respond with \"yes\" or \"no\".  You do not say anything else.");

    // give a few examples as user and assistant
    chat.AppendUserInput("Is this an animal? Cat");
    chat.AppendExampleChatbotOutput("Yes");
    chat.AppendUserInput("Is this an animal? House");
    chat.AppendExampleChatbotOutput("No");


    //2. 開始提問
    chat.AppendUserInput("Is this an animal? Dog");
    string response = await chat.GetResponseFromChatbotAsync();
    Console.WriteLine(response); // "Yes"

    chat.AppendUserInput("Is this an animal? Chair");
    response = await chat.GetResponseFromChatbotAsync();
    Console.WriteLine(response); // "No"

    //3. 總結所有問題
    // the entire chat history is available in chat.Messages
    foreach (ChatMessage msg in chat.Messages)
    {
        Console.WriteLine($"{msg.Role}: {msg.Content}");
    }

}

 

3. 樣例2-不等待,邊獲取,邊輸出

{
    var chat = api.Chat.CreateConversation(new ChatRequest()
    {
        Model = Model.ChatGPTTurbo   //這也是默認值,模型是:gpt-3.5-turbo  
    });
    chat.AppendUserInput("用C#寫個數組去重的算法");

    //C# 8.0 寫法
    //await foreach (var res in chat.StreamResponseEnumerableFromChatbotAsync())
    //{
    //    Console.Write(res);
    //}

    //C# 8.0 之前的寫法
    await chat.StreamResponseFromChatbotAsync(res => Console.Write(res));
}

 

4. 樣例3-等待獲取所有結果,一次性完整輸出

{
    var results = await api.Chat.CreateChatCompletionAsync(new ChatRequest()
    {
        Model = Model.ChatGPTTurbo,  //表示模型是:gpt-3.5-turbo  
        Temperature = 0.1,    //回答的精確度  可以嘗試 0.9  或 0
        MaxTokens = 4046,   //回答字數,默認是16
        Messages = new ChatMessage[] {
            new ChatMessage(ChatMessageRole.User, "講個笑話給我聽吧"),
            new ChatMessage(ChatMessageRole.Assistant, "哈哈哈,真好笑"),
            new ChatMessage(ChatMessageRole.User, "說一句話讓我高興一下吧"),
        }
    });
    // 默認寫法,不含任何配置
    //var results = api.Chat.CreateChatCompletionAsync("Hello!");


    //獲取回答結果
    //寫法1:
    var reply = results.Choices[0].Message;
    Console.WriteLine($"{reply.Role}: {reply.Content.Trim()}");

    //寫法2
    //Console.WriteLine(results);
}

 

三.  Completions Api

1. 說明

   給定提示,模型將返回一個或多個預測的結果,並且還可以返回每個位置上可選標記的概率。

 

2. 樣例1-獲取全部結果,一次性輸出

{
    var result = await api.Completions.CreateCompletionAsync(
        new CompletionRequest(
             "哈士奇和阿拉斯加有什麼區別?",
            model: Model.DavinciText,  //最強大的GPT-3型號。可以做任何其他模型可以做的任務,通常具有更高的質量,更長的輸出和更好的指令遵循。還支持在文本中插入補全。
            temperature: 0.1,
            max_tokens: 2048
            ));
    Console.WriteLine(result);

}

 

3. 樣例2-不等待,邊獲取,邊輸出

{
    //C# 8.0 寫法
    //await foreach (var token in api.Completions.StreamCompletionEnumerableAsync(
    //    new CompletionRequest(
    //        "哈士奇和阿拉斯加有什麼區別?",
    //        model: Model.DavinciText,
    //        max_tokens: 2048,
    //        temperature: 0.5,
    //        presencePenalty: 0.1,
    //        frequencyPenalty: 0.1)))
    //{
    //    Console.Write(token);
    //}

    //C# 8.0 之前的寫法
    await api.Completions.StreamCompletionAsync(
        new CompletionRequest(
                "vue3.2版本有哪些新特性?",
                model: Model.DavinciText,
                max_tokens: 2048,
                temperature: 0.5,
                presencePenalty: 0.1,
                frequencyPenalty: 0.1),
        res => Console.Write(res.ToString()));

}

 

 

四.  Moderation

1.  說明

   判斷輸入文本是否違規

 

2. 樣例

{
    // 寫法1
    var result1 = await api.Moderation.CallModerationAsync(new ModerationRequest("哈士奇和阿拉斯加有什麼區別?", Model.TextModerationLatest));
    // 寫法2
    var result2 = await api.Moderation.CallModerationAsync("我要殺了你");

    Console.WriteLine("-----------------result1----------------------");
    foreach (var item in result1.Results[0].Categories)
    {
        Console.WriteLine(item);
    }

    Console.WriteLine("-----------------result2----------------------");
    foreach (var item in result2.Results[0].Categories)
    {
        Console.WriteLine(item);
    }
}

運行結果:

 

 

五. File 

1.  說明

   文件的增刪改查,但是該文件必須是json文件,內容也必須是json內容。

2. 樣例

{
    // 上傳文件 (文件必須是json格式,且每行都是json)
    var response = await api.Files.UploadFileAsync("test1.json");
    Console.WriteLine(response.Id.Length > 0);
    Console.WriteLine(response.Object == "file");
    Console.WriteLine(response.Bytes > 0);
    Console.WriteLine(response.CreatedAt > 0);
    Console.WriteLine(response.Status == "uploaded");

    //獲取文件
    var response2 = await api.Files.GetFilesAsync();
    foreach (var file in response2)
    {
        Console.WriteLine(file.Name);
        Console.WriteLine(file.Id);
    }
}

 

六. Images 

1.  說明

   根據描述,生成圖片。

 

2. 樣例

{
    // for example
    var result = await api.ImageGenerations.CreateImageAsync(
          new ImageGenerationRequest(
              prompt: "幫我畫一張大熊貓的圖片",
              numOfImages: 1,
              size: ImageSize._512,
              responseFormat: ImageResponseFormat.Url   //返回圖片的路徑
              ));
    // or
    //var result = await api.ImageGenerations.CreateImageAsync("A drawing of a computer writing a test");

    Console.WriteLine(result.Data[0].Url);

}

運行結果:

 

 

七.  Embeddings  (用不上)

1. 說明

   創建表示輸入文本的嵌入向量

{
    // for example
    var result1 = await api.Embeddings.CreateEmbeddingAsync(new EmbeddingRequest("A test text for embedding", Model.AdaTextEmbedding));
    // or
    var result2 = await api.Embeddings.CreateEmbeddingAsync("A test text for embedding");

}

 

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鵬飛)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 如有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲     明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章