Openai Chat Expliveions API (ChatGPT) تكامل مع دعم DI و EF Core. يتيح لك استخدام API في تطبيقات .NET الخاصة بك. أيضًا ، يدعم العميل استجابات البث (مثل ChatGPT) عبر تدفقات Async.
AddChatGptEntityFrameworkIntegration الآن builder.Configuration كمعلمة إلزامية.StructuredResponse الحصول على استجابات منظمة من API ككائن C#. انظر: قسم الاستجابة الهيكلية. أولاً ، تحتاج إلى إنشاء حساب 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 ، فيمكنك تثبيت Package 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 "
}
} أيضًا ، يمكنك تحديد مفتاح API Openai كمتغير البيئة ASPNETCORE_OpenAICredentials:ApiKey .
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; بدلاً من options.UseSqlite("Data Source=chats.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.
إذا لم تكن استجابة الخادم رمز حالة النجاح ، فسيقوم العميل بإلقاء مجموعة غير متوقعة. سيحتوي الاستثناء على رسالة الخطأ من API Openai.
افتراضيًا ، OperationCanceledException طلب الإلغاء أو ChatService.Stop() إذا كنت لا ترغب في رميها (ذات صلة بالاستجابات البث) ، فيمكنك تعيين معلمة throwOnCancellation على false :
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory ، تعتمد سلامة سلسلة ChatGPT على تطبيق IChatHistoryStorage . إذا كنت تستخدم ChatGPTFactory مع إطار الكيان ، فهو ليس آمنًا للموضوع. فئة ChatService ليست آمنة مؤشر ترابط.
على أي حال ، تم تصميم هذه الخدمات لاستخدامها بأمان مع DI ، لذلك لا داعي للقلق بشأن ذلك.
تم تصميم جميع الطرق من جميع الحزم لاستخدامها في سياق Async واستخدام ConfigureAwait(false) (شكرًا على حزمة ConfigureAwait.Fody ).
نظرًا لأن 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 ).
تتوفر أمثلة أكثر تعقيدًا مع المصفوفات والأشياء المتداخلة والتعداد في الاختبارات:
chatgpt_api_dotnet/tests/openai.chatgpt.integrationTests/OpenAiclientTests/openaiclient_getstructureresponse.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-sigign-1a595dc5b405
أدناه المعلمات المدرجة ل chatCompletions API.
يتم تحديد نموذج الذكاء الاصطناعي لتوليد التنبؤ بواسطة معلمة المحرك. النماذج المتاحة موصوفة أدناه: 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 توربو |
| 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.GetMaxTokensLimitForModel طريقة.ChatCompletionMessage.CalculateApproxTotalTokenCountChatCompletionResponse.Usage.TotalTokens . كقاعدة عامة للغة الإنجليزية ، فإن الرمز المميز هو حوالي 4 أحرف (لذلك 100 رمز ≈ 75 كلمة). انظر Tokenizer من Openai: https://platform.openai.com/tokenizerما هي درجة حرارة أخذ العينات للاستخدام ، بين 0 و 2.
ChatCompletionTemperatures .ChatCompletionTemperatures.Balanced (0.5).الوصف: قبل تعيينه في الاحتمالات ، يقوم النموذج بإخراج قيم غير طبيعية (سجلات). عادة ما يتم استخدام سجلات السجلات مع وظيفة مثل softmax لتحويلها إلى احتمالات.
ولكن ، قبل تطبيق وظيفة softmax ، يمكننا استخدام خدعة مستوحاة من الديناميكا الحرارية وتوسيع نطاق السجلات بمعلمة درجة الحرارة ، أي softmax (سجلات/درجة الحرارة).
تعني معلمة درجة الحرارة القريبة من 1 أن السجلات يتم تمريرها من خلال وظيفة 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 ) ;
}أو مجرد إرسال سجل الرسائل كمجموعة.