Стратегия эмбеддинга: all-mpnet-base-v2 для семантического поиска
В этой статье объясняется, как мы используем модель-трансформер предложений all-mpnet-base-v2 для обеспечения семантического поиска в нашей SEO-инфраструктуре.
Проблема: Сопоставление запросов с продуктами
Когда пользователи ищут «мини-ПК» или «маленький компьютер», они имеют в виду одно и то же, несмотря на отсутствие общих ключевых слов. Традиционное сопоставление по ключевым словам здесь не работает. Нам нужны семантические эмбеддинги — плотные векторные представления, которые улавливают смысл, а не просто слова.
Наша SEO-инфраструктура обрабатывает более 65 000 поисковых запросов и должна:
-
Кластеризовать похожие запросы для страниц запросов
-
Сопоставлять запросы с продуктами на основе смысла
-
Находить связанные поисковые запросы
-
Расширять сопоставления фраз с фильтрами
Модель: all-mpnet-base-v2
Мы используем all-mpnet-base-v2, модель-трансформер предложений (sentence transformer), которая:
-
Выводит векторы размерностью 768
-
Обучена на более чем 1 миллиарде пар предложений
-
Обрабатывает последовательности длиной до 384 токенов
Модель преобразует текст в плотное векторное пространство, где семантически похожий текст имеет высокое косинусное сходство.
Как мы её используем
1. Эмбеддинг запросов
Мы преобразуем все поисковые запросы в 768-мерные векторы:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-mpnet-base-v2")
embeddings = model.encode(queries)
Каждый запрос становится вектором из 768 чисел с плавающей запятой (3 072 байта). Для 65 000 запросов это ~190 МБ эмбеддингов.
2. Кластеризация запросов
Мы группируем запросы по сходству:
-
Выбираем топ-1 000 запросов по трафику в качестве центров кластеров
-
Вычисляем косинусное сходство между всеми 65 тыс. запросами и этими 1 тыс. центров
-
Запросы со сходством ≥ 0.85 присоединяются к этому кластеру
-
Некластеризованные запросы становятся отдельными кластерами
Это создает страницы запросов, где каждая страница представляет собой кластер похожих поисков.
Подробности см. в Алгоритме кластеризации запросов.
3. Сопоставление продуктов
Мы преобразуем названия и характеристики продуктов в эмбеддинги, а затем сопоставляем запросы с продуктами, используя косинусное сходство. Продукты с наибольшим сходством с запросом появляются на соответствующей странице запроса.
Подробности см. в Алгоритме сопоставления продуктов.
4. Расширение сопоставлений фраз
Мы используем эмбеддинги для поиска похожих фраз для извлечения фильтров. Например, если «мини-ПК» сопоставляется с фильтром размера, мы можем определить, что «маленький компьютер» тоже должен.
Подробности см. в Расширении сопоставлений фраз.
Хранение: Массивы NumPy
Мы храним эмбеддинги в файлах NumPy .npy:
import numpy as np
# Сохранение
np.save("embeddings.npy", embeddings)
# Загрузка (с отображением в память)
embeddings = np.load("embeddings.npy", mmap_mode='r')
Почему NumPy?
-
Быстрая загрузка с использованием отображения в память
-
Нативные операции с массивами для вычисления сходства
-
Компактный бинарный формат (~190 МБ для 65 тыс. запросов)
Инкрементальный эмбеддинг
Мы не пересоздаем эмбеддинги для всех запросов каждый раз. Наш инкрементальный процесс:
- Загружает существующие эмбеддинги
- Сравнивает ключи запросов (текст + метаданные)
- Создает эмбеддинги только для новых или измененных запросов
- Добавляет их к существующему массиву
Это значительно сокращает время обработки, когда изменяется лишь несколько запросов.
Мультисерверная архитектура
Эмбеддинги используются на нескольких серверах:
- Пакетный пайплайн: Генерирует эмбеддинги из запросов и продуктов
- Поисковый сервис: Загружает эмбеддинги для API связанного поиска
- Основной веб-сервер: Использует эмбеддинги для сопоставления продуктов
Хранение варьируется в зависимости от сервера:
-
Файлы NumPy: Пакетный пайплайн (быстрый локальный доступ)
-
Valkey RediSearch: Поисковый сервис (поиск по векторному сходству)
Подробности об интеграции с Valkey см. в Архитектуре поискового сервиса.
Интеграция с SEO-пайплайном
Эмбеддинги обеспечивают работу нескольких этапов пайплайна:
- Шаг 0: Эмбеддинг исходных данных — Продукты, детали, статьи
- Шаг 3b: Эмбеддинг запросов — Все поисковые запросы
- Шаг 4: Расширение сопоставлений фраз — Поиск похожих фраз
- Шаг 5: Кластеризация запросов — Группировка в страницы запросов
- Шаг 6: Сопоставление продуктов — Сопоставление запросов и продуктов
- Шаг 8: Генерация связанных запросов — Поиск связанных запросов
Полную схему см. в Обзоре SEO-пайплайна.
Ссылки
Документация модели
-
Карточка модели all-mpnet-base-v2 — Hugging Face
-
Документация Sentence Transformers — Официальная документация
-
Статья о Sentence Transformers — Reimers & Gurevych, 2019
Технические концепции
-
Векторные представления слов — Википедия
-
Косинусное сходство — Википедия
-
Файлы с отображением в память NumPy — Документация NumPy
Связанные статьи
-
Обзор SEO-пайплайна — Полная архитектура пайплайна
-
Алгоритм кластеризации запросов — Как мы кластеризуем 65 тыс. запросов
-
Архитектура поискового сервиса — Интеграция с Valkey RediSearch
-
Алгоритм сопоставления продуктов — Семантическое сопоставление
-
Расширение сопоставлений фраз — Использование эмбеддингов для фильтров
Резюме
Мы используем all-mpnet-base-v2 для преобразования текста в 768-мерные векторы, которые улавливают семантический смысл. Эти эмбеддинги обеспечивают работу всей нашей SEO-инфраструктуры:
-
Кластеризация запросов: Группировка 65 тыс. запросов в страницы с использованием порога сходства 0.85
-
Сопоставление продуктов: Семантическое сопоставление запросов с продуктами
-
Связанные запросы: Поиск похожих запросов для навигации
-
Расширение фраз: Обнаружение новых фраз для фильтров
Эмбеддинги хранятся в виде массивов NumPy для быстрой загрузки и обрабатываются инкрементально, чтобы избежать повторного создания для неизмененных данных. Одни и те же эмбеддинги используются на нескольких серверах через файлы NumPy и Valkey RediSearch.