Бот-асистент для 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 тижня.







