JavaRush /Блог /Java-марафон 3.0 (Telegram Bot з ChatGPT) /Конспект занять на Java-марафоні | Telegram Bot з ChatGPT...

Конспект занять на Java-марафоні | Telegram Bot з ChatGPT

Статья из группы Java-марафон 3.0 (Telegram Bot з ChatGPT)
Телеграм-бот — це віртуальний користувач Telegram, з яким можна спілкуватися як із справжньою людиною. Перед нами — дуже цікава задача. Ми повинні створити "розумного" бота, який вміє:
  • вести діалог
  • практикуватися у побаченнях
  • генерувати адекватні та прикольні описи для сайтів знайомств
  • роздавати поради під час листування на сайті знайомств.
Щоб бот цьому навчився і виглядав розумним, ми прикрутимо до нього ChatGPT.

Попередня підготовка до роботи

Перш ніж починати програмувати, потрібно підготувати робоче місце. Для цього нам знадобиться:
  • Сама Java (Java Development Kit)
  • Додаток для написання та запуску програм, IntelliJ IDEA Community Edition
  • Шаблон нашого проекту
  • Telegram, бажано для зручності завантажити десктопну версію, принаймні для першої лекції

Встановлення IntelliJ IDEA та завантаження проекту

Завантажити безкоштовну версію IntelliJ IDEA Community Edition можна із сайту розробника для Windows, MacOS або Linux. Шаблон проекту бажано розархівувати та запам'ятати, де лежить папка. Якщо вже завантажували, знайдіть, де вона зберігається. Відкрийте IntelliJ IDEA. Якщо це перший запуск, швидше за все ви побачите вікно з пропозицією створити проект, відкрити його або завантажити з системи контролю версій. Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 1Якщо ви вже працювали в IntelliJ IDEA і у вас відкрито інший проект, натисніть на Windows/Linux File — Open, MacOS Intellij IDEA — Open. Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 2Далі в обох випадках знаходимо папку TinderBolt там, де ви її зберегли. І знову тиснемо Open. Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 3Відкривається шаблон проекту. Ліворуч ви побачите дерево проекту, праворуч буде показаний активний файл. Дерево проекту складається з різних директорій та файлів. Потрібні нам файли з Java-кодом знаходяться за шляхом TinderBolt → src → main → Java → com → javarush → telegram. Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 4Якщо ви ніколи не програмували, структура проекту та й сам код у файлах може вам здатися чимось незрозумілим та надто складним. Насправді розуміння цього просто вимагає практики. Поки що тільки збираємося вчитися на Java Junior, а “джуни” зазвичай не створюють структуру проекту, а лише пишуть окремі його частини. Так що протягом наступних занять ми з вами зімітуємо роботу програміста-початківця на проекті, шаблон якого створив який-небудь Senior або архітектор.

Трохи теорії перед першою лекцією

Java-програма або Java-проект

У найзагальнішому сенсі програма – це послідовність команд, які розуміє та виконує комп'ютер. Команди ці пише програміст, у нашому випадку — мовою Java. Щоб програмістам було простіше працювати, Java-проект має певну структуру. Фізично це файли і папки, розташовані в певній ієрархії, як ви могли бачити у відкритому проекті TinderBolt. Основна кількість файлів у типовому Java-проекті — це файли з Java-кодом, але є файли з ресурсами (наприклад, текстовими файлами або графічними аватарками), конфігураційні файли і так далі. У найпростішому випадку програма може складатися з одного файлу з Java-кодом. Java, встановлена ​​на комп'ютер, зможе перевести цей код на зрозумілу комп'ютеру мову (відкомпілювати), а потім запустити програму. Приклад такої найпростішої програми:

public class Main {
   public static void main(String[] args) {
       System.out.println("це моя програма");
   }
}
Виведення в консоль:
Це моя програма
Для новачка тут є багато незрозумілих слів. Деякі з них ми поки що проігноруємо, зупинимося на найважливішому. Така нехитра програма виводить на екран (в консоль) повідомлення "Це моя програма". Робить вона це за допомогою команди:

