Реализация бота-ассистента для техподдержки в мобильном приложении
Бот техподдержки — один из немногих случаев, где LLM оправдывает себя экономически без сложной настройки. Если база знаний структурирована, RAG (retrieval-augmented generation) даёт точные ответы с минимальной галлюцинацией. Если нет — LLM будет изобретать несуществующие решения с уверенным тоном.
RAG как основа бота поддержки
Классическая схема: документация, статьи базы знаний, решённые тикеты → векторная база → при запросе пользователя ищем релевантные фрагменты → передаём в LLM как контекст → модель формулирует ответ на основе реальных данных.
Стек, который хорошо работает для поддержки:
База знаний (Confluence, Notion, MDX файлы)
↓ Chunking + Embedding (text-embedding-3-small / BGE-m3)
Qdrant / pgvector
↓ Semantic search (top-5 чанков)
GPT-4o mini / Claude 3.5 Haiku
↓ Answer generation with context
Мобильный клиент
Критически важно: чанки должны быть смысловыми, не механическими по 500 символов. Если разрезать статью посередине абзаца, релевантный контекст потеряется. Используем RecursiveCharacterTextSplitter с разделителями по заголовкам и абзацам.
Эскалация к живому оператору
Бот не должен изображать всезнание. Если confidence ниже порога (или модель явно говорит «не знаю») — эскалация к оператору. Переключение прозрачное: пользователь видит уведомление «Подключаю специалиста», история диалога передаётся оператору.
Интеграции для передачи в живой чат: Zendesk Chat API, Intercom, AmoCRM, собственная система тикетов. Технически — вебхук с историей диалога и контактными данными.
Важный паттерн: бот продолжает работать в фоне при ожидании оператора. Если очередь длинная, бот пробует найти ответ ещё раз, предлагает полезные статьи пока пользователь ждёт.
Классификация и приоритизация тикетов
Если бот не решил проблему самостоятельно, он классифицирует обращение перед передачей:
CATEGORY_PROMPT = """
Классифицируй обращение пользователя по категории:
- billing (вопросы оплаты, счёт, возврат)
- technical (ошибки, не работает функция)
- account (аккаунт, пароль, доступ)
- other
Верни только название категории, без пояснений.
"""
async def classify_ticket(user_message: str) -> str:
response = await openai_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": CATEGORY_PROMPT},
{"role": "user", "content": user_message}
],
temperature=0
)
return response.choices[0].message.content.strip()
Категория определяет очередь и приоритет тикета. temperature=0 — не случайность: для классификации нужна детерминированность, не творческий подход.
UI особенности для поддержки
Вложения. Пользователи хотят прикреплять скриншоты и видео. На iOS — PHPickerViewController с ограничением типов медиа, на Android — ActivityResultContracts.GetContent(). Файлы загружаются на S3 / Cloudinary, в сообщение вставляется превью.
Статус тикета. Если тикет создан, пользователь видит его номер и может отслеживать через того же бота: «Статус моего обращения #12345».
Рейтинг ответа. После каждого бот-ответа — thumbs up/down. Данные идут в аналитику и помогают улучшать базу знаний.
Процесс работы
Аудит базы знаний: объём, формат, актуальность.
Настройка пайплайна: парсинг документов, chunking, embedding, векторная база.
Разработка системного промпта с инструкцией не выходить за рамки базы знаний.
Логика эскалации и интеграция с тикет-системой.
Мобильный клиент с поддержкой вложений и статуса тикета.
Ориентиры по срокам
Бот с RAG на готовой базе знаний без интеграции с тикет-системой — 1 неделя. Полный бот с RAG, классификацией, эскалацией к оператору, аналитикой — 3–4 недели.







