Sakhanda Wire
NVDA MSFT GOOGL META AMZN
← К новостям

Многовекторные модели эмбеддингов (с поздним взаимодействием) с Sentence Transformers

Многовекторные модели эмбеддингов (позднее взаимодействие) с Sentence Transformers
Опубликовано 18 августа 2026 года
Обновить на GitHub
Sentence Transformers — это библиотека Python для использования и обучения моделей эмбеддингов и переранжирования в таких приложениях, как генерация с дополнением поиска, семантический поиск и других. В обновлении v6.0 появился четвертый тип модели: MultiVectorEncoder, предназначенный для поиска с поздним взаимодействием в стиле ColBERT. Любой чекпоинт PyLate и любой чекпоинт Stanford-NLP ColBERT загружается непосредственно в него; также можно использовать модели colpali-engine для визуального поиска по документам — через тот же привычный API, который уже используется для плотных, разреженных моделей и моделей переранжирования.

Если обычная модель эмбеддингов сжимает весь текст в один вектор, многовекторная модель хранит один вектор на токен и оценивает соответствие запроса документу с помощью оператора MaxSim. Это сохраняет информацию о сопоставлении на уровне токенов, которую одному вектору пришлось бы усреднить, что обычно обеспечивает более качественный поиск ценой увеличения индекса. Это также современный стандарт для визуального поиска по документам: текстовый запрос сопоставляется непосредственно с изображениями страниц, без промежуточного этапа OCR.

В этой статье мы покажем, как использовать такие модели: загружать различные форматы чекпоинтов, выполнять кодирование и оценивание, подключать их к поисковому стеку, запускать их на изображениях страниц и сохранять индекс доступным по стоимости. Все приведенные ниже примеры работают после обычной команды pip install -U sentence-transformers.

Содержание

  • Что такое многовекторные модели?
    • Оператор MaxSim
    • Преимущества и издержки
  • Установка
  • Загрузка модели
    • Проверка конфигурации чекпоинта
  • Кодирование запросов и документов
  • Оценивание с помощью MaxSim
    • Величина оценки и MeanMaxSim
  • Семантический поиск
  • Извлечение и переранжирование
  • Индексация
  • Визуальный поиск по документам
  • Поиск по аудио
  • Поиск по видео
  • Интерпретируемость
  • Пулинг токенов
  • Ускорение вывода
  • Оценка модели
  • Переход с PyLate или colpali-engine
  • Поддерживаемые модели
  • Благодарности
  • Дополнительные ресурсы

Что такое многовекторные модели?

Плотная модель эмбеддингов читает текст и возвращает один вектор фиксированного размера. Все, что заметила модель, должно уместиться в этих 384, 768 или 1024 числах, а сходство определяется одним скалярным произведением двух таких сводных представлений. Это работает удивительно хорошо, но сжатие приводит к конкретной потере информации: редкая сущность, точный идентификатор или один важный фрагмент длинного отрывка должны конкурировать за место в том же векторе. Запрос с несколькими требованиями одновременно сталкивается с той же проблемой. Для запроса «зеленый диван с деревянными ножками и округлыми подушками» одному вектору приходится объединять все четыре признака в одну точку, поэтому зеленый диван с неподходящими ножками оказывается близок к тому, который вы действительно искали.

Многовекторная модель (также называемая моделью с поздним взаимодействием или моделью в стиле ColBERT — по названию статьи о ColBERT) избегает такого сжатия. Она использует тот же трансформер, но вместо объединения эмбеддингов токенов в один вектор проецирует каждый эмбеддинг токена в пространство небольшой размерности (классически 128) и сохраняет их все. Документ из 9 токенов превращается в матрицу 9×128, а не в вектор 1×128.

Взаимодействие между запросом и документом откладывается до этапа оценивания — отсюда и название «позднее взаимодействие». Кросс-энкодер взаимодействует с текстами на раннем этапе: оба текста проходят через модель вместе. Это точно, но не оставляет возможности для предварительного вычисления, поскольку каждый документ приходится кодировать заново для каждого нового запроса. Би-энкодер, которым является описанная выше плотная модель эмбеддингов, практически не взаимодействует с текстами вообще (одно скалярное произведение двух готовых сводных представлений), и именно это позволяет один раз закодировать коллекцию и быстро выполнять поиск. Позднее взаимодействие находится между этими подходами: документы по-прежнему кодируются независимо и могут индексироваться заранее, но при оценивании каждый токен запроса сравнивается с каждым токеном документа, что оставляет гораздо больше возможностей для их взаимодействия.

Плотные эмбеддинги и многовекторное позднее взаимодействие: плотная модель кодирует каждый текст в один вектор и оценивает сходство по косинусной мере, а многовекторная модель сохраняет один вектор на токен и сравнивает каждый токен запроса с каждым токеном документа с помощью MaxSim

Оператор MaxSim

