Strona główna / Artykuły / Porównanie kwantyzacji wektorowej: Int8 kontra binarna – dokładność odzyskiwania informacji i zużycie pamięci

Porównanie kwantyzacji wektorowej: Int8 kontra binarna – dokładność odzyskiwania informacji i zużycie pamięci

Określ, w jaki sposób kwantyzacja int8 i binarna wpływają na dokładność odzyskiwania informacji oraz zużycie pamięci dla embeddingów, dlaczego kwantyzacja binarna może prowadzić do strat danych oraz jak wybrać bezpieczny poziom kompresji.

940 słów

Zmniejszanie rozmiaru embeddingów brzmi jak darmowe pieniądze, a wiele przewodników na tym się kończy. Szybki test pokazuje, że kompresja „bezpieczna” i „nieostrożna” różnią się od siebie znacznie bardziej, niż przyznają te przewodniki.

Oto sedno sprawy. Kwantyzacja Int8 zazwyczaj zachowuje 95% lub więcej dokładności wyszukiwania, jednocześnie zmniejszając potrzebną przestrzeń przechowywania o 4 razy. Kwantyzacja binarna zapewnia imponujące zmniejszenie o 32 razy, ale jeśli model embeddingów nie został na nią przeszkolony, możesz stracić jedną trzecią lub więcej dokładności wyszukiwania. Te dwa podejścia nie stanowią punktów na jednej skali – zachowują się na tyle różnie, że wybór niewłaściwego rozwiązania dla danego modelu może potajemnie zaszkodzić jakości wyszukiwania.

Kwantyzacja polega na przechowywaniu każdej wymiarowości z mniejszą dokładnością. Można przejść od liczb zmiennoprzecinkowych 32-bitowych do liczb całkowitych 8-bitowych (kwantyzacja skalarna) lub aż do jednego bitu na wymiarowość (kwantyzacja binarna). Korzyści są rzeczywiste: zużycie pamięci RAM spada nawet 24 razy przy kwantyzacji binarnej i 3,75 raza przy skalarnej, a efekt ten wzrasta, gdy zbiór danych zawiera miliony wektorów, co staje się coraz bardziej powszechne w przypadku pamięci agentów i systemów RAG w przedsiębiorstwach w 2026 roku.

Jak wyglądają liczby

Zbiór danych do testów był syntetyczny: 2000 wektorów o 768 wymiarowościach, podzielonych na 20 grup w celu odtworzenia rzeczywistej struktury semantycznej. Dokładność wyszukiwania mierzona była jako recall@10 w porównaniu z bazą niekompresowanych liczb float32, po zastosowaniu każdego z dwóch kwantyzatorów. Najpierw int8, który skaluje wartości według największej wartości bezwzględnej i zaokrągla je do zakresu 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

A następnie kwantyzacja binarna, która przechowuje jedynie znak każdej wartości:

def quantize_binary(vecs):
    return (vecs > 0).astype(np.float32) * 2 - 1

Wyniki były następujące:

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 zachował 96% dokładności wyszukiwania przy skróceniu przestrzeni przechowywania o 4 razy, co jest doskonałym wynikiem dla większości systemów produkcyjnych. Binary, w tej uniwersalnej symulacji embeddingu nie zaprojektowanej z myślą o kwantyzacji, osiągnął tylko 32,6% dokładności przy swojej imponującej kompresji 32-krotnie większej. To nie jest błąd zaokrąglenia – zniknęło mniej więcej dwa na trzy istotne wyniki, które powinien był zwrócić indeks typu float.

Dlaczego binary sprawia takie problemy

Chodzi o to, ile informacji zostaje zachowanych. Int8 przechowuje dokładną wartość dla każdej wymiaru, co zapewnia wystarczającą rozdzielczość do zachowania większości wzajemnych relacji geometrycznych między wektorami. Binary zachowuje jedynie znak i całkowicie odrzuca wartość bezwzględną, co stanowi znacznie bardziej radykalną uproszczenie przestrzeni embeddingu.

To jednak nie jest prawo przyrody. Zależy to od modelu. Niezależne testy pokazały, że niektóre architektury embeddingów ledwo zauważają kwantyzację binarną i zachowują około 98% jakości na poziomie float, podczas gdy inne rodzaje stracą znacznie więcej i osiągną poziom około 87–92%, w zależności od rozmiaru modelu. Różnicę stanowi to, czy model został wytrenowany tak, aby wytrzymać kwantyzację.

Który wybrać

  • Ustaw int8 jako standard. Tracisz niewielką dokładność w sposób łatwy do przewidzenia, ale zaoszczędzony miejsce jest nadal wystarczająco duży, by mieć znaczenie w dużym indeksie.
  • Używaj formatu binarnego tylko z modelem do tego przeznaczonym. Dostawcy dostarczają obecnie wersje embeddingów uwzględniające kwantyzację, ponieważ zwykłe embeddingi bardzo się pogarszają podczas kompresji binarnej. Sprawdź, czy twój konkretny model został zweryfikowany pod kątem tej techniki przed wdrożeniem, i nie zakładaj, że ta metoda jest bezpieczna we wszystkich przypadkach.
  • Rozważ trzymanie się średniej drogi w postaci skracania wymiarów na wzór Matryoszek. Niektóre nowsze modele można przekształcić na mniej wymiarów (np. z 2 048 do 256) i przy tym zachować większość ich jakości wyszukiwania, co umożliwia dostosowanie kompromisu pomiędzy niewielką oszczędnością w formacie int8 a bardziej agresywnymi, lecz ryzykownymi oszczędnościami w formacie binarnym.
  • Najpierw zmierz stopę odzyskiwania wyników w swoim własnym korpusie. To, jak ściśle skupiają się twoje rzeczywiste embeddingi oraz ile niemal identycznych wyników są w stanie zaakceptować twoje zapytania, wpłynie na te wartości w dowolnym kierunku względem wyników uzyskanych przy użyciu jakichkolwiek ogólnych standardów oceny, w tym tego.
  • Częste pytania

    Ile dokładności kosztuje format int8? Zazwyczaj bardzo niewiele – zwykle mniej niż 5% straty w stopie odzyskiwania wyników w porównaniu z pełnym formatem float32 – w zamian za około 4 razy mniej pamięci przechowywania.

    Czy kwantyzacja binarna jest bezpieczna? Tylko w przypadku modeli embeddingowych przeszkolonych na tolerowanie jej. Modele ogólne mogą stracić jedną trzecią lub więcej dokładności wyszukiwania, podczas gdy modele uwzględniające kwantyzację mogą zachować 98% lub więcej jakości na poziomie float.

    Ile miejsca przechowywania oszczędzasz? Około 4 razy przy użyciu int8. Kwantyzacja binarna może przynieść oszczędności 24–32 razy większe, ale z znacznie wyższymi i trudniejszymi do przewidzenia kosztami dotyczącymi dokładności.

    Czy musisz ponownie zaimplementować wszystko? Niekoniecznie. Możesz skwantyzować istniejące embeddingi typu float32 później, tak jak to robi powyższy kod. Modele przeszkolone z myślą o kompresji zazwyczaj radzą sobie lepiej niż gotowe embeddingi skwantyzowane później.

    Ostatnia uwaga: korpus tutaj jest syntetyczny i ma strukturę klastrową, służy wyłącznie do ilustracji. Rzeczywista skuteczność zależy od modelu embeddingów, struktury danych oraz wzorców zapytań, dlatego przed wyborem poziomu kompresji przeprowadź testy na własnych danych.