Стратегия эмбеддинга: 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 тыс. запросов)

Инкрементальный эмбеддинг

Мы не пересоздаем эмбеддинги для всех запросов каждый раз. Наш инкрементальный процесс:

  1. Загружает существующие эмбеддинги
  2. Сравнивает ключи запросов (текст + метаданные)
  3. Создает эмбеддинги только для новых или измененных запросов
  4. Добавляет их к существующему массиву

Это значительно сокращает время обработки, когда изменяется лишь несколько запросов.

Мультисерверная архитектура

Эмбеддинги используются на нескольких серверах:

  1. Пакетный пайплайн: Генерирует эмбеддинги из запросов и продуктов
  2. Поисковый сервис: Загружает эмбеддинги для API связанного поиска
  3. Основной веб-сервер: Использует эмбеддинги для сопоставления продуктов

Хранение варьируется в зависимости от сервера:

  • Файлы NumPy: Пакетный пайплайн (быстрый локальный доступ)

  • Valkey RediSearch: Поисковый сервис (поиск по векторному сходству)

Подробности об интеграции с Valkey см. в Архитектуре поискового сервиса.

Интеграция с SEO-пайплайном

Эмбеддинги обеспечивают работу нескольких этапов пайплайна:

  1. Шаг 0: Эмбеддинг исходных данных — Продукты, детали, статьи
  2. Шаг 3b: Эмбеддинг запросов — Все поисковые запросы
  3. Шаг 4: Расширение сопоставлений фраз — Поиск похожих фраз
  4. Шаг 5: Кластеризация запросов — Группировка в страницы запросов
  5. Шаг 6: Сопоставление продуктов — Сопоставление запросов и продуктов
  6. Шаг 8: Генерация связанных запросов — Поиск связанных запросов

Полную схему см. в Обзоре SEO-пайплайна.

Ссылки

Документация модели

Технические концепции

Связанные статьи

Резюме

Мы используем all-mpnet-base-v2 для преобразования текста в 768-мерные векторы, которые улавливают семантический смысл. Эти эмбеддинги обеспечивают работу всей нашей SEO-инфраструктуры:

  • Кластеризация запросов: Группировка 65 тыс. запросов в страницы с использованием порога сходства 0.85

  • Сопоставление продуктов: Семантическое сопоставление запросов с продуктами

  • Связанные запросы: Поиск похожих запросов для навигации

  • Расширение фраз: Обнаружение новых фраз для фильтров

Эмбеддинги хранятся в виде массивов NumPy для быстрой загрузки и обрабатываются инкрементально, чтобы избежать повторного создания для неизмененных данных. Одни и те же эмбеддинги используются на нескольких серверах через файлы NumPy и Valkey RediSearch.


← Назад к указателю документации