Перейти к содержанию
Innovialabs

Как добавить умный семантический поиск на сайт или в приложение

Практика3 мин

Коротко

Семантический поиск превращает тексты и запросы в векторы-эмбеддинги и ищет ближайшие по смыслу; лучше всего он работает в паре с обычным поиском по словам и с фильтрами по цене, категории и наличию.

Короткий ответ

Обычный поиск ищет совпадение слов: по запросу «обувь для бега» он может не найти «кроссовки для марафона». Семантический поиск ищет совпадение смысла. Каждый документ и каждый запрос превращаются в эмбеддинг — вектор чисел, где близкие по смыслу тексты оказываются рядом. Поиск сводится к вопросу «какие векторы ближе всего к вектору запроса».

Как это устроено

  1. Подготовка данных. Берёте товары, статьи или ответы поддержки. Длинные тексты режете на фрагменты (chunks) по смысловым блокам.
  2. Эмбеддинги. Каждый фрагмент прогоняете через модель эмбеддингов — облачную по API или открытую на своём сервере.
  3. Хранение. Векторы складываете в хранилище с поддержкой векторного поиска: расширение pgvector для PostgreSQL, Qdrant, Elasticsearch/OpenSearch и аналоги.
  4. Запрос. Запрос пользователя превращается в вектор той же моделью, база возвращает ближайшие фрагменты.
  5. Выдача. Результаты показываются списком или передаются в LLM, если нужен ответ своими словами (это уже RAG).

Что даёт семантика

  • Синонимы и перефразирование. «Не включается ноутбук» найдёт статью «Компьютер не запускается».
  • Опечатки. Модели эмбеддингов работают с частями слов, поэтому небольшие опечатки часто не ломают поиск.
  • Разные языки. Мультиязычные модели помещают «телефон», «phone» и «telefon» рядом. Для Узбекистана это важно: пользователи пишут на русском, узбекском латиницей и кириллицей вперемешку.
  • Запросы-описания. «Подарок девушке до 300 тысяч» — то, с чем поиск по словам почти не справляется.

Где семантика ошибается

  • Точные коды и артикулы. Запрос «iPhone 15 Pro 256» должен найти ровно эту модель, а не «похожие телефоны».
  • Редкие названия и бренды, которых модель не видела.
  • Отрицания. «Без сахара» и «с сахаром» могут оказаться близко.

Поэтому на практике используют гибридный поиск: параллельно идёт обычный полнотекстовый поиск (BM25) и векторный, а результаты объединяются, например методом Reciprocal Rank Fusion.

Как совместить с фильтрами

Пользователь хочет «удобные кроссовки», но только в наличии, размер 42 и до определённой цены. Фильтры должны работать вместе с векторным поиском:

  • Пре-фильтрация — сначала отбираете подходящие по фильтрам записи, потом ищете ближайшие среди них. Точнее, большинство векторных баз это поддерживают.
  • Пост-фильтрация — сначала находите N ближайших, потом отсекаете лишнее. Проще, но при жёстких фильтрах может остаться пустой список.

Пример с pgvector, где фильтр и векторная близость в одном запросе:

SELECT id, title, price
FROM products
WHERE category = 'shoes'
  AND in_stock = true
  AND price <= 500000
ORDER BY embedding <=> $1   -- $1: вектор запроса, <=> — косинусное расстояние
LIMIT 20;

Пошаговый план внедрения

  1. Соберите реальные запросы из логов поиска, особенно с пустой выдачей.
  2. Выберите модель эмбеддингов, которая поддерживает ваши языки, и проверьте её на этих запросах.
  3. Запустите гибридный поиск рядом со старым и сравните выдачу.
  4. Добавьте фильтры и, при необходимости, реранкер — модель, которая пересортировывает топ результатов точнее.
  5. Настройте переиндексацию: новые и изменённые товары должны получать эмбеддинги автоматически.
  6. Отслеживайте метрики: долю пустых выдач, клики по результатам, переходы в корзину.

Частые ошибки

  • Выкинуть полнотекстовый поиск и оставить только векторы.
  • Нарезать документы слишком крупно или слишком мелко — теряется точность.
  • Сменить модель эмбеддингов и не пересчитать старые векторы: векторы разных моделей несовместимы.
  • Не проверить качество на своих данных и языках.

Частые вопросы

Не обязательно. Если у вас уже PostgreSQL и данных не очень много, расширения pgvector часто достаточно. Отдельная векторная база имеет смысл при больших объёмах и высокой нагрузке.

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.