Многовекторные модели эмбеддингов (с поздним взаимодействием) с Sentence Transformers
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: для каждого токена запроса выбирается его максимальное сходство с любым токеном документа, после чего эти максимумы суммируются по запросу.
Поскольку эмбеддинги токенов нормализованы по 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 требует
transformersv5.x,torch2.2+ иhuggingface-hubv1.x. Если вы зафиксировали более старые версии, сначала запланируйте обновление. Полный список критических изменений приведен в руководстве по миграции.
Переведено автоматически с английского. Оригинал статьи — по ссылке ниже.
