Порівняння векторної квантації: інт8 проти бінарної квантації щодо точності та обсягу зберігання
Виміряйте, як інт8 та бінарна квантація впливають на точність та обсяг зберігання ембеддингів, чому бінарна квантація може призводити до зниження якості, та як вибрати безпечний рівень стиснення.
Зменшення розміру ембеддингів здається способом отримати гроші без зусиль, і багато посібників обмежуються саме цим. Швидкий тест показує, що різниця між „безпечним“ та „нерозсудливим“ ступенем стиснення значно більша, ніж визнають ці посібники.
Ось суть проблеми. Квантація Int8 зазвичай зберігає 95% або більше точності пошуку, водночас зменшуючи обсяг зберігання у 4 рази. Бінарна квантація дозволяє досягти вражаючого зменшення обсягу у 32 рази, але якщо модель ембеддингів не була навчена для цього, точність пошуку може знизитися на третину або більше. Ці два підходи — це не точки на одній шкалі; вони поводяться настільки по-різному, що вибір неправильного методу для вашої моделі може тихо зіпсувати якість пошуку.
Квантування працює шляхом зберігання кожного виміру з меншою точністю. Ви можете перейти від 32-бітних чисел з плаваючою комою до 8-бітних цілих чисел (скаларне квантування) або навіть до одного біта на вимір (бінарне квантування). Економія є реальною: використання RAM зменшується до 24 разів при бінарному квантуванні та на 3,75 рази при скаларному, причому ефект посилюється, коли корпус даних містить мільйони векторів, що стає все більш поширеним для пам’яті агентів та корпоративних систем RAG у 2026 році.
Як виглядають цифри
Тестовий корпус був синтетичним: 2 000 векторів із 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 рази, що є гарним показником для більшості продуктивних систем. Формат Binary у цьому універсальному симуляційному середовищі, створеному не з урахуванням квантації, показав лише 32,6% точності пошуку, незважаючи на вражаюче скорочення об’єму у 32 рази. Це не помилка округлення – приблизно два з кожних трьох релевантних результатів, які б повернув формат float, зникли.
Чому формат Binary має значно гірші результати
Усе зводиться до кількості інформації, яка зберігається. Формат Int8 зберігає точні значення для кожного виміру, що забезпечує достатню роздільну здатність для збереження більшості відносних геометричних характеристик векторів. Формат Binary зберігає лише знак та повністю видаляє модуль, що є значно жорсткішим спрощенням простору ембеддингів.
Однак це не є законом природи. Це залежить від моделі. Незалежні тестування показали, що деякі архітектури ембеддингів майже не відчувають впливу бінарної квантації та зберігають близько 98% якості на рівні float, тоді як інші сімейства зазнають значніших втрат та досягають рівня 87–92%, залежно від розміру моделі. Те, що їх відрізняє, — це те, чи була модель навчена так, щоб витримати квантацію.
Який варіант обрати
- Встановіть int8 як стандарт. Ви втрачаєте трохи точності, що легко прогнозувати, а заощаджений простір все одно достатньо великий, щоб це мало значення для великого індексу.
- Використовуйте бінарний формат лише з моделлю, створеною для цього. Постачальники тепер постачають варіанти ембеддингів, сумісні з квантацією, оскільки загальні ембеддинги сильно погіршуються під час бінарного стиснення. Перед впровадженням переконайтеся, що ваша конкретна модель пройшла перевірку на сумісність, і не припускайте, що цей метод безпечний у всіх випадках.
Поширені запитання
Скільки точності коштує використання формату int8? Зазвичай дуже мало — зниження показника відтворення даних зазвичай становить менше 5% порівняно з повним форматом float32, за що витрачається приблизно в 4 рази менше пам’яті.
Чи є бінарна квантація безпечною? Лише за умови використання моделей з вбудовуваними елементами, навчених толерувати її. Загальні моделі можуть втратити третину або більше точності пошуку, тоді як моделі, схильні до квантації, можуть зберегти 98% або більше якості на рівні float.
Скільки місця зберігання ви економите? При використанні int8 — приблизно у 4 рази. Бінарна квантація може дати економію у 24-32 рази, але з значно більшими та менш прогнозованими втратами у точності.
Чи потрібно перевбудовувати все заново? Не обов’язково. Ви можете квантувати існуючі ембеддинги типу float32 пізніше, як це робить наведений вище код. Однак моделі, навчені з урахуванням стиснення, зазвичай будуть кращими за готові ембеддинги, які були квантувані пізніше.
Останнє застереження: цей корпус є синтетичним та структурованим у кластери, він призначений лише для ілюстрації. Реальний рівень відтворення даних залежить від вашої моделі ембеддингів, структури ваших даних та шаблонів запитів, тому проведіть тестування на власних даних перед тим, як обрати рівень стиснення.