OpenAI Chat Completions API (CHATGPT) รวมเข้ากับการสนับสนุน DI และ EF Core ช่วยให้คุณใช้ API ในแอปพลิเคชัน. NET ของคุณ นอกจากนี้ไคลเอนต์ยังรองรับการตอบสนองการสตรีม (เช่น CHATGPT) ผ่านสตรีม ASYNC
AddChatGptEntityFrameworkIntegration ต้องใช้ builder.Configuration เป็นพารามิเตอร์บังคับStructuredResponse ช่วยให้คุณได้รับการตอบสนองที่มีโครงสร้างจาก API เป็นวัตถุ C# ดู: ส่วนของ structuredResponse ก่อนอื่นคุณต้องสร้างบัญชี OpenAI และรับคีย์ API (หรือ OpenRouter หรือ Azure OpenAI) คุณสามารถทำได้ที่ https://platform.openai.com/account/api-keys
วิธีที่ง่ายที่สุดในการใช้บริการ chatgpt ในโครงการ. NET ของคุณด้วยการสนับสนุน DI และการคงอยู่ (EF Core) คือการติดตั้งแพ็คเกจ NUGET OPENAI.CHATGPT.ENTITYFRAMEWORKCORE:
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
หากคุณไม่ต้องการใช้ EF Core คุณสามารถติดตั้งแพ็คเกจ openai.chatgpt.aspnetcore และใช้ที่เก็บข้อมูลของคุณเองสำหรับประวัติการแชทโดยใช้อินเตอร์เฟส IChatHistoryStorage
TL; DR: ดูตัวอย่างในโครงการอ้างอิง
appsettings.json (ไม่ปลอดภัย): {
"AIProvider" : " openai " , // or openrouter or azure_openai
"OpenAICredentials" : { //optional
"ApiKey" : " your-api-key-from-openai " ,
"ApiHost" : " https://api.openai.com/v1/ "
},
"AzureOpenAICredentials" : { //optional
"ApiKey" : " your-api-key-from-azure-openai " ,
"ApiHost" : " https://{your-host}.openai.azure.com/ " ,
"DeploymentName" : " gpt-4-turbo-preview "
},
"OpenRouterCredentials" : { //optional
"ApiKey" : " your-api-key-from-openrouter " ,
"ApiHost" : " https://openrouter.ai/api/v1 "
}
} นอกจากนี้คุณสามารถระบุคีย์ OpenAI API เป็นตัวแปรสภาพแวดล้อม ASPNETCORE_OpenAICredentials:ApiKey
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; แทนที่จะเป็น options.UseSqlite("Data Source=chats.db") ใช้ DB และสตริงการเชื่อมต่อของคุณเอง
ChatGPTFactory ไปยังบริการของคุณและใช้เพื่อสร้างอินสแตนซ์ ChatGPT : public class YourService
{
private readonly ChatGPTFactory _chatGptFactory ;
public YourService ( ChatGPTFactory chatGptFactory )
{
_chatGptFactory = chatGptFactory ;
}
public async Task < string > GetAnswer ( string text )
{
ChatGPT chatGpt = await _chatGptFactory . Create ( userId ) ;
var chatService = await chatGpt . ContinueOrStartNewTopic ( ) ;
response = await _chatService . GetNextMessageResponse ( _prompt ) ;
return response ;
}
}ดูตัวอย่าง Blazor
หากคุณต้องการกำหนดค่าพารามิเตอร์คำขอคุณสามารถทำได้ในการกำหนดค่า appsettings.json หรือใน ChatGPTFactory.Create หรือในวิธี ChatGPT.CreateChat
{
"ChatGPTConfig" : {
"InitialSystemMessage" : " You are a helpful and kind assistant. " ,
"InitialUserMessage" : null ,
"MaxTokens" : null ,
"Model" : null ,
"Temperature" : null ,
"PassUserIdToOpenAiRequests" : true
}
}ดูพารามิเตอร์คำอธิบายภายใน chatgptconfig
หากการตอบสนองของเซิร์ฟเวอร์ไม่ใช่รหัสสถานะความสำเร็จไคลเอ็นต์จะส่ง NotExpectedResponSeexception ข้อยกเว้นจะมีข้อความแสดงข้อผิดพลาดจาก OpenAI API
โดยค่าเริ่มต้นการร้องขอการยกเลิกหรือ ChatService.Stop() การโทรจะส่ง OperationCanceledException หากคุณไม่ต้องการโยนมัน (เกี่ยวข้องกับการตอบสนองการสตรีม) คุณสามารถตั้งค่าพารามิเตอร์ throwOnCancellation เป็น false :
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory คลาส ChatGPT เธรดความปลอดภัยขึ้นอยู่กับการใช้งาน IChatHistoryStorage หากคุณใช้ ChatGPTFactory กับ Entity Framework มันไม่ปลอดภัยกับเธรด คลาส ChatService ไม่ปลอดภัยกับเธรด
อย่างไรก็ตามบริการเหล่านี้ได้รับการออกแบบให้ใช้อย่างปลอดภัยกับ DI ดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับมัน
วิธีการทั้งหมดจากแพ็คเกจทั้งหมดได้รับการออกแบบมาเพื่อใช้ในบริบท Async และใช้ ConfigureAwait(false) (ขอบคุณสำหรับ ConfigureAwait.Fody package)
เนื่องจาก ChatGPTFactory ขึ้นอยู่กับ IHttpClientFactory คุณสามารถใช้นโยบายที่มีอยู่ได้อย่างง่ายดายเช่น Polly
โมดูลนี้ช่วยให้คุณได้รับการตอบสนองที่มีโครงสร้างจาก API เป็นวัตถุ C# มันมีประโยชน์ถ้าคุณต้องการใช้ API สำหรับบางสิ่งที่มากกว่าแค่การแชท
record City ( string Name , int YearOfFoundation , string Country ) ;
var message = Dialog
. StartAsSystem ( " Return requested data. " )
. ThenUser ( " I need info about Almaty city " ) ;
City almaty = await _client . GetStructuredResponse < City > ( message , model : ChatCompletionModels . Gpt4Turbo ) ;
Console . WriteLine ( almaty ) ; // Name: "Almaty", Country: "Kazakhstan", YearOfFoundation: 1854 ภายใต้ประทุนมันใช้โหมด JSON ใหม่ของ API สำหรับ GPT4Turbo และสำหรับ gpt-3.5-turbo-1106 รองรับรุ่น GPT4 และ GPT3.5Turbo ปกติ แต่การตอบสนอง GPT3.5 อาจไม่เสถียร (สำหรับ GPT3.5 ขอแนะนำอย่างเคร่งครัดเพื่อให้พารามิเตอร์ examples )
ตัวอย่างที่ซับซ้อนมากขึ้นพร้อมอาร์เรย์วัตถุที่ซ้อนกันและ enums มีอยู่ในการทดสอบ:
chatgpt_api_dotnet/tests/openai.chatgpt.integrationtests/openaiclienttests/openaiclient_getstructuredResponse.cs
บรรทัดที่ 1 ใน F50D386
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.structuredResponse
โมดูลนี้ช่วยให้คุณแปลข้อความจากภาษาหนึ่งไปอีกภาษาหนึ่ง
string textToTranslate = " Hello, world! " ;
string translatedText = await _client . TranslateText ( textToTranslate , " English " , " Russian " ) ;
Console . WriteLine ( translatedText ) ; // "Привет, мир!" นอกจากนี้ยังเป็นไปได้ที่จะแปลวัตถุทั้งหมดเป็นคู่ด้วยโมดูล StructuredResponse :
var objectToTranslate = new Order (
new List < Order . Item >
{
new ( 1 , " Book " , 5 ) ,
new ( 2 , " Pen " , 10 ) ,
new ( 3 , " Notebook " , 3 )
}
) ;
Order translatedObject = await _client . TranslateObject ( objectToTranslate , " English " , " Russian " ) ;ดูตัวอย่างเต็มในการทดสอบ:
chatgpt_api_dotnet/tests/openai.chatgpt.integrationtests/chatgpttranslatorserviceTests.cs
บรรทัดที่ 36 ใน 11658b7
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.translator
นี่คือรายการของพารามิเตอร์หลักที่สามารถใช้ในคำขอ API chatcompletions (chatgpt) (openai.chatgpt/models/chatcompletion/chatcompletionrequest.cs) บางส่วนมาจากบทความนี้: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
พารามิเตอร์ที่ระบุไว้ด้านล่างสำหรับ chatcompletions API
แบบจำลอง AI ที่สร้างการทำนายถูกระบุโดยพารามิเตอร์เครื่องยนต์ รุ่นที่มีอยู่มีการอธิบายไว้ด้านล่าง: https://platform.openai.com/docs/models
| C# รุ่น | รุ่น API |
|---|---|
| chatcompletionmodels.gpt4turbo | GPT-4-1106-PREVIEW |
| chatcompletionmodels.gpt4 | GPT-4 |
| chatcompletionmodels.gpt4_0613 | GPT-4-0613 |
| chatcompletionmodels.gpt4_32k | GPT-4-32K |
| chatcompletionmodels.gpt4_32k_0613 | GPT-4-32K-0613 |
| chatcompletionmodels.gpt3_5_turbo | GPT-3.5-turbo |
| chatcompletionmodels.gpt3_5_turbo_1106 | GPT-3.5-turbo-1106 |
| chatcompletionmodels.gpt3_5_turbo_16k | GPT-3.5-turbo-16K |
| chatcompletionmodels.gpt3_5_turbo_0613 | GPT-3.5-turbo-0613 |
| chatcompletionmodels.gpt3_5_turbo_16k_0613 | GPT-3.5-turbo-16K-0613 |
| chatcompletionmodels.gpt4_0314 | GPT-4-0314 |
| chatcompletionmodels.gpt4_32k_0314 | GPT-4-32K-0314 |
| chatcompletionmodels.gpt3_5_turbo_0301 | GPT-3.5-turbo-0301 |
จำนวนโทเค็นสูงสุดที่อนุญาตสำหรับคำตอบที่สร้างขึ้น ค่าเริ่มต้นเป็น ChatCompletionRequest.MaxTokensDefault (64)
ChatCompletionModels.GetMaxTokensLimitForModelChatCompletionMessage.CalculateApproxTotalTokenCountChatCompletionResponse.Usage.TotalTokens ตามกฎของหัวแม่มือสำหรับภาษาอังกฤษ 1 โทเค็นมีประมาณ 4 อักขระ (ดังนั้นโทเค็น 100 คำ≈ 75 คำ) ดู tokenizer จาก openai: https://platform.openai.com/tokenizerอุณหภูมิการสุ่มตัวอย่างที่จะใช้ระหว่าง 0 ถึง 2
ChatCompletionTemperaturesChatCompletionTemperatures.Balanced (0.5)คำอธิบาย: ก่อนที่จะถูกแมปเข้าสู่ความน่าจะเป็นโมเดลจะส่งออกค่าที่ไม่เป็นปกติ (logits) โดยทั่วไปแล้ว logits จะใช้กับฟังก์ชั่นเช่น softmax เพื่อแปลงเป็นความน่าจะเป็น
แต่ก่อนที่จะใช้ฟังก์ชั่น Softmax เราสามารถใช้เคล็ดลับที่ได้รับแรงบันดาลใจจากเทอร์โมไดนามิกส์และปรับขนาดของ logits ด้วยพารามิเตอร์อุณหภูมิเช่น softmax (logits/อุณหภูมิ)
พารามิเตอร์อุณหภูมิใกล้กับ 1 จะหมายความว่า logits จะถูกส่งผ่านฟังก์ชั่น softmax โดยไม่ต้องปรับเปลี่ยน หากอุณหภูมิใกล้เคียงกับศูนย์โทเค็นที่เป็นไปได้สูงสุดจะกลายเป็นโอกาสมากเมื่อเทียบกับโทเค็นอื่น ๆ เช่นโมเดลจะกำหนดขึ้นได้มากขึ้นและจะส่งออกโทเค็นชุดเดียวกันเสมอหลังจากลำดับคำที่กำหนด
คำอธิบายพารามิเตอร์เพิ่มเติมสามารถพบได้ที่นี่: บางส่วนถูกนำมาจากบทความนี้: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
หากคุณไม่ต้องการ DI และประวัติการแชทคุณสามารถใช้เฉพาะแพ็คเกจ NUGET OPENAI.CHATGPT:
Install-Package OpenAI.ChatGPT
จากนั้นสร้างอินสแตนซ์ของ OpenAIClient :
_client = new OpenAiClient ( " {YOUR_OPENAI_API_KEY} " ) ; string text = " Who are you? " ;
string response = await _client . GetChatCompletions ( new UserMessage ( text ) , maxTokens : 80 ) ;
Console . WriteLine ( response ) ; var text = " Write the world top 3 songs of Soul genre " ;
await foreach ( string chunk in _client . StreamChatCompletions ( new UserMessage ( text ) , maxTokens : 80 ) )
{
Console . Write ( chunk ) ;
} ใช้วิธีการ ThenAssistant และ ThenUser เพื่อสร้างกล่องโต้ตอบ:
var dialog = Dialog . StartAsUser ( " How many meters are in a kilometer? Write just the number. " ) //the message from user
. ThenAssistant ( " 1000 " ) // response from the assistant
. ThenUser ( " Convert it to hex. Write just the number. " ) ; // the next message from user
await foreach ( var chunk in _client . StreamChatCompletions ( dialog , maxTokens : 80 ) )
{
Console . Write ( chunk ) ;
}หรือเพียงแค่ส่งประวัติข้อความเป็นคอลเลกชัน