ChatGPT представляет чат-бот с искусственным интеллектом от компании OpenAI, который может в диалоговом режиме отвечать на запросы. B OpenAI предоставляет API, который позволяет нам встроить взаимодействие с ChatGPT ботом в свое приложение. Но официальных библиотек для взавимодействия с этим API нет, поэтому весь код придется писать с нуля. Рассмотрим простейший пример.
Прежде всего для отправки запросов нам потребуется токен. Его можно сгенерировать в личном кабинете на сайте openai по адресу https://platform.openai.com/account/api-keys.
После нажатия на кнопку "Create new secret key" отобразится окно с сгенерированным токеном, который надо скопировать и сохранить. Затем этот токен отобразится в списке ключей, и его затем можно в любой момент удалить.
Далее определим следующее консольное приложение:
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}");
Пример работы программы: