Integración API de finalización de chat de OpenAI (CHATGPT) con soporte DI y EF Core. Le permite usar la API en sus aplicaciones .NET. Además, el cliente admite respuestas de transmisión (como CHATGPT) a través de async transmisiones.
AddChatGptEntityFrameworkIntegration ahora requiere builder.Configuration como parámetro obligatorio.StructuredResponse le permite obtener respuestas estructuradas de la API como objeto C#. Ver: Sección de respuesta estructurada. Primero, debe crear una cuenta de OpenAI y obtener una clave API (o OpenRouter o Azure OpenAI). Puede hacer esto en https://platform.openai.com/account/api-keys.
La forma más fácil de utilizar el servicio ChatGPT en su proyecto .NET con DI y Persistencia (EF Core) Soporte es instalar el paquete Nuget OpenAI.CHATGPT.EntityFrameWorkcore:
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
Si no desea usar EF Core, puede instalar el paquete OpenAI.Chatgpt.aspnetCore e implementar su propio almacenamiento para el historial de chat, utilizando la interfaz IChatHistoryStorage .
Tl; dr: ver un ejemplo en un proyecto de referencia.
appsettings.json (no 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 "
}
} Además, puede especificar la tecla API de OpenAI como variable de entorno ASPNETCORE_OpenAICredentials:ApiKey .
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; En lugar de options.UseSqlite("Data Source=chats.db") Use su propia DB y cadena de conexión.
ChatGPTFactory a su servicio y úselo para crear instancia 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 ;
}
}Ver ejemplo de Blazor.
Si desea configurar los parámetros de solicitud, puede hacerlo en la configuración appsettings.json o en ChatGPTFactory.Create o en los métodos ChatGPT.CreateChat .
{
"ChatGPTConfig" : {
"InitialSystemMessage" : " You are a helpful and kind assistant. " ,
"InitialUserMessage" : null ,
"MaxTokens" : null ,
"Model" : null ,
"Temperature" : null ,
"PassUserIdToOpenAiRequests" : true
}
}Vea los parámetros Descripción dentro de Chatgptonfig.
Si la respuesta del servidor no es un código de estado de éxito, el cliente lanzará una NopectedResponsexception. La excepción contendrá el mensaje de error de la API de OpenAI.
Por defecto, solicitar cancelación o ChatService.Stop() La llamada del método lanzará OperationCanceledException . Si no desea lanzarlo (relevante para las respuestas de transmisión), puede establecer el parámetro throwOnCancellation en false :
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory , ChatGPT Classes Thread-Safety depende de la implementación IChatHistoryStorage . Si usa ChatGPTFactory con Entity Framework, no es seguro de hilo. La clase ChatService no es segura de hilo.
De todos modos, estos servicios están diseñados para usarse de manera segura con DI, por lo que no necesita preocuparse por ello.
Todos los métodos de todos los paquetes están diseñados para usarse en el contexto de Async y usar ConfigureAwait(false) (gracias por el paquete ConfigureAwait.Fody ).
Dado que ChatGPTFactory depende de IHttpClientFactory , puede usar fácilmente cualquiera de las políticas disponibles para ello, como Polly .
Este módulo le permite obtener respuestas estructuradas de la API como objeto C#. Es útil si quieres usar la API para algo más que chatear.
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 Debajo del capó, utiliza el nuevo modo JSON de la API para GPT4Turbo y para el gpt-3.5-turbo-1106 . También se admiten modelos regulares de GPT4 y GPT3.5Turbo, pero las respuestas GPT3.5 pueden ser inestables (para GPT3.5 se recomienda estrictamente para proporcionar un parámetro examples ).
Ejemplos más complejos con matrices, objetos anidados y enums están disponibles en las pruebas:
Chatgpt_api_dotnet/tests/openAI.Chatgpt.ingrationTests/OpenAiClientTests/OpenAiClient_GetStructiveResponse.cs
Línea 1 en F50D386
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.structiveResponse
Este módulo le permite traducir mensajes de un idioma a otro.
string textToTranslate = " Hello, world! " ;
string translatedText = await _client . TranslateText ( textToTranslate , " English " , " Russian " ) ;
Console . WriteLine ( translatedText ) ; // "Привет, мир!" Además, es posible traducir todo el objeto en par con el módulo de 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 " ) ;Ver ejemplo completo en las pruebas:
Chatgpt_api_dotnet/tests/openAi.chatgpt.ingrationTests/chatgptTranslatorservicetests.cs
Línea 36 en 11658b7
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.translator
Aquí hay una lista de los parámetros principales que se pueden usar en la solicitud de API de chatCompletions (chatgpt) (openAI.CHATGPT/modelos/chatcompletion/chatcompletionRequest.cs). Algunos de ellos se toman de este artículo: https://towardsdatascience.com/gpt-3-3-parameters-and-prompt-Design-1a595dc5b405
A continuación, los parámetros enumerados para la API ChatCompletions.
El modelo de IA generador de predicción es especificado por el parámetro del motor. Los modelos disponibles se describen a continuación: https://platform.openai.com/docs/models
| Modelo C# | Modelo API |
|---|---|
| ChatCompletionModels.gpt4turbo | GPT-4-1106 previa |
| 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 |
El número máximo de tokens permitidos para la respuesta generada. El valor predeterminado es ChatCompletionRequest.MaxTokensDefault (64).
ChatCompletionModels.GetMaxTokensLimitForModel Método.ChatCompletionMessage.CalculateApproxTotalTokenCount MethodChatCompletionResponse.Usage.TotalTokens . Como regla general para el inglés, 1 token es de alrededor de 4 caracteres (por lo que 100 tokens ≈ 75 palabras). Ver tokenizer de OpenAI: https://platform.openai.com/tokenizerQué temperatura de muestreo para usar, entre 0 y 2.
ChatCompletionTemperatures .ChatCompletionTemperatures.Balanced (0.5).Descripción: Antes de ser asignado a las probabilidades, el modelo genera valores no anormalizados (logits). Los logits se usan típicamente con una función como Softmax para convertirlos en probabilidades.
Pero, antes de aplicar la función Softmax, podemos usar un truco inspirado en la termodinámica y escalar los logits con el parámetro de temperatura, es decir, Softmax (logits/temperatura).
Un parámetro de temperatura cercano a 1 significaría que los logits pasan a través de la función Softmax sin modificación. Si la temperatura es cercana a cero, los tokens más altos serán muy probables en comparación con los otros tokens, es decir, el modelo se vuelve más determinista y siempre generará el mismo conjunto de tokens después de una secuencia dada de palabras.
Más parámetros, se puede encontrar una descripción aquí: algunos de ellos se toman de este artículo: https://towardsdatascience.com/gpt-3-3parameters-and-prompt-diseño-1a595dc5b405
Si no necesita DI y Historial de chat, solo puede usar el paquete Nuget OpenAI.Chatgpt:
Install-Package OpenAI.ChatGPT
Luego cree una instancia de 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 ) ;
} Utilice métodos ThenAssistant y ThenUser para crear un 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 ) ;
}O simplemente envíe el historial de mensajes como una colección.