Создание и применение ботов

Создание клиента для ChatGPT бота

Последнее обновление: 04.03.2023

ChatGPT представляет чат-бот с искусственным интеллектом от компании OpenAI, который может в диалоговом режиме отвечать на запросы. B OpenAI предоставляет API, который позволяет нам встроить взаимодействие с ChatGPT ботом в свое приложение. Но официальных библиотек для взавимодействия с этим API нет, поэтому весь код придется писать с нуля. Рассмотрим простейший пример.

Прежде всего для отправки запросов нам потребуется токен. Его можно сгенерировать в личном кабинете на сайте openai по адресу https://platform.openai.com/account/api-keys.

Подключение к чат-боту chatgpt в C#

После нажатия на кнопку "Create new secret key" отобразится окно с сгенерированным токеном, который надо скопировать и сохранить. Затем этот токен отобразится в списке ключей, и его затем можно в любой момент удалить.

Подключение к чат-боту chatgpt в программе на C#

Далее определим следующее консольное приложение:

using System.Net.Http.Json;
using System.Text.Json.Serialization;

// токен из личного кабинета
string apiKey = "sk-95Ez2Z1rtgegrRTFFDSTVTdsdfsgdv3422kjhLghnh53QiT8F";
// адрес api для взаимодействия с чат-ботом
string endpoint = "https://api.openai.com/v1/chat/completions";
// набор соообщений диалога с чат-ботом
List<Message> messages = new List<Message>();
// HttpClient для отправки сообщений
var httpClient = new HttpClient();
// устанавливаем отправляемый в запросе токен
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

while (true)
{
    // ввод сообщения пользователя
    Console.Write("User: ");
    var content = Console.ReadLine();

    // если введенное сообщение имеет длину меньше 1 символа
    // то выходим из цикла и завершаем программу
    if (content is not { Length: > 0 }) break;
    // формируем отправляемое сообщение
    var message = new Message() { Role = "user", Content = content };
    // добавляем сообщение в список сообщений
    messages.Add(message);

    // формируем отправляемые данные
    var requestData = new Request() 
    {
        ModelId = "gpt-3.5-turbo",
        Messages = messages
    };
    // отправляем запрос
    using var response = await httpClient.PostAsJsonAsync(endpoint, requestData);

    // если произошла ошибка, выводим сообщение об ошибке на консоль
    if (!response.IsSuccessStatusCode)
    {
        Console.WriteLine($"{(int)response.StatusCode} {response.StatusCode}");
        break;
    }
    // получаем данные ответа
    ResponseData? responseData = await response.Content.ReadFromJsonAsync<ResponseData>();

    var choices = responseData?.Choices ?? new List<Choice>();
    if (choices.Count == 0)
    {
        Console.WriteLine("No choices were returned by the API");
        continue;
    }
    var choice = choices[0];
    var responseMessage = choice.Message;
    // добавляем полученное сообщение в список сообщений
    messages.Add(responseMessage);
    var responseText = responseMessage.Content.Trim();
    Console.WriteLine($"ChatGPT: {responseText}");
}

// класс сообщения
class Message
{
    [JsonPropertyName("role")]
    public string Role { get; set; } = "";
    [JsonPropertyName("content")]
    public string Content { get; set; } = "";
}
class Request
{
    [JsonPropertyName("model")]
    public string ModelId { get; set; } = "";
    [JsonPropertyName("messages")]
    public List<Message> Messages { get; set; } = new();
}

class ResponseData
{
    [JsonPropertyName("id")]
    public string Id { get; set; } = "";
    [JsonPropertyName("object")]
    public string Object { get; set; } = "";
    [JsonPropertyName("created")]
    public ulong Created { get; set; }
    [JsonPropertyName("choices")]
    public List<Choice> Choices { get; set; } = new();
    [JsonPropertyName("usage")]
    public Usage Usage { get; set; } = new();
}

class Choice
{
    [JsonPropertyName("index")]
    public int Index { get; set; }
    [JsonPropertyName("message")]
    public Message Message { get; set; } = new();
    [JsonPropertyName("finish_reason")]
    public string FinishReason { get; set; } = "";
}

class Usage
{
    [JsonPropertyName("prompt_tokens")]
    public int PromptTokens { get; set; }
    [JsonPropertyName("completion_tokens")]
    public int CompletionTokens { get; set; }
    [JsonPropertyName("total_tokens")]
    public int TotalTokens { get; set; }
}

