Реализация диалогового менеджмента для AI-бота (Dialog Management)
Dialog Management — компонент, управляющий состоянием диалога: что бот сделал, что знает, что должен сделать дальше. Это мозг бота, не его речь.
Модели диалогового управления
Finite State Machine (FSM): явные состояния и переходы. Надёжно, предсказуемо, но плохо масштабируется для сложных сценариев (взрывной рост числа состояний).
Frame-based: набор фреймов (форм) с слотами. Подходит для транзакционных диалогов (бронирование, заказ).
LLM-based: языковая модель принимает решение о следующем действии на основе истории диалога. Максимальная гибкость, но менее предсказуемо.
Гибридный (production-best): FSM для критических путей (оплата, авторизация), LLM для свободного диалога.
Состояние диалога
@dataclass
class DialogState:
conversation_id: str
user_id: str
current_intent: str | None
filled_slots: dict
dialog_history: list[DialogTurn]
context: dict # бизнес-контекст (профиль пользователя, сессия)
flow: str # "main_menu" | "booking" | "support" | "handoff"
pending_action: str | None # ожидаемое подтверждение/ввод
Управление потоком (Flow Management)
class DialogManager:
def process_turn(self, state: DialogState, user_input: str) -> BotAction:
# Обновляем историю
state.dialog_history.append(DialogTurn(role="user", text=user_input))
# Определяем интент
intent = self.intent_detector.detect(user_input)
# Решаем, что делать дальше
if self.should_escalate(state, intent):
return HandoffAction(reason=EscalationReason.USER_REQUEST)
if state.flow == "booking" and state.pending_action == "confirm":
return self.handle_booking_confirmation(state, user_input)
# Обновляем слоты
state.filled_slots = self.slot_filler.update(user_input, state.filled_slots)
# Выбираем следующее действие
return self.policy.select_action(state, intent)
Политика выбора действий
Policy — алгоритм выбора следующего действия бота. Варианты:
- Rule-based: if-else дерево решений — прозрачно, ограничено
- Learned policy (Rasa Core): обученная нейросеть на диалогах — гибкость
- LLM policy: языковая модель выбирает действие из набора доступных инструментов
Персистентность состояния
Redis: быстрый, TTL 24 часа для активных сессий. PostgreSQL: долгосрочная история диалогов для аналитики. При перезапуске бота — состояние не теряется, диалог продолжается.







