Как добавить умный семантический поиск на сайт или в приложение
Практика3 минРедакция Innovialabs
Коротко
Семантический поиск превращает тексты и запросы в векторы-эмбеддинги и ищет ближайшие по смыслу; лучше всего он работает в паре с обычным поиском по словам и с фильтрами по цене, категории и наличию.
Короткий ответ
Обычный поиск ищет совпадение слов: по запросу «обувь для бега» он может не найти «кроссовки для марафона». Семантический поиск ищет совпадение смысла. Каждый документ и каждый запрос превращаются в эмбеддинг — вектор чисел, где близкие по смыслу тексты оказываются рядом. Поиск сводится к вопросу «какие векторы ближе всего к вектору запроса».
Как это устроено
- Подготовка данных. Берёте товары, статьи или ответы поддержки. Длинные тексты режете на фрагменты (chunks) по смысловым блокам.
- Эмбеддинги. Каждый фрагмент прогоняете через модель эмбеддингов — облачную по API или открытую на своём сервере.
- Хранение. Векторы складываете в хранилище с поддержкой векторного поиска: расширение pgvector для PostgreSQL, Qdrant, Elasticsearch/OpenSearch и аналоги.
- Запрос. Запрос пользователя превращается в вектор той же моделью, база возвращает ближайшие фрагменты.
- Выдача. Результаты показываются списком или передаются в 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;
Пошаговый план внедрения
- Соберите реальные запросы из логов поиска, особенно с пустой выдачей.
- Выберите модель эмбеддингов, которая поддерживает ваши языки, и проверьте её на этих запросах.
- Запустите гибридный поиск рядом со старым и сравните выдачу.
- Добавьте фильтры и, при необходимости, реранкер — модель, которая пересортировывает топ результатов точнее.
- Настройте переиндексацию: новые и изменённые товары должны получать эмбеддинги автоматически.
- Отслеживайте метрики: долю пустых выдач, клики по результатам, переходы в корзину.
Частые ошибки
- Выкинуть полнотекстовый поиск и оставить только векторы.
- Нарезать документы слишком крупно или слишком мелко — теряется точность.
- Сменить модель эмбеддингов и не пересчитать старые векторы: векторы разных моделей несовместимы.
- Не проверить качество на своих данных и языках.