[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.
В этой статье, мы рассмотрим как использовать ChatGpt в своих программах, с возможностью отправки и получения запроса.
С момента выпуска ChatGPT — 30 ноября 2022 года, он привлек внимание не только технологического сообщества, но и всего мира. Это вызвало изменения в Google, направленные на ускорение исследований в области ИИ, и вызвало опасения, что ChatGPT может бросить вызов доминированию Google в области поиска.
На данный момент Stack Overflow вводит запрет на генерируемый контент на своих форумах. Хотя поиск является популярной функцией, ChatGPT также поддерживает:
- анализ
- классификацию
- генерация кода
- генерация изображений
OpenAI предоставил доступ к своим API, а также клиентскую библиотеку на языке Python. В этой статье рассмотрим, как использовать API ChatGPT в приложении на C#.
Если вы не зарегистрированы, это необходимо сделать с использованием вашего номера телефона. В Украине, с середины февраля 2023 года, это стало возможным.
Получение токена
Прежде всего, нам нужен токен, для отправки запросов. Его можно сгенерировать в личном кабинете на сайте openai по адресу:
https://platform.openai.com/account/api-keys
Новым пользователям предоставляется бесплатная пробная версия с определенным количеством жетонов, выделенных на их счет. По мере их истечения или использования для продолжения обслуживания потребуется кредитная карта. В OpenAPI есть полное руководство по ценам.
После нажатия на кнопку «Create new secret key» отобразится окно с сгенерированным токеном, который необходимо скопировать и сохранить. Затем этот токен отобразится в списке ключей:
Мой сгенерированный ключ, следующий:
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
Уважаемые энтузиасты программирования на C#!
С наилучшими пожеланиями,
[Леонид / Dijix Company]
Создание приложения клиента. Вариант 1.
Создадим проект по типу Console Application.
В первом подходе, рассмотрим использование библиотеки OpenAI_API, которую можно сказать через Package Manager Console:
1 |
Install-Package OpenAI_API |
В файле Program.cs, определим следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Program { static async Task Main() { string apiKey = "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"; OpenAIAPI api = new OpenAIAPI(new APIAuthentication(apiKey)); Conversation chat = api.Chat.CreateConversation(); Console.Write("User: "); string question = Console.ReadLine(); chat.AppendUserInput(question); var result = await chat.GetResponseFromChatbotAsync(); Console.WriteLine($"Chat GPT: {result}"); } } |
Не забудьте подключить следующие пространства имен:
1 2 |
using OpenAI_API.Chat; using OpenAI_API; |
Запустим приложение и проверим его работу.
Создание приложения клиента. Вариант 2.
Определим следующее консольное приложение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
class Program { static async Task Main() { // токен из личного кабинета string apiKey = "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"; // адрес api для взаимодействия с чат-ботом string endpoint = "https://api.openai.com/v1/chat/completions"; List<Message> messages = new List<Message>(); var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}"); while (true) { Console.Write("User: "); var content = Console.ReadLine(); 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.
Для представления ответа определены следующие классы: Message, ResponseData, Choice и Usage.
Для сравнения с данными, полученными при десериализации ответа, мы устанавливаем соответствующий атрибут JsonPropertyName для каждого свойства классов. Формат отправляемого запроса следующий:
1 2 3 4 5 6 7 8 9 |
{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hapy to work!" } ] } |
Для представления этих данных определен тип Request:
1 2 3 4 5 6 7 |
class Request { [JsonPropertyName("model")] public string ModelId { get; set; } = ""; [JsonPropertyName("messages")] public List<Message> Messages { get; set; } = new(); } |
В самой программе сначала устанавливаем токен, который будет использоваться для отправки запросов к ChatGPT, и адрес запроса:
1 2 3 4 |
// токен из личного кабинета string apiKey = "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"; // адрес api для взаимодействия с чат-ботом string endpoint = "https://api.openai.com/v1/chat/completions"; |
Далее определяем список сообщений (по умолчанию пустой) и объект HttpClient для отправки сообщений:
1 2 3 4 5 |
List<Message> messages = new List<Message>(); // HttpClient для отправки сообщений var httpClient = new HttpClient(); // устанавливаем отправляемый в запросе токен httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}"); |
Для текущего пользователя, свойство «Role» принимает значение «пользователь», а свойство «Контент» сохранит фактический текст сообщения, отправленного чат-боту. Затем с помощью Request выполняем запрос к ChatGPT:
1 2 3 4 5 |
var requestData = new Request() { ModelId = "gpt-3.5-turbo", Messages = messages }; |
Для выполнения запроса создаем объект Request, свойствам которого передаются название модели и список сообщений. После этого из переменной response мы сможем получить ответ чат-бота:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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}"); |
Существует множество других параметров, позволяющих управлять вариативностью ответа, процессом выбора ответа, сокращением повторения маркеров и другими. Можно изучить больше вариантов использования, например, классификацию и анализ настроения.
Я надеюсь, что вам понравилось читать эту статью, и она оказалась легкой для понимания. Пожалуйста, дайте мне знать, если у вас есть какие-либо комментарии или исправления.
Так же вам может быть интересна предыдущая статья — Магазин на Asp.Net Core MVC EF. Часть 1.
Вы хотите научится писать код на языке программирования C#?
Создавать различные информационные системы, состоящие из сайтов, мобильных клиентов, десктопных приложений, телеграмм-ботов и т.д.
Переходите к нам на страницу Dijix и ознакомьтесь с условиями обучения, мы специализируемся только на индивидуальных занятиях, как для начинающих, так и для более продвинутых программистов. Вы можете взять как одно занятие для проработки интересующего Вас вопроса, так и несколько, для более плотной работы. Благодаря личному кабинету, каждый студент повысит качество своего обучения, в вашем распоряжении:
- Доступ к пройденному материалу
- Тематические статьи
- Библиотека книг
- Онлайн тестирование
- Общение в закрытых группах
Живи в своем мире, программируй в нашем.