Оценивание выполняется с помощью MaxSim: для каждого токена запроса выбирается его максимальное сходство с любым токеном документа, после чего эти максимумы суммируются по запросу.

Поскольку эмбеддинги токенов нормализованы по L2, каждое из этих скалярных произведений является косинусным сходством в диапазоне [-1, 1], поэтому вся сумма находится в пределах [-num_query_tokens, num_query_tokens].

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

Выравнивание не обязательно должно быть лексическим, поскольку эмбеддинги токенов учитывают контекст. Закодируйте «Where do penguins live?» вместе с «Penguins inhabit Antarctica.» с помощью lightonai/mLateOn, и токен запроса live найдет лучшее соответствие для inhabit с оценкой 0,94 — у этих слов нет ни одного общего символа! Именно этого не умеет лексический поиск: BM25 и его аналоги требуют наличия самого термина, поэтому синонимы и перефразирования проходят мимо. Плотные модели эмбеддингов, конечно, тоже устраняют этот разрыв. Позднее взаимодействие добавляет возможность делать это, не отказываясь от обратного направления: когда важнее точное совпадение (код товара, фамилия, имя функции), MaxSim по-прежнему видит этот токен отдельно, тогда как одномерной модели пришлось бы усреднить его со всем остальным. При этом соответствие не обязано быть взаимно однозначным: несколько токенов запроса часто сопоставляются с одним и тем же токеном документа.

Преимущества и издержки

Вы получаете более высокое качество поиска, особенно для запросов, где релевантность документа определяется одной конкретной деталью, для запросов с несколькими требованиями, подобных запросу о диване выше, где каждое требование может найти собственное подтверждение, а также для данных вне исходной предметной области, где сжатие плотной модели было настроено на другое распределение. Это сжатие усваивается по обучающим запросам: модель учится сохранять то, что было необходимо для них, и отбрасывать все остальное — включая именно то, о чем могут спрашивать ваши рабочие запросы. Эффект усиливается с увеличением длины документа, поскольку большему объему текста приходится помещаться в одном векторе фиксированного размера.

Цена — размер индекса. Один вектор на токен вместо одного вектора на документ означает гораздо больше векторов, и лишь частично компенсируется меньшей размерностью. Кодирование 4 874 отрывков из Natural Questions с помощью lightonai/LateOn создало 608 414 векторов токенов, в среднем по 124,8 на отрывок:

Представление Векторы Размерность Размер float32
Плотное, all-MiniLM-L6-v2 4 874 384 7,5 МБ
Плотное, gte-modernbert-base 4 874 768 15,0 МБ
Многовекторное, LateOn 608 414 128 311,5 МБ

Это примерно в 42 раза больше места, чем индекс MiniLM, или 62 КиБ на отрывок. Однако индексы часто сжимаются: например, те же 608 414 векторов занимают 92 МБ в индексе fast-plaid, поскольку PLAID хранит идентификатор центроида и квантованный остаток для каждого вектора, а не сам вектор. Для сравнения, плотной модели размерности 4096, такой как Qwen3-Embedding-8B, потребуется около 80 МБ для тех же 4 874 отрывков. Таким образом, сжатый многовекторный индекс находится примерно в том же диапазоне, что и плотные индексы, которые уже используются на практике. Пулинг токенов сокращает число векторов еще до этого, а извлечение и переранжирование позволяет вообще не создавать индекс.

PyLate будет неоднократно упоминаться в этой статье, поэтому кратко поясним: Sentence Transformers поддерживал плотные и разреженные модели, но не позднее взаимодействие, поэтому LightOn создала поверх него PyLate, чтобы устранить этот пробел, добавив необходимые для таких моделей компоненты обучения, вывода и поиска. Многие модели, которые вы загрузите ниже, были обучены с его помощью. LightOn также создала вокруг него экосистему, включая fast-plaid — индекс позднего взаимодействия, который рассматривается в разделе «Индексация». В версии v6.0 эти возможности встроены непосредственно в Sentence Transformers.

Учитывая этот компромисс, запустим модель.

Установка

Многовекторные модели работают при обычной установке:

pip install -U sentence-transformers

Для визуального поиска по документам в стиле ColPali также понадобятся зависимости для работы с изображениями (полный список дополнительных компонентов приведен в разделе Установка, а общая информация о мультимодальной поддержке — в статье Мультимодальные модели эмбеддингов и переранжирования):

pip install -U "sentence-transformers[image]"

Sentence Transformers v6.0 требует transformers v5.x, torch 2.2+ и huggingface-hub v1.x. Если вы зафиксировали более старые версии, сначала запланируйте обновление. Полный список критических изменений приведен в руководстве по миграции.

Переведено автоматически с английского. Оригинал статьи — по ссылке ниже.

Впервые опубликовано изданием Hugging Face

Читать оригинал на Hugging Face ↗

Текст и изображения принадлежат Hugging Face и приводятся здесь с указанием авторства и ссылкой на оригинальную публикацию.

← К новостям

Ещё новости

Все последние новости