System.out.println("Це моя програма");
Кожна команда Java закінчується точкою з комою ;. А логічний блок коду обмежений фігурними дужками {}.

int age = 35;
if (age < 40) {// Початок логічного блоку.
  System.out.println("Ти ще молодий"); // команда
} // Кінець логічного блоку.

/*
У цьому прикладі код перевіряє,
чи людина, чий вік зберігається в змінній age, молодша за 40 років.
Якщо так, код виводить повідомлення "Ти ще молодий" в консоль.
*/
У коді вище після символу // починається коментар завдовжки один рядок. А багаторядковий коментар можна написати /* між слешами із зірочкою, ось так, як ми зараз це робимо */. Коментарі можна залишати для колег, які читатимуть ваш код або ж для вас, щоб не забути чогось. Суть у тому, що у програмі коментарі не виконуються, вони тут тільки щоби щось пояснити і в них можна писати що завгодно. Але бажано, щоб вони несли якийсь сенс. Що ще? Оператор = це не “дорівнює”, а оператор присвоєння.

String namePhone = "Mi 11";
означає, що змінній namePhone присвоїли значення Mi 11. За рівність у Java відповідає оператор ==. Не обов’язково для встановлення: Коли у програмі дуже багато дужок та інших подібних знаків можна легко заплутатися. Тож якісь добрі програмісти вигадали плагін Rainbow Brackets до IntelliJ IDEA. Rainbow Brackets виділяє різним кольором дужки та інші знаки, що спрощує читабельність коду. Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 5
  1. Зайдіть у розділ "Налаштування", Windows/Linux File — Settings, MacOS Intellij IDEA — Preferences.
  2. У вікні, що з'явилося, в бічному меню виберіть розділ Plugins і відкрийте вкладку Marketplace. І у рядку пошуку напиши Rainbow Brackets.Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 6
  3. Після встановлення натиснути Restart IDE.

Доповнення та короткий конспект до заняття №1

Будь-який Java-проект складається з якихось файлів та папок. Це можуть бути файли з Java-кодом, файли з конфігураціями, ресурси для роботи нашої програми, наприклад, картинки, які вона завантажуватиме або текстові файли, інформацію з яких вона буде тим чи іншим чином зчитувати. Давайте поговоримо про структуру нашого проекту, точніше про найголовніші його файли. Вони, Java-класи, лежать у папці проекту шляхом src—>main—> java —> com —>javarush—>telegram. У папці ресурсів лежать зображення, текстові повідомлення та промпти для chatGPT. Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 7Тут є ще конфігураційний файл pom.xml, якийсь .gitignore і багато незрозумілого новачкові. Давайте від них абстрагуємось і повернемося до наших Java-файлів. Найважливіший з них, у якому вестиметься основна робота — TinderBoltApp. Майже весь код ми будемо писати в цьому класі, в методі основної функціональності робота UpdateEventReceived(Update update). Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 8Інші класи:
  • UserInfo – для зберігання профілів людей у ​​програмі для знайомств.
  • ChatGPTService — клас для спрощення роботи зі штучним інтелектом.
  • DialogMode — містить режими роботи з ботом (наприклад, «тренування в листуванні» або «створення профайлу» тощо).
  • MultiSessionTelegramBot — для спрощення роботи нашої програми з API-серверами Telegram.
  • API — це абревіатура від "Application Programming Interface", що перекладається як "інтерфейс програмування програм". Це набір правил та протоколів для створення та інтеграції програмного забезпечення. Тобто API дозволяє програмам спілкуватися між собою, а програмістам — використовувати можливості інших програм у своїх.

Реєстрація бота та отримання логіну, токена та посилання на бот

У нашому класі TinderBoltApp є змінні:
  • TELEGRAM_BOT_NAME
  • TELEGRAM_BOT_TOKEN
  • OPEN_AI_TOCKEN
