Реализация AI-слот-филлинга (Slot Filling) для чат-бота
Slot Filling — извлечение параметров из сообщения пользователя для выполнения действия. Намерение book_ticket требует слоты: origin, destination, date, passengers. Бот задаёт уточняющие вопросы, пока все обязательные слоты не заполнены.
Архитектура слот-филлинга
Классический подход (Rasa, Dialogflow): явное определение слотов, правил их заполнения и вопросов для каждого. Детерминированный, понятный.
LLM-based: модель в одном запросе извлекает все заполненные слоты и определяет, каких не хватает:
class FlightBookingSlots(BaseModel):
origin: str | None = None
destination: str | None = None
departure_date: str | None = None
return_date: str | None = None
passengers_count: int = 1
travel_class: Literal["economy", "business"] = "economy"
def extract_and_fill_slots(
conversation_history: list[dict],
current_slots: FlightBookingSlots
) -> tuple[FlightBookingSlots, str | None]:
"""
Возвращает: обновлённые слоты + следующий вопрос или None если все заполнены
"""
# LLM анализирует историю, обновляет слоты
updated = llm_extract_slots(conversation_history, current_slots)
# Определяем следующий обязательный пустой слот
next_question = get_next_question(updated)
return updated, next_question
Управление неполными и противоречивыми слотами
Пользователь может изменить ранее указанный слот: «Нет, подождите, я хочу лететь не в Москву, а в Питер». LLM-подход обрабатывает это естественно — просто передаёт обновлённую историю.
Слоты с зависимостями: return_date обязателен только при trip_type = "roundtrip". Условная логика в схеме слотов через Pydantic validators.
Формы и guided flow
Для сложных слот-форм: прогресс-бар или список уже заполненных / оставшихся полей помогает пользователю понимать, сколько шагов осталось.
Timeout слотов: если пользователь не завершает форму за 30 минут — спросить, хочет ли продолжить, или сохранить черновик.







