Integração da API (ChatGPT) de conclusão de bate -papo do OpenAI com suporte a DI e EF Core. Ele permite que você use a API em seus aplicativos .NET. Além disso, o cliente suporta respostas de streaming (como ChatGPT) via fluxos assíncronos.
AddChatGptEntityFrameworkIntegration agora requer builder.Configuration como um parâmetro obrigatório.StructuredResponse permite obter respostas estruturadas da API como objeto C#. Veja: Seção StructuredResponse. Primeiro, você precisa criar uma conta OpenAI e obter uma chave da API (ou OpenRouter ou Azure Openai). Você pode fazer isso em https://platform.openai.com/account/api-keys.
A maneira mais fácil de usar o serviço ChatGPT em seu projeto .NET com DI e persistência (EF Core) Suporte é instalar o Nuget Package OpenAi.chatgpt.entityframeworkcore:
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
Se você não deseja usar o EF Core, pode instalar o pacote openi.chatgpt.aspnetcore e implementar seu próprio armazenamento para o histórico de bate -papo, usando a interface IChatHistoryStorage .
TL; DR: Veja um exemplo em um projeto de referência.
appsettings.json (não seguro): {
"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 "
}
} Além disso, você pode especificar a chave da API do OpenAI como variável de ambiente ASPNETCORE_OpenAICredentials:ApiKey .
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; Em vez de options.UseSqlite("Data Source=chats.db") Use seu próprio banco de dados e string de conexão.
ChatGPTFactory para o seu serviço e use -o para criar a instância 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 ;
}
}Veja o Blazor Exemplo.
Se você deseja configurar os parâmetros de solicitação, pode fazê -lo na configuração appsettings.json ou no ChatGPTFactory.Create ou nos métodos ChatGPT.CreateChat .
{
"ChatGPTConfig" : {
"InitialSystemMessage" : " You are a helpful and kind assistant. " ,
"InitialUserMessage" : null ,
"MaxTokens" : null ,
"Model" : null ,
"Temperature" : null ,
"PassUserIdToOpenAiRequests" : true
}
}Consulte Parâmetros Descrição Inside ChatGptConfig.
Se a resposta do servidor não for um código de status de sucesso, o cliente lançará uma nota considerada resposta. A exceção conterá a mensagem de erro da API OpenAI.
Por padrão, solicitar cancelamento ou ChatService.Stop() A chamada do método lançará OperationCanceledException . Se você não quiser jogá -lo (relevante para respostas de streaming), você pode definir o parâmetro throwOnCancellation como false :
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory , as classes ChatGPT -segurança depende da implementação IChatHistoryStorage . Se você usar ChatGPTFactory com a Entity Framework, ele não é seguro para threads. A classe ChatService não é seguro para threads.
De qualquer forma, esses serviços são projetados para serem usados com segurança com DI, para que você não precise se preocupar com isso.
Todos os métodos de todos os pacotes foram projetados para serem usados no contexto assíncrono e use ConfigureAwait(false) (obrigado pelo pacote ConfigureAwait.Fody ).
Como ChatGPTFactory depende do IHttpClientFactory , você pode usar facilmente qualquer uma das políticas disponíveis, como Polly .
Este módulo permite obter respostas estruturadas da API como objeto C#. É útil se você deseja usar a API para algo mais do que apenas conversar.
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 Sob o capô, ele usa o novo modo JSON da API para GPT4Turbo e para o gpt-3.5-turbo-1106 . Os modelos regulares GPT4 e GPT3.5Turbo também são suportados, mas as respostas do GPT3.5 podem ser instáveis (para GPT3.5, é estritamente recomendado para fornecer examples de parâmetro).
Exemplos mais complexos com matrizes, objetos e enumes aninhados estão disponíveis em testes:
ChatGPT_API_DOTNET/TESTS/OPENAI.CHATGPT.IntegrationTests/OpenAiclientTests/OpenAiclient_GetStructUredResponse.cs
Linha 1 em f50d386
NUGET: https://www.nuget.org/packages/openai.chatgpt.modules.structuredResponse
Este módulo permite que você traduz mensagens de um idioma para outro.
string textToTranslate = " Hello, world! " ;
string translatedText = await _client . TranslateText ( textToTranslate , " English " , " Russian " ) ;
Console . WriteLine ( translatedText ) ; // "Привет, мир!" Além disso, é possível traduzir todo o objeto em par com o módulo 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 " ) ;Veja o exemplo completo nos testes:
ChatGPT_API_DOTNET/TESTS/OPENAI.CHATGPT.IntegrationTests/ChatGptTranslatorserviceTests.cs
Linha 36 em 11658b7
NUGET: https://www.nuget.org/packages/openai.chatgpt.modules.translator
Aqui está uma lista dos principais parâmetros que podem ser usados no ChatCompletions (ChatGPT) API Request (OpenAI.CHATGPT/Models/ChatCompletion/ChatCompletionRequest.cs). Alguns deles são retirados deste artigo: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
Abaixo parâmetros listados para a API ChatCompletions.
O modelo AI gerador de previsão é especificado pelo parâmetro do motor. Os modelos disponíveis estão descritos abaixo: https://platform.openai.com/docs/models
| C# modelo | Modelo API |
|---|---|
| ChatCompletionModels.gpt4turbo | GPT-4-1106-PREVISÃO |
| 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 |
O número máximo de tokens permitiu a resposta gerada. Padrões para ChatCompletionRequest.MaxTokensDefault (64).
ChatCompletionModels.GetMaxTokensLimitForModel .ChatCompletionMessage.CalculateApproxTotalTokenCount Method.ChatCompletionResponse.Usage.TotalTokens . Como regra geral para o inglês, 1 token tem cerca de 4 caracteres (então 100 tokens ≈ 75 palavras). Veja o Tokenizer do OpenAi: https://platform.openai.com/tokenizerQue temperatura de amostragem para usar, entre 0 e 2.
ChatCompletionTemperatures .ChatCompletionTemperatures.Balanced (0,5).Descrição: Antes de ser mapeado em probabilidades, o modelo produz valores não formalizados (logits). Os logits são normalmente usados com uma função como o Softmax para convertê -los em probabilidades.
Mas, antes de aplicar a função Softmax, podemos usar um truque inspirado na termodinâmica e escalar os logits com o parâmetro de temperatura, ou seja, softmax (logits/temperatura).
Um parâmetro de temperatura próximo a 1 significaria que os logits são passados através da função Softmax sem modificação. Se a temperatura estiver próxima de zero, os tokens mais altos se tornarão muito prováveis em comparação com os outros tokens, ou seja, o modelo se tornará mais determinístico e sempre produzirá o mesmo conjunto de tokens após uma determinada sequência de palavras.
Mais parâmetros Descrição podem ser encontrados aqui: Alguns deles são retirados deste artigo: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
Se você não precisa de DI e Histórico de bate -papo, pode usar apenas o pacote Nuget Openai.chatgpt:
Install-Package OpenAI.ChatGPT
Em seguida, crie uma instância do 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 ) ;
} Use os métodos ThenAssistant e ThenUser para criar uma caixa de diálogo:
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 apenas envie o histórico de mensagens como uma coleção.