Перші два токена – це логін та пароль, а про третій поговоримо на наступному уроці. Щоб отримати значення логіну і токена (паролю), нам потрібно зареєструвати нашого бота на сервері Telegram:
  1. Заходимо до Telegram
  2. У пошуку шукаємо бота на ім'я BotFather (такий тато всіх ботів).
  3. Пишемо команду /start
  4. Тиснемо на /newbot
    Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 9
  5. Обираємо ім'я для нашого бота.
  6. Тепер обираємо ім'я користувача (username) для свого бота. Ім'я повинно бути унікальним і закінчуватися на «bot».
  7. Якщо все добре, бот надішле нам вітальне повідомлення, в якому буде наше ім'я користувача, а в якості токена можна використовувати виданий ботом токен для HTTP API, а також посилання на нашого бота.
    Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 10
  8. Тепер повертаємося до IntelliJ IDEA, до класу TinderBoltApp та іменуємо змінні
    
    TELEGRAM_BOT_NAME = «your name»
    TELEGRAM_BOT_TOKEN = «your HTTP API token»
    
Наш бот поки що нічого не вміє, але він уже працює. Щоб запустити програму в IntelliJ IDEA, потрібно клацнути по зеленій стрілці праворуч зверху вікна ▶ (при цьому в самому вікні бажано відкрити TinderBoltApp). Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 11Або ж натисніть на ім'я класу TinderBoltApp у дереві проектів правою кнопкою миші і знайдіть там таку ж стрілочку з написом Run TinderBoltApp.main(). Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 12Так запускається будь-яка програма на Java. По суті, ми запустили метод main класу TinderBolt. Тепер, коли програму запущено, ми можемо повертатися в телеграм: наш бот працює. Клікаємо за посиланням, отриманим у привітальному повідомленні, і опиняємося у бота в гостях. Ми можемо натиснути кнопку Start або написати /start (це кнопка початку спілкування з ботом). Щоправда, говорити він поки що не вміє, тож нічого не станеться. Тому просто зупинимо програму і перейдемо до написання коду. Яким чином ми зазвичай спілкуємося з ботом чи живою людиною? Ми отримуємо його повідомлення та пишемо свої. Найчастіше це текстові повідомлення, але це можуть бути картинки, а у випадку бота — ще й команди. Як ми вже писали вище, для спілкування програм є спеціальні пакети API. Звісно програмісти вже написали API для телеграм-ботів на Java, і наш ментор їх використав, щоб створити методи спілкування саме з нашим ботом. В принципі, це могли зробити і ми, але тоді наша робота ускладнилася б у рази, а ми лише починаємо вчитися, нам і так складно. Зробити так, щоб бот нам щось написав нескладно. Давайте викличемо цей метод у головному методі onUpdateEventReceived нашого основного класу TinderBoltAPI. Щоб це зробити, в цьому методі потрібно написати таку команду:

sendTextMessage("Привіт!");
Тепер якщо ми запустимо бот, він реагуватиме «привітом» на будь-яке надіслане нами повідомлення. Конспект занять на Java-марафоні | Telegram Bot з ChatGPT - 13Надсилати в чат картинки можна за допомогою методу sendPhotoMessage:

sendPhotoMessage("image_name");
Йому можна відправляти картинки по ключу, а самі картинки лежать у папці resources -> pictures. Команди в Telegram починаються зі слешу /. Власне, з одною із них ми вже працювали, це команда /start. Спробуймо змусити нашу програму відреагувати на команду /start. Наприклад, якщо користувач надіслав нам цю команду, відправимо йому у відповідь картинку. А в інших випадках бот картинку слати не повинен. Для таких умов в Java використовується оператор if.

if (умова) {
Якісь команди;
}
У нашому випадку код умови виглядатиме так:

// Перевірка, чи починається повідомлення користувача з команди "/start"
if (message.startsWith("/start")) {
 // Завантаження повідомлення з назвою "main"
 String text = loadMessage("main");

 // Надсилання фотографії з ім'ям "main"
 sendPhotoMessage("main");

 // Відправлення текстового повідомлення з текстом із змінної "text"
 sendTextMessage(text);

 // Завершення обробки команди "/start"
 return;

}
Тут написано буквально таке: якщо повідомлення користувача починається з команди /start, тоді ми надсилаємо картинку з ім'ям main та текст з ім'ям main. І текст, і картинка розташовані у відповідних папках проекту у ресурсах. Return зазвичай повертає значення методу, та завершує роботу методу. Якщо ж ми застосуємо return без значення не на виході з методу, а на виході з будь-якого блоку коду, наприклад умовного оператора, як тут, він просто закінчить обробку нашого повідомлення і наступні команди не виконаються.

