Intégration de l'API (ChatGPT) OpenAAI Chat Completion (ChatGPT) avec le support DI et EF Core. Il vous permet d'utiliser l'API dans vos applications .NET. En outre, le client prend en charge les réponses en streaming (comme ChatGpt) via des flux asynchrones.
AddChatGptEntityFrameworkIntegration nécessite désormais builder.Configuration en tant que paramètre obligatoire.StructuredResponse vous permet d'obtenir des réponses structurées de l'API comme objet C #. Voir: Section structurée de réponse. Tout d'abord, vous devez créer un compte OpenAI et obtenir une clé API (ou OpenRouter ou Azure OpenAI). Vous pouvez le faire sur https://platform.openai.com/Account/api-Keys.
La façon la plus simple d'utiliser le service Chatgpt dans votre projet .NET avec DI et Persistence (EF Core) est d'installer le package NuGet Openai.Chatgpt.EntityFrameworkcore:
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
Si vous ne souhaitez pas utiliser EF Core, vous pouvez installer le package openai.chatgpt.aspnetcore et implémenter votre propre stockage pour l'historique de chat, en utilisant l'interface IChatHistoryStorage .
TL; DR: Voir un exemple dans un projet de référence.
appsettings.json (pas sûr): {
"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 "
}
} En outre, vous pouvez spécifier la clé de l'API OpenAI en tant qu'environnement variable ASPNETCORE_OpenAICredentials:ApiKey .
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; Au lieu d' options.UseSqlite("Data Source=chats.db") Utilisez votre propre chaîne de base de données et de connexion.
ChatGPTFactory à votre service et utilisez-le pour créer une 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 ;
}
}Voir l'exemple du blazor.
Si vous souhaitez configurer les paramètres de demande, vous pouvez le faire dans appsettings.json Configuration ou dans ChatGPTFactory.Create ou dans les méthodes ChatGPT.CreateChat .
{
"ChatGPTConfig" : {
"InitialSystemMessage" : " You are a helpful and kind assistant. " ,
"InitialUserMessage" : null ,
"MaxTokens" : null ,
"Model" : null ,
"Temperature" : null ,
"PassUserIdToOpenAiRequests" : true
}
}Voir Paramètres Description Dans ChatGptConfig.
Si la réponse du serveur n'est pas un code d'état de réussite, le client lancera une note de réponse nominale. L'exception contiendra le message d'erreur de l'API OpenAI.
Par défaut, la demande d'annulation ou ChatService.Stop() appellera OperationCanceledException . Si vous ne voulez pas le lancer (pertinent pour les réponses en streaming), vous pouvez définir le paramètre throwOnCancellation sur false :
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory , les classes ChatGPT , le fil de file dépend de l'implémentation IChatHistoryStorage . Si vous utilisez ChatGPTFactory avec Entity Framework, ce n'est pas un filetage. La classe ChatService n'est pas une file d'attente.
Quoi qu'il en soit, ces services sont conçus pour être utilisés en toute sécurité avec DI, vous n'avez donc pas à vous en soucier.
Toutes les méthodes de tous les packages sont conçues pour être utilisées dans le contexte asynchrone et utilisent ConfigureAwait(false) (merci pour le package ConfigureAwait.Fody ).
Étant donné que ChatGPTFactory dépend de IHttpClientFactory , vous pouvez facilement utiliser l'une des politiques disponibles pour cela, comme Polly .
Ce module vous permet d'obtenir des réponses structurées de l'API comme objet C #. C'est utile si vous souhaitez utiliser l'API pour quelque chose de plus que de discuter.
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 Sous le capot, il utilise le nouveau mode JSON de l'API pour GPT4Turbo et pour le gpt-3.5-turbo-1106 . Les modèles réguliers GPT4 et GPT3.5Turbo sont également pris en charge, mais les réponses GPT3.5 peuvent être instables (pour GPT3.5, il est strictement recommandé de fournir un paramètre examples ).
Des exemples plus complexes avec des tableaux, des objets imbriqués et des énumérations sont disponibles dans les tests:
Chatgpt_API_DOTNET / TESTS / OpenAI.chatgpt.integrationtests / openaiclienttests / openaiclient_getstructuredResponse.cs
Ligne 1 en F50d386
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.structuredResponse
Ce module vous permet de traduire les messages d'une langue à une autre.
string textToTranslate = " Hello, world! " ;
string translatedText = await _client . TranslateText ( textToTranslate , " English " , " Russian " ) ;
Console . WriteLine ( translatedText ) ; // "Привет, мир!" De plus, il est possible de traduire l'objet entier en paire avec le module 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 " ) ;Voir l'exemple complet dans les tests:
Chatppt_api_dotnet / tests / openai.chatgpt.integrationtests / chatppttranslatorserviceTes.cs
Ligne 36 en 11658b7
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.translateur
Voici une liste des principaux paramètres qui peuvent être utilisés dans la demande API ChatCompletions (ChatGPT) (Openai.Chatgpt / Modèles / ChatCompletion / ChatCompletionRequest.cs). Certains d'entre eux sont tirés de cet article: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
Ci-dessous paramètres répertoriés pour l'API ChatCompletions.
Le modèle AI générant de prédiction est spécifié par le paramètre du moteur. Les modèles disponibles sont décrits ci-dessous: https://platform.openai.com/docs/models
| Modèle C # | Modèle 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 |
Le nombre maximum de jetons a permis la réponse générée. Par défaut à ChatCompletionRequest.MaxTokensDefault (64).
ChatCompletionModels.GetMaxTokensLimitForModel .ChatCompletionMessage.CalculateApproxTotalTokenCountChatCompletionResponse.Usage.TotalTokens . En règle générale pour l'anglais, 1 jeton est d'environ 4 caractères (donc 100 jetons ≈ 75 mots). Voir Tokenizer d'Openai: https://platform.openai.com/tokizerQuelle température d'échantillonnage à utiliser, entre 0 et 2.
ChatCompletionTemperatures .ChatCompletionTemperatures.Balanced .Description: Avant d'être mappé en probabilités, le modèle produit des valeurs non normalisées (logits). Les logits sont généralement utilisés avec une fonction telle que SoftMax pour les convertir en probabilités.
Mais, avant d'appliquer la fonction Softmax, nous pouvons utiliser une astuce inspirée de la thermodynamique et à l'échelle des logits avec le paramètre de température, c'est-à-dire Softmax (logits / température).
Un paramètre de température proche de 1 signifierait que les logits sont passés à travers la fonction Softmax sans modification. Si la température est proche de zéro, les jetons probables les plus élevés deviendront très probables par rapport aux autres jetons, c'est-à-dire que le modèle devient plus déterministe et sortira toujours le même ensemble de jetons après une séquence de mots donnée.
Plus de paramètres Description peut être trouvé ici: Certains d'entre eux sont tirés de cet article: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
Si vous n'avez pas besoin d'historique de DI et de chat, vous pouvez utiliser uniquement le package NuGet Openai.chatgpt:
Install-Package OpenAI.ChatGPT
Créez ensuite une instance d' 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 ) ;
} Utilisez des méthodes ThenAssistant et ThenUser pour créer une boîte de dialogue:
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 ) ;
}Ou envoyez simplement l'historique des messages en tant que collection.