Разработчик под ником chechestor опубликовал на GitHub библиотеку tg-statemachine-bot, которая решает типовую задачу: заставить LLM вести диалог по заранее определённому сценарию. Проблема следования инструкциям актуальна для ботов-консультантов, продажников, планировщиков — любой бизнес-логики, где нужен предсказуемый разговор. По словам автора, даже самые продвинутые модели нарушают инструкции, а чем длиннее скрипт, тем сложнее его соблюдать.

Причина в широком окне контекста: LLM опирается на всю инструкцию одновременно, и на длинных текстах её работа превращается в хаос. Классический обходной путь — построение агентной сети, которая разбивает задачу на части и решает поэтапно. Но количество вызовов нейросети и стоимость диалога при этом растут в разы, что часто делает применение LLM нецелесообразным. Автор предложил «приземлить» модель к скрипту, задав структуру сценария жёстко в логике бота.

МодульНазначение
fsmМашина состояний, хранит граф состояний диалога и текущее состояние пользователя
vars_memoryПамять переменных диалога
conversation_coreОркестратор, собирает инструкцию для LLM и обрабатывает вызовы

Главная идея проекта — «граф ведёт, модель исполняет». Весь диалог разбивается на этапы, объединённые в граф с направленными переходами. У каждого этапа есть цель: обычно получение некоторой информации из ответов собеседника. Входные и выходные данные этапов хранятся в именованных переменных, которые могут передаваться между этапами. Общение на каждом этапе ведёт LLM, она же решает, на какой этап переходить дальше.

Архитектура состоит из трёх модулей. fsm — конечный автомат, хранящий граф состояний и текущее состояние пользователя. vars_memory — память переменных диалога. conversation_core — оркестратор, который собирает инструкцию для LLM. Инструкция — композиция из общей роли и правил, инструкции текущего этапа, входных переменных, прогресса заполнения и доступных сигналов перехода.

Ответ модели фиксируется контрактом из четырёх полей: response_message (что сказать пользователю), fsm_signal (какой переход совершить), stage_result (структурированные данные этапа) и stage_summary (саммари при завершении). Чтобы модель не нарушала контракт, conversation_core делает перезапросы от роли developer, указывая на ошибку и требуя исправить её.

Исходный код опубликован в репозитории tg-statemachine-bot, в разделе обсуждений автор ждёт обратной связи. Проект интересен тем, кто строит продакшн-ботов и ищет баланс между стоимостью диалога и его качеством.