Реализация бота-ассистента для FAQ в мобильном приложении
FAQ-бот — самая недооцениваемая задача. Кажется простой, реализуется за день, но в продакшне неизбежно оказывается, что вопросы пользователей не совпадают с формулировками в базе. «Как вернуть товар?» и «возврат денег» — это один вопрос, но без семантического поиска система их не свяжет.
Семантический поиск против точного совпадения
Простой вариант: пользователь пишет ключевые слова, система ищет по базе через LIKE или Elasticsearch. Работает, когда пользователь знает правильные термины.
Для натуральных вопросов нужен embedding-поиск. Каждый вопрос из FAQ и каждый запрос пользователя превращается в вектор, ищем ближайшего соседа по косинусному расстоянию.
from openai import OpenAI
import numpy as np
client = OpenAI()
def embed(text: str) -> list[float]:
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def find_best_faq(query: str, faq_embeddings: dict) -> tuple[str, float]:
query_vec = np.array(embed(query))
best_score = -1
best_key = None
for key, vec in faq_embeddings.items():
score = np.dot(query_vec, np.array(vec)) / (
np.linalg.norm(query_vec) * np.linalg.norm(np.array(vec))
)
if score > best_score:
best_score = score
best_key = key
return best_key, best_score
Порог score < 0.75 — отвечаем «не нашёл подходящего ответа, уточните вопрос». Без порога бот будет выдавать нерелевантные ответы с убедительным видом.
Структура базы FAQ
Каждая запись: вопрос (или несколько формулировок), ответ, категория, теги. Несколько формулировок одного вопроса улучшают recall при поиске.
Embeddings для FAQ вычисляются один раз при загрузке и кэшируются в Redis. При обновлении базы — инвалидируем кэш и пересчитываем.
Мобильный UI
Для FAQ-бота эффективна комбинация: категории-кнопки при старте диалога + свободный ввод.
Пользователь открывает чат → видит 4–6 категорий («Доставка», «Оплата», «Возврат», «Аккаунт») → тапает нужную → бот предлагает топ-3 вопроса в категории в виде чипов. Если ни один не подходит — пишет своими словами.
Такой UX снижает нагрузку на NLP и даёт пользователю структуру. Большинство находит ответ за 2–3 тапа, не вводя ни слова.
Кнопка «Это помогло?» под каждым ответом — обязательна. Негативные оценки формируют список вопросов для доработки базы.
Процесс работы
Формирование базы FAQ: сбор реальных вопросов из предыдущих обращений, категоризация.
Настройка embedding-поиска, подбор порога релевантности.
Мобильный UI с категориями и свободным вводом.
Аналитика: какие вопросы остаются без ответа — это входные данные для расширения базы.
Ориентиры по срокам
FAQ-бот с семантическим поиском на готовой базе — 2–4 дня. С разработкой структуры базы, категоризацией и аналитикой — до 1 недели.







