一. 前置
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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。