Integrasi OpenAI CHAT CHAT CHAT CHAT (CHATGPT) dengan dukungan inti DI dan EF. Ini memungkinkan Anda untuk menggunakan API di aplikasi .net Anda. Juga, klien mendukung respons streaming (seperti chatgpt) melalui stream async.
AddChatGptEntityFrameworkIntegration sekarang membutuhkan builder.Configuration sebagai parameter wajib.StructuredResponse memungkinkan Anda mendapatkan respons terstruktur dari API sebagai objek C#. Lihat: Bagian Respon Struktur. Pertama, Anda perlu membuat akun OpenAI dan mendapatkan kunci API (atau OpenRouter atau Azure Openai). Anda dapat melakukan ini di https://platform.openai.com/account/api-keys.
Cara termudah untuk menggunakan layanan chatgpt di proyek .NET Anda dengan DI dan Kegistence (EF Core) yang mendukung adalah untuk menginstal paket nuget openai.chatgpt.entityframeworkCore:
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
Jika Anda tidak ingin menggunakan EF Core, Anda dapat menginstal paket openai.chatgpt.aspnetcore dan menerapkan penyimpanan Anda sendiri untuk riwayat obrolan, menggunakan antarmuka IChatHistoryStorage .
TL; DR: Lihat contoh dalam proyek referensi.
appsettings.json (tidak aman): {
"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 "
}
} Juga, Anda dapat menentukan kunci API OpenAi sebagai variabel lingkungan ASPNETCORE_OpenAICredentials:ApiKey .
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; Alih -alih options.UseSqlite("Data Source=chats.db") Gunakan DB dan string koneksi Anda sendiri.
ChatGPTFactory ke layanan Anda dan gunakan untuk membuat instance 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 ;
}
}Lihat contoh Blazor.
Jika Anda ingin mengkonfigurasi parameter permintaan, Anda dapat melakukannya di konfigurasi appsettings.json atau di ChatGPTFactory.Create atau di metode ChatGPT.CreateChat .
{
"ChatGPTConfig" : {
"InitialSystemMessage" : " You are a helpful and kind assistant. " ,
"InitialUserMessage" : null ,
"MaxTokens" : null ,
"Model" : null ,
"Temperature" : null ,
"PassUserIdToOpenAiRequests" : true
}
}Lihat Parameter Deskripsi di dalam chatgptConfig.
Jika respons server bukan kode status sukses, klien akan melempar NotexpectedResponseException. Pengecualian akan berisi pesan kesalahan dari API OpenAI.
Secara default, meminta metode pembatalan atau ChatService.Stop() panggilan akan melempar OperationCanceledException . Jika Anda tidak ingin membuangnya (relevan untuk respons streaming), Anda dapat mengatur parameter throwOnCancellation ke false :
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory , kelas-kelas ChatGPT safe-safety tergantung pada implementasi IChatHistoryStorage . Jika Anda menggunakan ChatGPTFactory dengan Entity Framework, itu tidak aman. Kelas ChatService tidak aman.
Ngomong -ngomong, layanan ini dirancang untuk digunakan dengan aman dengan DI, jadi Anda tidak perlu mengkhawatirkannya.
Semua metode dari semua paket dirancang untuk digunakan dalam konteks async dan menggunakan ConfigureAwait(false) (terima kasih untuk paket ConfigureAwait.Fody ).
Karena ChatGPTFactory tergantung pada IHttpClientFactory , Anda dapat dengan mudah menggunakan polis yang tersedia untuk itu, seperti Polly .
Modul ini memungkinkan Anda untuk mendapatkan respons terstruktur dari API sebagai objek C#. Ini berguna jika Anda ingin menggunakan API untuk sesuatu yang lebih dari sekadar mengobrol.
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 Di bawah kap, ia menggunakan mode JSON baru dari API untuk GPT4turbo dan untuk gpt-3.5-turbo-1106 . Model GPT4 dan GPT3.5Turbo biasa juga didukung, tetapi tanggapan GPT3.5 mungkin tidak stabil (untuk GPT3.5 sangat disarankan untuk memberikan examples parameter).
Contoh yang lebih kompleks dengan array, benda dan enum bersarang tersedia dalam pengujian:
Chatgpt_api_dotnet/tes/openai.chatgpt.integrationtests/openaiclienttests/openaiclient_getStructuredResponse.cs
Baris 1 di F50D386
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.strukturedResponse
Modul ini memungkinkan Anda untuk menerjemahkan pesan dari satu bahasa ke bahasa lain.
string textToTranslate = " Hello, world! " ;
string translatedText = await _client . TranslateText ( textToTranslate , " English " , " Russian " ) ;
Console . WriteLine ( translatedText ) ; // "Привет, мир!" Juga, dimungkinkan untuk menerjemahkan seluruh objek secara berpasangan dengan modul 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 " ) ;Lihat contoh lengkap dalam tes:
Chatgpt_api_dotnet/tes/openai.chatgpt.integrationtests/chatgpttranslatorservicetests.cs
Baris 36 di 11658b7
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.translator
Berikut adalah daftar parameter utama yang dapat digunakan dalam permintaan API chatcompletions (chatgpt) (openai.chatgpt/model/chatcompletion/chatcompletionrequest.cs). Beberapa dari mereka diambil dari artikel ini: https://towardsdatacience.com/gpt-3-parameters-and-pompt-design-1a595dc5b405
Di bawah parameter terdaftar untuk chatcompletions API.
Model AI yang menghasilkan prediksi ditentukan oleh parameter mesin. Model yang tersedia dijelaskan di bawah ini: https://platform.openai.com/docs/models
| Model C# | Model 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 |
Jumlah maksimum token yang diizinkan untuk jawaban yang dihasilkan. Default ke ChatCompletionRequest.MaxTokensDefault (64).
ChatCompletionModels.GetMaxTokensLimitForModel .ChatCompletionMessage.CalculateApproxTotalTokenCountChatCompletionResponse.Usage.TotalTokens . Sebagai aturan praktis untuk bahasa Inggris, 1 token adalah sekitar 4 karakter (jadi 100 token ≈ 75 kata). Lihat Tokenizer dari Openai: https://platform.openai.com/tokenizerSuhu pengambilan sampel apa yang digunakan, antara 0 dan 2.
ChatCompletionTemperatures .ChatCompletionTemperatures.Balanced (0,5).Deskripsi: Sebelum dipetakan ke dalam probabilitas, model mengeluarkan nilai yang tidak diformalkan (logit). Logit biasanya digunakan dengan fungsi seperti Softmax untuk mengubahnya menjadi probabilitas.
Tetapi, sebelum menerapkan fungsi softmax, kita dapat menggunakan trik yang terinspirasi oleh termodinamika dan skala logit dengan parameter suhu, yaitu softmax (logit/suhu).
Parameter suhu yang mendekati 1 akan berarti bahwa logit dilewatkan melalui fungsi softmax tanpa modifikasi. Jika suhu mendekati nol, token kemungkinan tertinggi akan menjadi sangat mungkin dibandingkan dengan token lain, yaitu model menjadi lebih deterministik dan akan selalu menghasilkan set token yang sama setelah urutan kata yang diberikan.
Lebih Banyak Parameter Deskripsi dapat ditemukan di sini: beberapa di antaranya diambil dari artikel ini: https://towardsdatascience.com/gpt-3-parameters-and-pompt-design-1a595dc5b405
Jika Anda tidak memerlukan riwayat obrolan di dan obrolan, Anda hanya dapat menggunakan paket nuget openai.chatgpt:
Install-Package OpenAI.ChatGPT
Kemudian buat instance 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 ) ;
} Gunakan Metode ThenAssistant dan ThenUser untuk membuat dialog:
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 ) ;
}Atau hanya mengirim riwayat pesan sebagai koleksi.