Свой Dungeon Master в Телеграме на коленках
В прошлый раз я рассказывал, как пытался играть в ДнД с ChatGPT. Почувствовал потенциал, но удовлетворения не получил: сценарию гпт не следует, бросать кубики не умеет, подыгрывает и всё забывает. Играть хотелось, но продолжать есть кактус было больно. И я подумал: а вдруг я смогу как-то улучшить этот опыт? Тем более что я как-то делал себе бот-напоминалку в тг на N8N, плюс под эту платформу есть даже готовый шаблон "незабывающего" ДМ... в общем, звёзды совпали! :) Я решил собрать своего Франкенштейна.
За основу взял как раз N8N + Telegram. Для стадии PoC (проверки концепта) это идеальный вариант: логика наглядно собирается стрелочками, связи очевидны, и не нужно тратить недели на написание бэкенда с нуля там, где можно провериться за несколько вечеров. Плюс у них есть ноды-агенты и лёгкая интеграция почти с чем угодно. Для хранения данных выбрал Google sheets. Сами данные оказалось удобно хранить в json, примерно так:
В сочетании с N8N это оказалось чертовски удобным. На каждом шаге можно открыть входящий и исходящий json и посмотреть, что там внутри и всё ли правильно.
Общий алгоритм выполнения получился следующий:
получаем сообщение игрока
собираем данные локации и историю из гугл таблиц
пакуем всё это вместе, чтобы скормить агенту
агент переваривает и выдаёт мега-json со всеми изменениями
парсим ответ агента
обновляем базу данных (гугл таблицы)
пишем ответ ИИ-мастера игроку
Что касается агента, тут всё просто. В N8N есть готовая нода Agent, к ней привязывается модель, на которую у вас есть подписка и API ключ; я использовал groq/llama-70b-versatile. Также можно привязать тулы (инструменты); в моём случае это генератор бросков кубов. Плюс агенту нужен контекст - та самая память: собирается из данных о локации и сжатой истории. Наконец, понадобится большой системный промпт: как отвечать, на что реагировать, как заполнять выходной json, чтобы не сломать базу.
Сборку входных данных для агента и парсинг его ответа я сделал через JS ноды, код которых любезно написал для меня ChatGPT.
В результате получилась вполне рабочая схема. Выглядит это всё вот так.
Я потратил какое-то время на перекладывание своего готового сценария на 10 локаций в json и раскладывание по табличкам, и сел играть. Что я могу сказать, оно работает! Поскольку локации и статы лежат в базе, бот не может их забыть. Из любой локации можно идти только туда, куда прописаны переходы, и никаких "тайных проходов". Если очень постараться, можно заставить его не галлюцинировать лут и не наделять его магическими свойствами. Броски теперь не сочиняются, а честно генерируются отдельным инструментом. Ну, круто! :)
Ограничений, конечно, тоже много, и назвать это полноценной игрой никак нельзя. Исключительно проверка гипотезы PoC, не больше. Сейчас этот Франкенштейн уже перерастает во что-то большее. Если пост зайдет, в следующий раз расскажу про эволюцию архитектуры, ограничения ИИ, трудности соло-разработки и о многом другом)) Что думаете, взлетит такая тема для игр?

