csharp-chatgpt

Cómo usar ChatGPT desde C#

Betalgo.OpenAI es una biblioteca de C# que nos permite emplear los servicios de OpenAI, como ChatGPT o Dall-E, desde una aplicación de .NET

OpenAI es una organización de investigación en inteligencia artificial creadores, entre otros, de los populares modelos Dall-E y ChatGPT. Salvo que hayas estado desconectado los últimos meses, lo más probable es que al menos te suenen estas dos utilidades de OpenAI.

DALL-E es un modelo de aprendizaje profundo que genera imágenes a partir de descripciones textuales. Por su parte, ChatGPT es una librería de procesamiento del lenguaje natural basada en la arquitectura GPT (Generative Pre-trained Transformer) que permite crear chatbots y sistemas de diálogo de alta calidad.

Estos servicios disponen de un API que podemos emplear para usar estos servicios desde nuestros programas. No existe un API oficial para C#, pero han surgido distintas bibliotecas que nos permiten conectarnos con el API de OpenAI desde .NET.

Hoy vamos a ver Betalgo.OpenAI, que por el momento es la más popular para C#, y desde luego a mi es la que más me ha gustado.

Configurar OpenAI para trabajar con C#

Antes de comenzar a utilizar ChatGPT en C#, es necesario configurar la API key de OpenAI en el entorno de desarrollo.

Para ello accedemos a esta dirección https://platform.openai.com/account/api-keys y creamos un nuevo API Key para nuestro cuenta.

Evidentemente, no compartáis el código con nadie

Deberemos asociar una tarjeta de crédito para poder realizar los pagos. No obstante, para vuestra tranquilidad, es posible poner un límite de uso.

Cuanto cuesta OpenAI

En cuanto al precio depende de la funcionalidad que queramos hacer. Pero, por ahora, en mi opinión es realmente barato.

Por ejemplo, generar un texto con ChatGPT (modelo gpt-3.5-turbo) cuesta $0.002 / 1K tokens. 1 token es una medida relacionada con la longitud del mensaje (prompt + response). Aproximadamente,

  • En inglés tokens = 1.25 * número palabras
  • En castellano tokens = 2.00 * número palabras

Es decir, que una respuesta larga (2000) tokens cuesta 0.004$. Es decir, tendríais que hacer 1000 solicitudes “largas” para gastar 2$. Lo cuál me parece muy barato.

Aquí tenéis una herramienta para estimar el número de tokens de un texto https://platform.openai.com/tokenizer

Truquito, si queréis ahorrar dinero, hacer los prompts repetitivos y largos en inglés, y pedir que os responda en castellano

Por otro lado, generar una imagen con Dall-E tiene un coste de 0.020$ para una resolución de 1024x1024. Es decir, tendríais que generar 100 imágenes para gastar 2$.

Para ver el precio del resto de servicios, consultar la documentación oficial disponible en https://openai.com/pricing

Cómo usar Betalgo.OpenAI

Una vez configurada la API key, es posible utilizar los servicios de OpenAI desde C#. Para ello voy a usar la librería Betalgo.OpenAI, que como he dicho por el momento me parece la más completa.

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package Betalgo.OpenAI

Aquí tenéis algunos de cómo utilizar Betalgo.OpenAI extraídos de la documentación de la librería

Usar ChatGPT con C#

Hacer un diálogo con ChatGPT es muy sencillo. Únicamente instanciamos el Servicio con nuestro ApiKey, y usamos la función “CreateCompletition’

using OpenAI.GPT3.ObjectModels.RequestModels;
using OpenAI.GPT3.ObjectModels;
using OpenAI.GPT3.Managers;
using OpenAI.GPT3;

var openAiService = new OpenAIService(new OpenAiOptions()
{
    ApiKey = "tu_api_key",
});

var completionResult = await openAiService.ChatCompletion.CreateCompletion(new ChatCompletionCreateRequest
{
    Messages = new List<ChatMessage>
    {
        ChatMessage.FromSystem("You are a helpful assistant."),
        ChatMessage.FromUser("Who won the world series in 2020?"),
        ChatMessage.FromAssistant("The Los Angeles Dodgers won the World Series in 2020."),
        ChatMessage.FromUser("Where was it played?")
    },
    Model = Models.ChatGpt3_5Turbo,
    MaxTokens = 1000,
    Temperature = 0.7f,
    TopP = 1,
    PresencePenalty = 0,
    FrequencyPenalty = 0,
});

if (completionResult.Successful)
{
    Console.WriteLine(completionResult.Choices.First().Message.Content);
}

Como vemos, podemos simular conversaciones completas, incluyendo mensajes de System, User y Assistant. En general, en muchos casos únicamente querremos un único System + User, o incluso sólo User.

Usar Dall-E con C#

Crear una imagen con Dall-E es incluso más sencillo. Simplemente tenemos que hacer.

var imageResult = await openAiService.Image.CreateImage(new ImageCreateRequest
{
    Prompt = "Laser cat eyes",
    N = 2,
    Size = StaticValues.ImageStatics.Size.Size256,
    ResponseFormat = StaticValues.ImageStatics.ResponseFormat.Url,
    User = "TestUser"
});

Usar Moderation

Moderation es un servicio de OpenAI que permite determinar la intención de un texto. Devuelve un array con las puntuaciones en categorías como ‘hate’, ‘violence’, ‘self-harm’, entre otras.

var moderationResponse = await openAiService.Moderation.CreateModeration(new CreateModerationRequest()
{
   Input = "I want to kill them."
});

if (moderationResponse.Results.FirstOrDefault()?.Flagged != true)
{
   ConsoleExtensions.WriteLine("Create Moderation test failed", ConsoleColor.DarkRed);
}

ConsoleExtensions.WriteLine("Create Moderation test passed.", ConsoleColor.DarkGreen);

Usar Whisper con C#

Whisper es el servicio de transcripción de voz a texto de OpenAI. Así podríamos usarlo.

const string fileName = "micro-machines.mp3";
var sampleFile = await FileExtensions.ReadAllBytesAsync($"SampleData/{fileName}");
var audioResult = await sdk.Audio.CreateTranscription(new AudioCreateTranscriptionRequest
{
    FileName = fileName,
    File = sampleFile,
    Model = Models.WhisperV1,
    ResponseFormat = StaticValues.AudioStatics.ResponseFormat.VerboseJson
});
if (audioResult.Successful)
{
    Console.WriteLine(string.Join("\n", audioResult.Text));
}
else
{
    if (audioResult.Error == null)
    {
        throw new Exception("Unknown Error");
    }
    Console.WriteLine($"{audioResult.Error.Code}: {audioResult.Error.Message}");
}

Aunque personalmente no os aconsejo hacerlo, porque hay formas offline de ejecutar Whisper (gratis). Ya las veremos en un próximo artículo.

Conclusión

Betalgo.OpenAI es una biblioteca realmente genial que nos permite acceder a todos los servicios de OpenAI. La documentación es muy extensa, e incluye ejemplos para todas las funcionalidades.

Es compatible con .NET Standard 2.0 y .NET 6 o superior. Por lo que es multiplataforma, y podemos emplearlo tanto en Windows, Linux, Android y MacOs. No veáis lo bien que funciona en una Raspberry PI 😉.