Використання ChatGPT в текстовій ролевій грі
ChatGPT, Copliot, Gemini, LLama та багато інших. Ми перебуваємо у точці, коли ШІ перестав бути якоюсь фантастикою і «чимось десь там», а переріс у форму, яку можна активно використовувати у повсякденному житті: як для роботи, так і для побутових справ. У той же час, відношення між іграми та ШІ досить... ніякі? В інтернеті можна знайти цікаві модифікації для ігор, які активно експериментують з цим, проте, «великі гравці» здається чи то скептично, чи то обережно налаштовані до таких інновацій.
Так як я не «великий гравець», не геймдев, а просто людина, якій стало цікаво «а що якщо», то розкажу вам історію моєї спроби подружити текстові RPG, ChatGPT, Dalle-3 і свою фантазію. Якщо ви маєте досвід роботи з цим всім, то, ймовірно, взагалі ніякого технічного одкровення в цьому блозі не знайдете, а тільки мою невелику історію.
Вступ
У стародавні часи, коли трава була зеленіша, моїм хобі була розробка модифікацій (вони ж «карти») для WarCraft 3 (олди, підняти щити!). Та і в цілому геймдев мені цікавий як тема, а фентезі як сетінг. Тому текстова рольова чат гра, так.
Після декількох тестів ChatGPT3 в ролі «game master», базове підтвердження, що, дуже теоретично, він з цим справитись може (ох, свята моя наївність), рішення про початок розробки було прийняте і відразу відкладене в далекий ящик через наявні проблеми іншого характеру. A few not moments, but months later, в одні жаркі вихідні, я все таки сів за ноут.
Встановлюю я, значить, UE5... а, стоп, ні, все було не так.
Технології
Потрібно писати, на тому, що вмієш, і ще щоб зручно було. А я веб розробник. Тому, платформою для гри я, раптово, вибрав... Telegram. Це дає свої обмеження, але, також, надає необхідні мені базу: відсутність необхідності писати html/css/js, малювати кнопочни та всі інші історії, натомість надає мені текстовий чат та, по суті, умовний, frontend і базу користувачів.
На бекенді все досить просто — свіжий php в Symfony, mysql та redis обернуті Docker на майже самому дешевому сервері DigitalOcean. Ніяких складних штук чи балансингу, через відсутність навантаження, але з можливістю прикрутити все це «колись» шляхом слою абстракцій.
По ШІ — ChatGPT був обраний, бо я його використовую кожен день і він для мене синонім ШІ, а OpenAI має API, в якому підтримується як ChatGPT, так і Dall-E.
Почнемо пригоду
Після війни з всіма технологіями описаними раніше, бо написані колись boilerplates для швидкого підняття сервісів нещадно встигли постаріти й піти на пенсію, прикручення ssl (інакше телеграм не буде слати тобі нотифікації з боту) та, насамперед, генерації всіх API ключів ми готові почати пригоду.
Відразу було прийнято рішення підтримки двох мов: англійської та, української. Тому на скриншотах ви будете бачити останню, проте, деякі місця все ще не перекладені по тим чи іншим причинам, тому прошу зрозуміти й пробачити 🙂
Концепт був (та і є) досить простим: у гравця є герой, у героя є прогресія, прогресія отримується через квести, квести генерує ChatGPT і надає варіанти дій, які обирає гравець. Герой має свої характеристики, вміння, може померти і так далі. Герой помер — створи нового (або воскреси через базу даних 😀). Звучить надійно, класно, нумо робити.
Перші кроки...
Перше й логічне, що потрібно було зробити, це створення персонажу. Щоб не придумувати концепт велосипеду, за фундамент було взято все те, що я знаю про ролеву систему Dungeons & Dragons. А знаю я досить мало, тільки те, що бачив у іграх, тому якщо тут є експерти, не бийте, я признаю провину заздалегідь! Ніякого ШІ тут не задіяно, і створення дуже просте: кажете ім’я, вибираєте клас з доступних, йому даються якісь предмети і характеристики, і поїхали до пригод.
Також швидко була створена таблиця з Топ 20 героїв по пройденим квестам, щоб було якесь відчуття змагань і мультиплеєру, та інші технічні розділи «головного меню». Здавалося б, летимо на крилах успіх до готового концепту.
... і перші проблеми
Хто в курсі, буде сміятись, а хто ні, то може зрозуміє мій подив, але контекст розмови, тобто, весь чат з ChatGPT треба зберігати самому і кожен раз слати його при запиті. В даний момент це здається мені абсолютно логічним і правильним, але на початку, коли кожен квест починався спочатку після першої ж відповіді, я дуже довго шукав на кшталт continueChat в документації OpenAI (що логічно, ,бо якщо є метод create, який я роблю, то мав би бути і continue) 😂.
Перший концепт передбачав що для кожного етапу квесту буде ще й генеруватись картинка через DALL-E3. Звучить досить круто, що ж могло піти не так? Насправді 2 дуже очевидні і критичні речі:
1. Час
Кожна з картинок у варіації 1 і найменшій роздільній здатності генерувалась як мінімум секунд
2. Гроші
Кожен запит до OpenAI вартує грошей. Саме тому, наприклад, був обраний ChatGPT3.5 Turbo, а не 4о (перший в рази дешевше). Dall-E2 давав погані результати зображення (на рівні «та краще вже взагалі без картинок»), тоді як Dall-E3 генерує прямо фантастичні зображення, але й цифри в розділі Billing почали стрімко рости.
Було прийнято компромісне рішення: генерувати тільки картинку на старті квесту і по можливості її «кешувати», шляхом збереження на сервер і подальшого перезаливу на хостинг. Приймаючи це рішення я взяв до уваги наступні речі:
а) взагалі без картинок текст, навіть розбавлений смайлами, сильніше втомлює
б) при клікі на «Почати пригоду», відчувається більш логічним і доречним очікування гравцем, аніж просто при виборі варіанту дій. «А, ну там генерується мені квест прямо зараз, можна трішки зачекати». Особливо якщо написати йому щось на кшталт:
ChatGPT захопить світ ...але не сьогодні
Картинки генеруються, текста теж. Варіанти дій надаються, нажимаються, історія продовжується. Здавалося б — готово, можемо завершити статтю і йти пити чай, каву, пиво чи вино. Але тут стає головне «але»: все це робилось на сам перед для «себе» і має працювати добре. Те, що ChatGPT уміє генерувати текст, інша ШІ — картинки, а телеграм це відображати та малювати кнопки й так було всім зрозуміло.
Після декількох тестів ще раз підтвердилась банальна річ: якщо тобі щось «очевидно» і це буде зрозуміло твоєму умовному колезі, то ChatGPT це ні краплі не очевидно, поки ти йому нормально тезісно це не розпишеш. Він генерував все дуже рандомно і інколи взагалі не так, як би тобі цього хотілось. Все через «розпливчасті» формулювання з мої сторони які він кожен раз міг інтерпретувати по різному. Тому багато чого прийшлось переписати й перефразувати.
Технічно почало все працювати в більшості випадків як треба, але тут стала очевидною нова проблема:
Нудно, аж за край.
Текстові рольові ігри в цілому штука не «для всіх», але якщо ще й текст «ні про що», то взагалі. Ще й часто квест «ходив по колу», не хотів закінчуватись і нічого цікавого не відбувалось.
Було прийняте рішення відібрати права у ChatGPT на задання експозиції й робити це самому, а також ліміт на етапи квесту. Я написав пару квестів з описом в стилі «герой в лісі йшов, грибочок знайшов, а грибочок не простий, а говіркий» і розмножено через сам же ChatGPT 4о.
Що могло піти не так? 🙂
Читайте пару абзаців тому про «очевидність». Якщо у моїй голові грибочок був магічним і з ним був пов’язаний квест, то у ChatGPT від грибочка можна було піти вліво, оминути його і повернутись до попередньої версії квестової системи з ходіннями по кругу й якимись випадковими подіями, часто навіть не пов’язаними одна з одною.
Але якийсь прогрес був. Шаблон квестів розширився і додалось, крім опису який вже був, його фінали до яких треба було вести та навіть опис NPC.
Тепер же все стало краще?
І так, і ні. Все ще можна було піти «наліво» і оминути квест і піти з феями танцювати у склепі таємного дракона, міняючи свій клас на арканомага лівої п’ятки. Але основна проблема була навіть не у цьому, а у тому, що ChatGPT не умів тримати секрети.
Наприклад, квест з умовним описом «ти прийшов у таверну, а там дивний чоловік. Ти з ним говориш, а він бах, і виявляється демоном і хоче зіграти з тобою у гру на твою душу» (звичайно текст там не такий, але давайте спрощено).
Що розказує нам ChatGPT у першому ж повідомленні? «Ваш герой Доу, приходить в таверну і зустрічає дивного чоловіка, який є древнім демоном». Занавіс.
І змінюю опис на: «ти прийшов у таверну, а там дивний чоловік. Ти з ним говориш, а він бах, і виявляється демоном (але це великий секрет, не кажи це гравцю, ніхто про це не знає) і хоче зіграти з тобою у гру на твою душу». ChatGPT: «Ваш герой Доу, приходить в таверну і зустрічає дивного чоловіка, який є древнім демоном, але це секрет про який ніхто не знає». 😂
Всі мої спроби завадити йому щось розказувати працювали з перемінним успіхом, через знову ж «різні інтерпретації». Після вечору роздумів «а що з цим взагалі робити», прийшла в голову проста, але (спойлер) дієва ідея: «домовитись про форматування». Тепер весь текст, якщо він обрамлений фігурними дужками, це {секретна інформація}.
Напевно, ви вже готові до мого класичного питання «що могло піти не так? 🙂».
Та все дуже просто — він взагалі перестав розказувати інформацію, яку я позначив як секретна. Говори ти з цим чоловіком і таверні хоч весь квест, він тільки буде натякати, що він не простий чолов’яга, але секрету свого не видасть. І так, мені прийшлось пояснювати, що секретна інформація, вона то секретна, але не настільки секретна, щоб її ніколи не розказувати.
Фінал {насправді ні}
Оскільки вже написано дуже багато тексту і не має впевненості, що він буде комусь цікавий, я поділю цей блог на дві частини. Якщо хтось буде зацікавлений, то я розкажу про другу стадію розробки, в якій розкажу «як СhatGPT квести не завершав», «як герой раптово вмирав», «як через низьку витривалість герой по сходинкам не міг піднятись» і як «клас, навички та атрибути персонажа почали впливати на хід квестів» та багато інших проблем та смішних ситуацій.
Всім дуже дякую, хто дочитав до кінця.
Бережіть себе та своїх близьких!
13 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів