OpenAI -Chat -Abschlüsse API -Integration (CHATGPT) in DI- und EF -Kernunterstützung. Sie können die API in Ihren .NET -Anwendungen verwenden. Außerdem unterstützt der Kunde Streaming -Antworten (wie ChatGPT) über asynchronisierte Streams.
AddChatGptEntityFrameworkIntegration erfordert nun builder.Configuration als obligatorische Parameter.StructuredResponse -Modul können Sie strukturierte Antworten von der API als C# -Objekt abrufen. Siehe: StructuredResponse -Abschnitt. Zunächst müssen Sie ein OpenAI -Konto erstellen und einen API -Schlüssel (oder OpenRouter oder Azure OpenAI) erhalten. Sie können dies unter https://platform.openai.com/account/api-keys tun.
Der einfachste Weg, den ChatGPT -Service in Ihrem .NET -Projekt mit DI und Persistenz (EF Core) zu verwenden, besteht darin, das Nuget -Paket OpenAI.Chatgpt.EntityFrameworkCore zu installieren:
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
Wenn Sie EF Core nicht verwenden möchten, können Sie das Paket openai.chatgpt.aspnetcore installieren und Ihren eigenen Speicher für den Chat -Historie mithilfe von IChatHistoryStorage -Schnittstelle implementieren.
TL; DR: Siehe ein Beispiel in einem Referenzprojekt.
appsettings.json (nicht sicher): {
"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 "
}
} Außerdem können Sie den OpenAI -API -Schlüssel als Umgebungsvariable ASPNETCORE_OpenAICredentials:ApiKey angeben.
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; Anstelle von options.UseSqlite("Data Source=chats.db") verwenden Sie Ihre eigene DB- und Verbindungszeichenfolge.
ChatGPTFactory und erstellen Sie ihn, um ChatGPT -Instanz zu erstellen: 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 ;
}
}Siehe Beispiel für Blazor.
Wenn Sie Anforderungsparameter konfigurieren möchten, können Sie dies in der Konfiguration appsettings.json oder in ChatGPTFactory.Create oder in ChatGPT.CreateChat -Methoden tun.
{
"ChatGPTConfig" : {
"InitialSystemMessage" : " You are a helpful and kind assistant. " ,
"InitialUserMessage" : null ,
"MaxTokens" : null ,
"Model" : null ,
"Temperature" : null ,
"PassUserIdToOpenAiRequests" : true
}
}Siehe Parameter Beschreibung in ChatgptConfig.
Wenn die Server -Antwort kein Erfolgsstatuscode ist, werfen der Client eine NotizerwartungResponsexception aus. Die Ausnahme enthält die Fehlermeldung von der OpenAI -API.
Standardmäßig wird das Aufrufen von Stornierungen oder ChatService.Stop() -Methoden OperationCanceledException werfen. Wenn Sie es nicht werfen möchten (relevant für Streaming -Antworten), können Sie den Parameter throwOnCancellation auf false einstellen:
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory , ChatGPT Klassen Thread-Safety hängt von der Implementierung IChatHistoryStorage ab. Wenn Sie ChatGPTFactory mit Entity Framework verwenden, ist es kein Thread-Safe. ChatService Klasse ist kein Thread-Safe.
Wie auch immer, diese Dienste sind so konzipiert, dass sie sicher mit DI verwendet werden können, sodass Sie sich keine Sorgen machen müssen.
Alle Methoden aller Pakete sind so konzipiert, dass sie im asynchronen Kontext verwendet werden und ConfigureAwait(false) (danke für das Paket ConfigureAwait.Fody ).
Da ChatGPTFactory von IHttpClientFactory abhängt, können Sie wie Polly problemlos eine der verfügbaren Richtlinien dafür verwenden.
Mit diesem Modul können Sie strukturierte Antworten von der API als C# -Objekt abrufen. Es ist nützlich, wenn Sie die API für etwas mehr als nur Chat verwenden möchten.
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 Unter der Haube verwendet es den neuen JSON-Modus der API für GPT4Turbo und für den gpt-3.5-turbo-1106 . Regelmäßige GPT4- und GPT3.5Turbo -Modelle werden ebenfalls unterstützt, aber GPT3.5 Antworten können instabil sein (für GPT3.5 wird es streng empfohlen, examples Parameter vorzulegen).
Komplexere Beispiele mit Arrays, verschachtelten Objekten und Aufzügen sind in Tests erhältlich:
CHATGPT_API_DOTNET/Tests/OpenAi.Chatgpt.IntegrationTests/openaiclientTests/openaiclient_getStructuredResponse.cs
Linie 1 in F50D386
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.struktururedResponse
Mit diesem Modul können Sie Nachrichten von einer Sprache in eine andere übersetzen.
string textToTranslate = " Hello, world! " ;
string translatedText = await _client . TranslateText ( textToTranslate , " English " , " Russian " ) ;
Console . WriteLine ( translatedText ) ; // "Привет, мир!" Außerdem ist es möglich, das gesamte Objekt zusammen mit StructuredResponse -Modul zu übersetzen:
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 " ) ;Siehe volles Beispiel in Tests:
CHATGPT_API_DOTNET/Tests/OpenAi.Chatgpt.IntegrationTests/ChatgptTranslatorServicetests.cs
Linie 36 in 11658b7
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.translator
Hier finden Sie eine Liste der Hauptparameter, die in der API -Anforderung (ChatCompletions) verwendet werden können (OpenAI.Chatgpt/Models/ChatCompletion/chatCompletionRequest.cs). Einige von ihnen stammen aus diesem Artikel: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
Unten aufgeführte Parameter für ChatCompletions -API.
Das Vorhersage-erzeugende KI-Modell wird durch den Motorparameter angegeben. Die verfügbaren Modelle werden unten beschrieben: https://platform.openai.com/docs/models
| C# Modell | API -Modell |
|---|---|
| ChatCompletionModels.gpt4turbo | GPT-4-1106-Präview |
| 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 |
Die maximale Anzahl von Token ermöglichte die generierte Antwort. Standardmäßig ChatCompletionRequest.MaxTokensDefault (64).
ChatCompletionModels.GetMaxTokensLimitForModel validiert und begrenzt.ChatCompletionMessage.CalculateApproxTotalTokenCount -Methode annähernd Token zu berechnen.ChatCompletionResponse.Usage.TotalTokens . Als Faustregel für Englisch ist 1 Token etwa 4 Zeichen (also 100 Token ≈ 75 Wörter). Sehen Sie Tokenizer von OpenAI: https://platform.openai.com/tokenizerWelche Probenahmetemperatur zu verwenden, zwischen 0 und 2.
ChatCompletionTemperatures verfügbar.ChatCompletionTemperatures.Balanced (0,5).Beschreibung: Bevor das Modell in Wahrscheinlichkeiten zugeordnet wird, gibt es nicht operormalisierte Werte (Logits) aus. Die Logits werden normalerweise mit einer Funktion wie Softmax verwendet, um sie in Wahrscheinlichkeiten umzuwandeln.
Bevor wir jedoch die Softmax -Funktion anwenden, können wir einen von der Thermodynamik inspirierten Trick verwenden und die Logits mit dem Temperaturparameter, dh Softmax (Logits/Temperatur), skalieren.
Ein Temperaturparameter in der Nähe von 1 würde bedeuten, dass die Logits ohne Modifikation durch die Softmax -Funktion geleitet werden. Wenn die Temperatur nahe Null liegt, wird der höchste wahrscheinliche Token im Vergleich zu den anderen Token sehr wahrscheinlich, dh das Modell wird deterministischer und gibt immer den gleichen Satz von Token nach einer bestimmten Wörterabfolge aus.
Weitere Parameter beschreiben finden
Wenn Sie kein DI- und Chat -Verlauf benötigen, können Sie nur das Nuget -Paket OpenAi.chatgpt verwenden:
Install-Package OpenAI.ChatGPT
Erstellen Sie dann eine Instanz von 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 ) ;
} Verwenden Sie ThenAssistant und ThenUser Methoden, um einen Dialog zu erstellen:
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 ) ;
}Oder senden Sie einfach den Nachrichtenverlauf als Sammlung.