Що потрібно зробити перед та під час першої лекції

  1. Встановити все необхідне роботи.
  2. Послухати лекцію та повторити все за ментором.
За підсумками у нас має бути бот, який:
  • Має ім'я, назву та посилання на себе
  • Запускається
  • Читає повідомлення користувача
  • Відсилає картинку та опис своєї роботи, якщо користувач надіслав йому команду /start
  • Надсилає просте текстове повідомлення
Не все може бути зрозумілим, але важливо не заплутатися і все зробити, повторити за ментором. Деякі моменти стануть зрозумілими пізніше.

Підказки для виконання завдання №1

Перевірка коректності коду та оновлення змін у проекті

Щоб побачити зміни, які ви вносите безпосередньо в роботі Телеграм-бота, не забудьте після написання свого коду застосувати зміни (перезапустити проект) в IntelliJ IDEA. Для цього потрібно в нижній горизонтальній панелі натиснути на зелену круглу стрілку.

Важливі принципи форматування коду

  • Не забувай ставити крапку з комою; наприкінці команди, яку ти створюєш
  • У кожної дужки або лапки, що відкриває: (, {, ", повинна бути дужка або лапка, що закриває: ), }, "
  • Якщо твій код підсвічується червоним, значить у ньому є помилка — придивись уважніше
  • Використовуй автоматичні підказки та автодоповнення – це допоможе тобі писати код правильно
  • Пам'ятай, що твої назви змінних, методів та класів мають бути читабельними: за назвою має бути зрозуміло, що вони роблять або для чого призначені

Форматування тексту

Щоб виділити текст курсивом, потрібно на початку та в кінці необхідного фрагмента додати нижні підкреслення: _текст_ Щоб виділити текст жирним, потрібно на початку та в кінці необхідного фрагмента додати зірочки: *текст*

Доповнення та короткий конспект до заняття №2

У цій лекції наш бот стане розумнішим, тому що ми прикрутимо до нього штучний інтелект, а саме chatGPT. А працювати з нашою програмою всіма улюблений чатик буде за допомогою… правильно спеціального API. Тобто наш бот перемикатиметься в режим роботи з чатом і всі наступні повідомлення користувача вже будуть оброблятися саме ним.

Що для цього потрібно

Для початку нам знадобиться токен chatGPT. Це ключ, за допомогою якого наш бот зможе спілкуватися із сервером chatGPT. Його можна купити або дістати якимсь манівцем, але вам пощастило, оскільки перед цією лекцією вам його вже прислали в бот. Перша наша дія з кодом у цьому уроці — скопіювати значення надісланого токена і вставити його у відповідне поле.

public static final String OPEN_AI_TOKEN = "вставте сюди ваш ключ";
У списку команд чату є: /gpt. Згідно з описом у боті, ця команда має поставити питання нашому чатику. Тепер нам потрібно створити шматок коду, який оброблятиме цю команду. Зверніть увагу на нюанс: якщо ви натиснули на якусь команду (або ввели її), це вже — повідомлення для бота. А питання чату вже буде наступною командою. Тому потрібно опрацювати два повідомлення. За аналогією з обробкою команди /start пишемо код, який означає буквально наступне: якщо повідомлення користувача починається з рядка /gpt, наш бот перемикається в режим діалогу з чатом. Можна запропонувати користувачеві поставити питання ШІ, а ще для наочності — надіслати картинку і закінчити роботу з повідомленням.

if (message.startsWith("/gpt")) {
 currentMode = DialogMode.GPT;
 sendPhotoMessage("gpt");
 sendTextMessage("Напишіть будь-яке повідомлення і подивимося, що вам відповість *ChatGPT*:");
 return;
}

Що таке Dialog.Mode?

Це варіанти роботи робота, ті, що зазначені всі вони описані в однойменному класі і потім виводяться в вітальному повідомленні. Заходьте до нього і там ви знайдете щось незвичне.

public enum DialogMode {
 MAIN,
 PROFILE,
 OPENER,
 MESSAGE,
 DATE,
 GPT,
}
Замість classenum. Насправді, перед нами досить проста штука і називається вона переліченням. Це такий спеціальний клас, який представляє групу констант (незмінних змінних). Їх зручно використовувати для представлення фіксованого числа пов'язаних значень, наприклад днів тижня або рівнів доступу. У нашому випадку ми маємо перелік режимів роботи бота. У режими спілкування з телеграм-ботами ми входимо виконуючи команди, які починаються зі слеша. Ми вже реалізували обробку команди /start. По суті, наше головне завдання – реалізувати код, який би працював з усіма шістьма режимами. Режим /profile, /opener, /message, /date, /gpt. У нашому ENUM якраз є для них шаблони. Тобто, коли користувач входить у певний режим, наш бот повинен розуміти, що ми в нього увійшли і реагувати відповідно. У цій же лекції наше завдання — підготувати блок коду, в якому після перемикання в режим роботи з чатом GPT (/gpt) він міг відповідати на запитання користувача. Для цього необхідно написати блок коду з умовним оператором if. А щоб спілкування було більш осмисленим та цікавим, ми використовували заздалегідь підготовлені промпти. Вони лежать у директорії resources\prompts. Промпти – це добре сформульовані запити до ШІ. У нас вони лежать у папці з ресурсами. Також у цій лекції ми розглянули метод додавання меню та списку команд. Для цього є метод showMainMenu(). У нашому випадку, якщо ми включаємо тільки команди під вже реалізовані функції код буде таким:
  1. /start – головне меню бота
  2. /profile – генерація Tinder-профля 😎
  3. /opener – повідомлення для знайомства 🥰
  4. /message – листування від вашого імені 😈
  5. /date – листування із зірками 🔥
  6. /gpt – поставити запитання чату GPT 🧠
Усі смайли в програмі відображаються за допомогою спеціальних послідовностей символів. Таким чином, до кінця цієї лекції ми можемо спілкуватися з чатом трьома способами: натиснути на команду у вітальному повідомленні ввести команду у форматі /команда клацнути по меню і вибрати відповідну команду. В цілому на цій лекції ми:
  • прикрутили ChatGPT
  • додали обробку
  • додали переключення в режим діалогу
  • розібралися як працювати з промптами
  • зображення меню

Доповнення та короткий конспект до заняття №3

Підключаємо режим дейтингу /date

Наше завдання полягає в тому, щоб користувач після перемикання в режим дейтингу після команди /date зміг відкрити меню та вибрати там відповідну кінозірку. Потім нам потрібно навчити бота відповідати від імені конкретної зірки, тобто згодувати йому промпт, в якому пояснити, з якою саме зіркою буде спілкуватися користувач, а ще – прописати команди так, щоб ШІ реагував на ВСІ повідомлення відповідним чином, а не тільки на одне з них. Тобто ми повинні додати запити до чату із збереженням історії. На першому занятті ми вже розбирали, як створювати кнопки меню з текстовими повідомленнями. Щоб створити меню з такими кнопками, ми можемо використовувати метод sendTextButtonsMessage. Після цього на лекції ми почали писати обробку для кожної кнопки. Спочатку ми навчилися надсилати фото обраної зірки, а потім створили сам тренажер для запрошення на побачення. Для того, щоб створити тренажер, ми зробили кілька дій:
  • Передали програмі промпт, який описує спілкування із відповідною зіркою (усі такі промпти лежать у папці resources).
  • Переклали chatGPT з режиму питання-відповідь до режиму діалогу.
  • Встановлення промпту:
    
    String prompt = loadPrompt(query);
    chatGPT.setPrompt(prompt);
    Обробка команди /message
    
    У цьому пункті ми додали функціональність, яка дозволяє chatGPT генерувати вдалі відповіді на наше листування. Для накопичення повідомлень ми використовували змінну типу ArrayList() або список.
ArrayList Java — це як спеціальний список або блокнот, де ви можете записувати речі і завжди додавати нові записи в кінець або видаляти старі. Якщо вам потрібно щось додати і в списку немає місця, він сам зробить себе більше, щоб усе вмістилося. Ви також можете поставити кілька однакових речей поспіль або навіть залишити порожню сторінку (це як null у Java), і це буде нормально для цього списку. Єдина умова – записи у такому списку мають бути однорідними. Тобто один список може містити лише рядки або лише числа або лише собачок із класу Dog. Припустимо, що у вас є список улюблених мультфільмів, і ви хочете його організувати. Ось як ви можете це зробити за допомогою ArrayList:

import java.util.ArrayList; // Підключаємо можливість використовувати ArrayList
public class Main {
 public static void main(String[] args) {
  // Створюємо новий список для мультфільмів
 ArrayList<String> favoriteCartoons = новий ArrayList<>();

 // Додаємо мультфільми до списку
 favoriteCartoons.add("Том і Джеррі");
 favoriteCartoons.add("Спанч Боб");
 favoriteCartoons.add("Гравіті Фолз");

 // Тепер припустимо, що хочеш додати ще один мультфільм
 favoriteCartoons.add("Аватар: Останній маг повітря");

 // І можеш навіть видалити мультфільм, який тобі більше не подобається
 favoriteCartoons.remove("Спанч Боб"); // Видаляємо "Спанч Боб" зі списку
 }
 }
}
Так само ми використовуємо в нашому чатботі список для зберігання повідомлень І за аналогією з попереднім пунктом ми написали обробник натискання на кнопки.

Метод join()

Метод String.join() в Java дозволяє об'єднати (склеїти) кілька рядків в один, використовуючи роздільник. Дуже зручний, коли потрібно з'єднати елементи списку або масиву в один рядок із заданим роздільником. Синтаксис:

String.join(delimiter, elements);
delimiter — рядок, який використовуватиметься як роздільник між елементами. elements – елементи, які потрібно об'єднати. Можуть бути передані як масив або послідовність рядків. Приклад:

String result = String.join("-", "2024", "01", "01");
System.out.println(result); // Виводить: 2024-01-01

Оновлення повідомлень

У вас бувало, що ви робили помилку у повідомленні в месенджері, а потім її виправляли? Це може робити і наш бот за допомогою методу updateTextMessage(message, text). У нашому випадку ми замінюємо повідомлення перед надсиланням повідомлення GPT, а потім змінюємо повідомлення на відповідь самого чату. Наприклад:

// Надсилаємо повідомлення в чат із текстом "ChatGPT думає над варіантами відповіді..."
var sm = sendTextMessage("ChatGPT думає над варіантами відповіді...");

// Надсилаємо запит у ChatGPT, передаючи йому prompt та історію чату з користувачем
String answer = chatGPT.sendMessage(prompt, userChatHistory);

// Оновлюємо раніше надіслане повідомлення (sm) текстом відповіді від ChatGPT
updateTextMessage(sm, answer);

Доповнення та короткий конспект до заняття №4

На цій лекції ми реалізуємо дві функції:
  • profile – дозволяє генерувати профіль для свого тиндеру
  • opener – генерація першого повідомлення незнайомій людині

Режим profile. Створення профілю користувача

Як і для всіх попередніх команд ми реалізуємо її за допомогою двох умовних операторів if. І, як завжди, нам насамперед потрібно перевірити, чи не увійшов користувач у відповідний режим, у нашому випадку — режим профілю за допомогою команди /profile. Реакцією на введення користувачем цієї команди має бути переведення роботи бота в цей діалог за допомогою такого рядка:

currentMode = DialogMode.PROFILE;
Після нього — як вже раніше бувало — демонстрація картинки і якесь текстове повідомлення, типове для режиму. Користувачеві пропонують написати інформацію про себе. Другий блок з оператором if якраз перевіряє, чи знаходиться користувач у режимі DialogMode.PROFILE, і якщо це так, то надіслані користувачем повідомлення (де він написав щось про себе) надсилаються до ChatGPT разом з проханням згененувати на основі цієї інформації профіль Tinder. Ми могли б просто попросити користувача описати себе, але щоб інформація була точнішою, і профіль вийшов цікавішим ми будемо використовувати клас UserInfo та лічильник питань. Під час написання цього блоку ми створили об'єкт класу UserInfo (це один із написаних ментором класів, який можна бачити в дереві структури класу) і нам знадобилася можливість працювати з об'єктами як з рядками. У цьому блоці ми зіткнулися з новим для нас оператором switch. Він використовується для виконання різних дій на основі різних умов. Це хороша альтернатива ланцюжку if-else при перевірці однієї і тієї ж змінної на рівність з безліччю значень.

int temperature = 36;

switch(temperature)
{
 case 36:
  System.out.println("Низька");

 case 37:
  System.out.println("Нормальна");

 case 38:
  System.out.println("Висока");
}
При значенні температури 36 програма перейде всередині switch на перший блок коду — перший рядок, і після її виконання просто будуть виконуватися інші блоки коду. Але повернімось до нашої теми. В результаті ми створили блок коду, в якому користувач переходить у режим профілю, і йому ставлять кілька ключових питань. Відповіді на ці запитання всі разом надсилаються чату GPT, який отримав промпт про створення профілю на основі відповіді користувача. Власне це ChatGPT і робить: створює класний профайл на основі ваших даних. Також, як і минулого разу ми використовуємо зв'язку sendMessage + UpdateMessage: спочатку посилаємо попереднє повідомлення, потім ChatGPT обробляє наш запит, і коли його відповідь готова, попереднє повідомлення змінюється на його відповідь.

// Надсилання повідомлення користувачу з інформацією про те, що ChatGPT працює над відповіддю
Message message = sendTextMessage("ChatGPT думає... зачекайте пару секунд");

// Надсилання запиту до ChatGPT з використанням заданого prompt та інформації про користувача
String answer = chatGPT.sendMessage(prompt, userInfo);

// Оновлення раніше надісланого повідомлення відповіддю від ChatGPT
updateTextMessage(message, answer);

Ускладнюємо умову перевірки перебування у тому чи іншому режимі

Якщо ми помилково зайшли не в той режим, а програма вже розпочала роботу в ньому, наприклад, як у випадку Opener або Profiler, вона почала збирати відповіді на питання, то якщо користувач натисне на іншу команду, це буде сприйнято як відповідь на запитання. Як це виправити? Потрібно трохи змінити перевірку, додавши до неї додаткову умову. Ця умова полягає в тому, що наступне повідомлення не є командою. Це можна зробити так:

if (currentMode == DialogMode.GPT && !isMessageCommand()) {
//код
}
Давайте розберемося, що тут написано. Спочатку, як і раніше, ми перевіряємо, чи ми не знаходимося в якомусь режимі (у даному випадку – у режимі GPT). Дві два символи &&. Це оператор "і". Він об'єднує дві умови в одну, має виконуватися і умова ліворуч від &&, та умова праворуч від &&. Оператор ! означає заперечення того, що йде за ним. У даному випадку оператор заперечує те, що повертає метод isMessageCommand(). Цей метод з нашого класу перевіряє, чи є повідомлення командою (/start, /GPT тощо). Коротше кажучи, наша умова перевіряє, чи увійшли ми в режим GPT і при цьому повідомлення користувача не є командою і тільки в такому випадку ми виконуємо код, який йде далі. Після такого виправлення, якщо користувач введе команду, користувача переключать в інший режим. Тепер ми реалізували всі режими.
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
9 августа 2024
"Далі в обох випадках знаходимо папку TinderBolt там, де ви її зберегли." Где можно скачать исходники TinderBolt?