Как спроектировать систему Intent Detection для чат-бота на русском языке (классика + LLM)?
Краткий тезис
Проектирование системы Intent Detection для русскоязычного чат-бота требует комбинации классических методов (быстрые и дешёвые интенты) и LLM-подхода (гибкие и сложные сценарии). Отказ от единого подхода в пользу гибридной архитектуры позволяет достичь оптимального баланса скорости, точности и стоимости. В разборе рассматриваются три архитектуры: чистый классификатор (fastText/BERT), LLM с few-shot промптингом и гибридная схема с роутером. Особое внимание уделяется русскоязычным ограничениям (морфология, редкие интенты) и метрикам качества.
-----|-------|--------|---------------------| | FastText | Очень быстрая, работает с морфологией русского (субсловные n-граммы), поддерживает OOV | Нет контекста, чувствительна к синонимии | «Закажи пиццу» → intent_order | | BERT (RuBERT / LaBSE) | Учитывает контекст, лучше обрабатывает перефразировки | Требует GPU, latency >100 мс | «Не могли бы вы подсказать, как оформить заказ?» → intent_order |
Рекомендация: для русского языка RuBERT от DeepPavlov даёт F1 ~0.95 при 50 классах, но fastText (cbow, lr=0.5, dim=200) часто достаточен для 10–20 интентов.
1.3. Архитектура пайплайна
Пользовательский запрос → Токенизация (Natasha / spaCy) → Эмбеддинг → Классификатор (softmax) → Постобработка (confidence threshold) → Выбор сценария
Код примера (fastText):
import fasttext
# Обучение на русских фразах
model = fasttext.train_supervised("train_ru.txt", lr=0.5, epoch=25, wordNgrams=2)
# Предсказание
labels, probs = model.predict("Хочу вернуть товар", k=1)
Типичный порог confidence = 0.7; если ниже → отправляем на fallback (LLM или оператор).
2. LLM-подход: промптинг + few-shot
2.1. Когда использовать LLM
- Новые или редкие интенты без размеченных данных;
- Сложные намерения, требующие логики (например, «Мне нужно отменить бронь, если не прошло 24 часа»);
- Многоязычный бот – одна LLM покрывает несколько языков.
2.2. Промптинг для Intent Detection
Структура промпта:
Ты – классификатор намерений чат-бота. Определи intent (строго один из списка) для запроса пользователя на русском языке.
Список intent: [order, cancel, support, feedback].
Примеры:
- "Закажи доставку" → order
- "У меня проблема с оплатой" → support
- "Оставить отзыв" → feedback
Запрос: {user_utterance}
Intent:
Рекомендации:
- Используй few-shot (3–5 примеров на интент);
- Добавь format enforcement: output only the intent label;
- Для русских запросов проявляет себя хорошо GPT-4o или YandexGPT (более дешёвый).
2.3. Ограничения
- Стоимость: каждый запрос платный;
- Латентность: 1–3 секунды в среднем;
- Нестабильность: может выдать маловероятный intent при двусмысленности.
3. Гибрид: классификатор для быстрых интентов, LLM для сложных
3.1. Архитектура роутера (Two-stage)
Запрос → Классификатор (fastText) → confidence ≥0.8 → intent найден → сценарий
↓ confidence <0.8
→ LLM (few-shot) → intent
↓ unknown
→ Оператор / fallback
Схема:
[Пользователь] → [Router] → [High confidence] → [Action: order, cancel...]
→ [Low confidence] → [LLM Intent Classifier] → [Intent]
→ [Still unknown] → [Transfer to human]
3.2. Преимущества гибрида
- 80% запросов обрабатываются быстрым классификатором (латентность <50 мс);
- Оставшиеся 20% – сложные/новые – идут на LLM (точность выше 95%);
- Снижение стоимости: LLM вызывается только при необходимости.
3.3. Выбор порогов
Пороги динамичны: для бизнес-критических интентов (например, «отмена заказа с возвратом денег») порог повышают до 0.9, для информационных – 0.7.
4. Измерение качества
4.1. Ключевые метрики
| Метрика | Формула | Интерпретация для Intent Detection |
|---|---|---|
| Accuracy | (TP+TN)/(все) | Базовая, но не подходит для несбалансированных классов |
| Precision (точность) | TP/(TP+FP) | Насколько редко система ошибается, назначая intent |
| Recall (полнота) | TP/(TP+FN) | Как часто система находит нужный intent |
| F1-micro | гармоническое среднее precision/recall | Рекомендуется для multi-class |
| Confidence Calibration | ECE (Expected Calibration Error) | Важно для роутерных порогов |
4.2. Разметка русскоязычного датасета
- Используй Active Learning: начинай с 50 примеров на интент, доразмечай сложные случаи;
- Учитывай регистр, падежи, слова-паразиты («ну», «типа»);
- Пример датасета в формате JSON:
{"text": "Подскажите, как отменить заказ?", "intent": "cancel"}
4.3. Тестирование на Offline + Online
- Offline: разделение на train/test (80/20), кросс-валидация по пользователям;
- Online: A/B-тест гибрида против классического подхода (метрика: успешное разрешение диалога, FCR).
5. Пет-проект для закрепления
Задача: Разработать чат-бот для пиццерии с 5 интентами (order, change_order, cancel, feedback, help) на русском языке, используя гибридную архитектуру.
Инструменты: Python, fastText, OpenAI API (или YandexGPT), FastAPI, Docker.
Шаги:
- Собрать 200 фраз на каждый интент (например, с помощью краудсорсинга или генерации синонимов);
- Обучить fastText на 80% данных;
- Написать роутер с порогом confidence = 0.8;
- Для low confidence запросов вызывать LLM через промпт с few-shot (3 примера на интент);
- Развернуть как REST-сервис на FastAPI;
- Измерить метрики (F1, latency, cost per request).
Ожидаемый результат: Кириллический чат-бот, который корректно определяет intent в 95% случаев, при этом 80% запросов обрабатывается за <50 мс и без затрат на LLM.
Связь с другими вопросами
Навигация
- Предыдущий: 936
- Следующий: 938
- Индекс: 00. Индекс разборов