Сравнение векторной квантизации: инт8 против бинарной — точность восстановления и объем хранения
Определите, как инт8 и бинарная квантизация влияют на точность восстановления и объем хранения эмбеддингов, почему бинарная квантизация может приводить к потере данных, и как выбрать безопасный уровень сжатия.
Сокращение размера эмбеддингов кажется способом получения бесплатных денег, и многие руководства останавливаются на этом. Быстрый тест показывает, что уровни компрессии «безопасные» и «рискованные» значительно отличаются друг от друга, чем признают эти руководства.
Вот суть проблемы. Квантизация Int8 обычно сохраняет 95% или более точности поиска, одновременно сокращая объем хранения в 4 раза. Бинарная квантизация позволяет добиться впечатляющего сокращения объема в 32 раза, но если модель эмбеддингов не обучалась для этого формата, точность поиска может снизиться на треть или больше. Эти два метода не являются точками на одной шкале — их поведение настолько различно, что неправильный выбор может незаметно испортить качество поиска.
Квантизация заключается в хранении каждого измерения с меньшей точностью. Можно перейти от 32-битных чисел с плавающей точкой к 8-битным целым числам (скэлярная квантизация) или даже к одному биту на измерение (бинарная квантизация). Экономия реальна: использование ОЗУ снижается вдвое — до 24 раз при бинарной квантизации и в 3,75 раза при скэлярной; эффект усиливается, когда корпус данных содержит миллионы векторов, что становится всё более распространённым для памяти агентов и систем RAG в предприятиях в 2026 году.
Как выглядят цифры
Тестовый корпус был синтетическим: 2000 векторов с 768 измерениями, объединённых в 20 кластеров для имитации реальной семантической структуры. Точность поиска измерялась по показателю recall@10 по сравнению с базовым вариантом без сжатия в формате float32 после применения каждого из двух квантизаторов. Во-первых, int8, который масштабируется в соответствии с наибольшим абсолютным значением и округляет его в диапазон int8:
def quantize_int8(vecs):
scale = np.max(np.abs(vecs))
q = np.round(vecs / scale * 127).astype(np.int8)
return q.astype(np.float32) / 127 * scale
А также бинарный квантизатор, который сохраняет только знак каждого значения:
def quantize_binary(vecs):
return (vecs > 0).astype(np.float32) * 2 - 1
Результаты оказались следующими:
Format | Recall@10 vs float32 | Storage (MB) | Reduction
----------------------------------------------------------------------
float32 | 1.000 (baseline) | 6.144 | 1x
int8 | 0.961 | 1.536 | 4.0x
binary | 0.326 | 0.192 | 32.0x
Формат Int8 сохранял 96% точности поиска даже при сокращении объема хранения в 4 раза, что является отличным показателем для большинства производственных систем. Формат бинарный же в рамках этого универсального симулятора вкладок, не разработанного с учетом квантизации, показал всего 32,6% точности восстановления данных, несмотря на импрессивное сжатие в 32 раза. Это не ошибка округления — пропадает примерно два из каждых трех релевантных результатов, которые мог бы вернуть формат с плавающей точкой.
Почему бинарный формат создает столько проблем
Все сводится к количеству сохраняемой информации. Формат Int8 сохраняет точные значения для каждого измерения, что обеспечивает достаточную разрешающую способность для сохранения большей части относительной геометрии векторов. Формат бинарный сохраняет лишь знак числа и полностью удаляет его величину, что представляет собой гораздо более радикальное упрощение пространства вкладок.
Однако это не закон природы — всё зависит от модели. Независимые тестирования показали, что некоторые архитектуры эмбеддингов практически не чувствуют влияния двоичной квантизации и сохраняют около 98% качества, характерного для формата float, тогда как другие семейства теряют больше качества, оставаясь на уровне 87–92%, в зависимости от размера модели. Разница между ними заключается в том, была ли модель обучена так, чтобы выдерживать квантизацию.
Какой вариант выбрать
- Установите int8 в качестве стандартного формата. Вы теряете небольшую долю точности, причем это легко предсказуемо, а сэкономленное пространство всё равно достаточно велико, чтобы иметь значение для крупных индексов.
- Используйте двоичный формат только с моделью, предназначенной для него. Провайдеры теперь поставляют варианты эмбеддингов с учётом квантизации, поскольку стандартные эмбеддинги сильно ухудшают качество при двоичной компрессии. Перед развертыванием убедитесь, что ваша конкретная модель протестирована с учётом этого фактора, и не предполагайте, что эта техника безопасна во всех случаях.
Часто задаваемые вопросы
Насколько снижается точность при использовании int8? Обычно очень незначительно — потеря воспроизводимости обычно составляет менее 5% по сравнению с полным форматом float32, в обмен на примерно в 4 раза меньшее потребление памяти.
Безопасна ли двоичная квантовка? Только при использовании моделей встраивания, обученных с учетом ее возможностей. Универсальные модели могут потерять треть или больше точности поиска, тогда как модели, учитывающие квантовку, способны сохранить 98% или более качества на уровне чисел с плавающей точкой.
Сколько места на хранении сэкономляется? Примерно в 4 раза при использовании формата int8. При двоичной квантовке сэкономление может достигать 24–32 раз, но при этом существенно ухудшается и становится менее предсказуемой точность результатов.
Необходимо ли перевстраивать все данные? Не обязательно. Существующие эмбеддинги формата float32 можно квантовать позже, как это делается в приведенном выше коде. Однако модели, обученные с учетом компрессии, как правило, превосходят готовые эмбеддинги, подвергнутые квантовке позже.
Ещё одно предупреждение: приведенный здесь корпус является синтетическим и имеет кластерную структуру; он предназначен только в качестве иллюстрации. Реальная эффективность зависит от вашей модели вкладки, структуры данных и шаблонов запросов, поэтому проведите тестирование на собственных данных перед выбором уровня компрессии.