Прежде всего нам необходимо определить ряд классов для отправки и получения сообщений в формате json. Так, согласно OpenAI API формат получаемого от ChatGPT сообщения выглядит следующим образом:

{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "\n\nHello there, how may I assist you today?",
    },
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21
  }
}

Для представления ответа определены следующие классы:

class Message
{
    [JsonPropertyName("role")]
    public string Role { get; set; } = "";
    [JsonPropertyName("content")]
    public string Content { get; set; } = "";
}
class Request
{
    [JsonPropertyName("model")]
    public string ModelId { get; set; } = "";
    [JsonPropertyName("messages")]
    public List<Message> Messages { get; set; } = new();
}

class ResponseData
{
    [JsonPropertyName("id")]
    public string Id { get; set; } = "";
    [JsonPropertyName("object")]
    public string Object { get; set; } = "";
    [JsonPropertyName("created")]
    public ulong Created { get; set; }
    [JsonPropertyName("choices")]
    public List<Choice> Choices { get; set; } = new();
    [JsonPropertyName("usage")]
    public Usage Usage { get; set; } = new();
}

class Choice
{
    [JsonPropertyName("index")]
    public int Index { get; set; }
    [JsonPropertyName("message")]
    public Message Message { get; set; } = new();
    [JsonPropertyName("finish_reason")]
    public string FinishReason { get; set; } = "";
}

class Usage
{
    [JsonPropertyName("prompt_tokens")]
    public int PromptTokens { get; set; }
    [JsonPropertyName("completion_tokens")]
    public int CompletionTokens { get; set; }
    [JsonPropertyName("total_tokens")]
    public int TotalTokens { get; set; }
}

Для сопоставления с полученными данными при десериализации ответа у каждого свойства классов устанавливаем соответствующий атрибут JsonPropertyName.

Формат отправляемого запроса выглядит следующим образом:

{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "Hello!"}]
}

Для представления этих данных определен тип Request:

class Request
{
    [JsonPropertyName("model")]
    public string ModelId { get; set; } = "";
    [JsonPropertyName("messages")]
    public List<Message> Messages { get; set; } = new();
}

В самой программе сначала устанавливаем токен, который будет использоваться для отправки запросов к ChatGPT, и адрес запроса:

string apiKey = "sk-95Ez2Z1rtgegrRTFFDSTVTdsdfsgdv3422kjhLghnh53QiT8F";
string endpoint = "https://api.openai.com/v1/chat/completions";

Далее определяем список сообщений (по умолчанию пустой) и объект HttpClient для отправки сообщений

List<Message> messages = new List<Message>();
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");

В бесконечном цикле считываем сообщения, введенные пользователем

Console.Write("User: ");
var content = Console.ReadLine();

Чтобы пользователь мог выйти из диалога с чат-ботом, пусть, если пользователь ввел пустую строку, то завершаем диалог:

if (content is not { Length: > 0 }) break;

После ввода добавляем введеное сообщение в список messages:

var message = new Message() { Role = "user", Content = content };
messages.Add(message);

Для текущего пользователя для свойство Role устанавливаем "user", а свойство Content хранит собственно текст сообщения, которое отправляется чат-боту.

Дальше с помощью выполняем запрос к ChatGPT:

var requestData = new Request() 
{
    ModelId = "gpt-3.5-turbo",
    Messages = messages
};
using var response = await httpClient.PostAsJsonAsync(endpoint, requestData);

Для выполнения запроса создаем объект Request, свойствам которого передаются название модели и список сообщений.

После этого из переменной response мы сможем получить ответ чат-бота.

ResponseData? responseData = await response.Content.ReadFromJsonAsync();

var choices = responseData?.Choices ?? new List<Choice>();
if (choices.Count == 0)
{
    Console.WriteLine("No choices were returned by the API");
    continue;
}
var choice = choices[0];
var responseMessage = choice.Message;

Далее выводим ответ от ChatGPT на консоль и добавляем его ответ в список messages:

messages.Add(responseMessage);
var responseText = responseMessage.Content.Trim();
Console.WriteLine($"ChatGPT: {responseText}");

Пример работы программы:

создание бота для ChatGPT на C#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850