[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на 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 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 і ознайомтеся з умовами навчання, ми спеціалізуємося тільки на індивідуальних заняттях, як для початківців, так і для просунутих програмістів. Ви можете взяти як одне заняття для опрацювання питання, що вас цікавить, так і кілька, для більш щільної роботи. Завдяки особистому кабінету, кожен студент підвищить якість свого навчання, у вашому розпорядженні:
- Доступ до пройденого матеріалу
- Тематичні статті
- Бібліотека книг
- Онлайн тестування
- Спілкування в закритих групах