ДнД-бот: обработка запроса игрока
Игрок в ДнД: "Я хватаю меч и атакую!" Что дальше? Расскажу ниже.
Сразу оговорюсь, что вариант "отдай всё gpt-5.5" не рассматриваю — это уровень PoC (доказательство концепции). Если вы взялись за ДнД-бота всерьёз, вам наверняка понадобится пайплайн из нескольких вызовов LLM, которые будут выполнять разные функции. От этого и будем отталкиваться.
Итак, первое — нужно классифицировать запрос. Вы вряд ли захотите прогонять через движок вопрос типа "а сколько времени в Москве?", так что этот шаг обязателен. С этим хорошо спраляются маленькие модели.
Затем желательно нормализовать сообщение. Игрок говорит: "атакую его!" А кого он атакует? И чем? Благо, LLM прекрасно понимают контекст по предыдущим сообщениям. Проблема в том, что пайплайн LLM — это долго и дорого, и если каждая LLM будет вычислять контекст, это будет ещё дольше и ещё дороже. Лучше сразу вместо размытого "атакую его" получить конкретное "игрок атакует гоблина мечом".
Следом можно разбить сообщение на отдельные действия. Зачем? Это позволяет боту быть гибким: часть запроса можно пропустить, часть заблокировать. Например, игрок хочет спрятаться за укрытием и выстрелить из лука. А в локации нет укрытия. Честный бот скажет: укрытия не существует. Гибкий бот добавит: зато ты стреляешь с таким-то результатом.
Ну и если совсем заморочиться, то понадобится граф зависимостей действий, чтобы реалзиовать каскадную блокировку. Игрок хватает нож и бросает в гоблина? Но если нож не существует, то игрок не может схватить нож, а значит, и бросить в гоблина не может. Зависимости позволяют эту логику реализовать. (Да, gpt-5.5 сам за раз это всё и обработал бы, и зависимости бы решил. Но бота на этом не построишь.)
Тут стоит добавить, что в подобном пайплайне теряется общий контекст. Отдельные элементы обрабатывают отдельные действия, так что кому-то придётся потом склеивать разрозненные результаты воедино. Это может быть LLM, может быть что-то ещё.
Ну... вроде бы всё. Что даёт такая схема? Она даёт масштабирование, точность и крутые ответы. Так, управиться с длинным и сложным сообщением становится легче, если понятны зависимости и понятно, кто какую часть сообщения (отдельные действия) должен обработать. А точность увеличивается, протому что небольшие специализированные LLM с небольшим же контекстом не попадают в ловушку "lost in the middle" (в отличие от gpt-5.5, если она одна отвечает сразу за всё).
Наконец, ответы. Тут проявляется вся магия подхода. Каждое действие честно судится, кодом бросаются кубики, а на выходе получается честная логичная цепочка. Остаётся лишь придать ей красивую форму.
Например, игрок говорит:
Я прыгаю, отрубаю дракону голову и приземляюсь прямо в постель принцессы!
Описанный выше подход позволяет получить такое вот логичное дерево результатов без галлюцинаций:
И это круто, потому что игрок вроде как получает свободу и может творить дичь, но эта дичь будет честная — с правилами, кубами и последствиями.
P.S. Я описал свой личный взгляд на обработку сообщений в системе, где на первом месте стоит анализ, а нарратив в конце. Возможны и другие подходы, где мой опыт может быть не применим. Сам я сейчас работаю как раз над зависимостями действий для своего бота, о чём подробнее пишу в тг канале.

