埋め込み量子化(ウメコミリョウシカ)
埋め込み量子化とは、高次元の埋め込みベクトル(Embedding)を低精度の数値表現に変換し、メモリ使用量と検索コストを削減する技術である。float32からint8やbinaryへの変換が代表的で、RAGシステムやベクトルデータベースの運用コスト最適化に広く活用される。
埋め込み量子化(Embedding Quantization)とは、テキスト・画像・コードなどの意味表現を担う埋め込みベクトル(Embedding Vector)の各次元の値を、元のfloat32(32ビット浮動小数点)からより低精度の表現(int8、uint8、float16、binary など)に変換する技術である。ベクトルデータベースやRAG(Retrieval-Augmented Generation)システムで数百万〜数十億のベクトルを格納・検索する際、メモリ消費と検索レイテンシを大幅に削減できる。
概要と背景
LLMやVision Transformerの普及により、あらゆるデータを高次元ベクトルに変換(埋め込み)して類似検索する手法が標準化した。しかしベクトルの次元数は年々増加しており、OpenAI text-embedding-3-large は3,072次元、Cohere embed-v4は1,024次元のfloat32ベクトルを生成する。
100万ベクトル×3,072次元×4バイト(float32)= 約12GBのメモリが必要となり、1億ベクトル規模では1.2TBに達する。これはGPUメモリ(H100で80GB)はおろか、一般的なサーバーのDRAM容量も超える。量子化はこのメモリ問題を解決する中核技術である。
主な量子化方式:
| 方式 | ビット幅 | 圧縮率 | 精度劣化 | 代表的用途 |
|---|---|---|---|---|
| float32(原精度) | 32bit | 1x | なし | ベースライン |
| float16 | 16bit | 2x | ほぼなし | GPU推論最適化 |
| int8(スカラー量子化) | 8bit | 4x | 1-3% | 汎用近似検索 |
| uint8 | 8bit | 4x | 1-3% | Qdrant/Weaviate標準 |
| int4 | 4bit | 8x | 3-8% | 実験的 |
| binary(1bit) | 1bit | 32x | 5-15% | 高速事前フィルタ |
量子化の動作原理
量子化の基本操作は「連続値の離散化」である。float32の値域[-1.0, 1.0]をint8の値域[-128, 127]にマッピングする場合:
- レンジ計算: ベクトル全体(またはチャネルごと)のmin/maxを求める
- スケール算出: scale = (max - min) / 255(uint8の場合)
- ゼロポイント算出: zero_point = round(-min / scale)
- 量子化: q = round(x / scale) + zero_point
- 逆量子化(復元): x' = (q - zero_point) × scale
この「アフィン量子化」は最も基本的な方式で、スカラー量子化(Scalar Quantization)とも呼ばれる。より高度な方式として、Product Quantization(直積量子化)やResidual Quantization(残差量子化)がある。
主要ベクトルDBの量子化サポート
| ベクトルDB | スカラー量子化 | バイナリ量子化 | PQ(直積量子化) | 自動量子化 |
|---|---|---|---|---|
| Qdrant | ○(uint8) | ○ | ○ | ○(auto) |
| Weaviate | ○(BQ+SQ) | ○ | ○ | - |
| Pinecone | - | - | ○(内部) | ○(自動PQ) |
| Milvus | ○(int8) | ○ | ○(IVF_PQ) | - |
| pgvector | ○(halfvec) | ○(bit) | - | - |
| ChromaDB | - | - | - | - |
RAGシステムでの活用
RAG(Retrieval-Augmented Generation)パイプラインでは、量子化は以下の段階で適用される:
- インデックス構築時: float32ベクトルをint8/binaryに量子化してインデックスに格納。メモリ75-97%削減
- クエリ時: クエリベクトルも同じ方式で量子化し、量子化空間で近似最近傍検索(ANN)を実行
- リスコアリング: 候補上位N件を元のfloat32ベクトルで再スコアリングし精度回復(Rescoring / Oversampling)
リスコアリングにより、量子化による精度劣化を1%未満に抑えることが可能。Qdrantではrescore=trueパラメータで自動的にfloat32リスコアリングが適用される。
量子化と検索品質のトレードオフ
量子化の精度影響は、ベクトルの次元数と量子化方式に大きく依存する:
- 高次元(1024+次元): 量子化誤差が多次元に分散するため、int8で精度劣化1%未満
- 低次元(128-384次元): 各次元の情報密度が高く、int8でも3-5%劣化の可能性
- バイナリ量子化: 768次元以上で実用的(Recall@10で90%以上)、384次元以下では精度劣化が大きい
精度評価の標準メトリクス:
- Recall@k: 真の上位k件中、量子化後の上位k件に含まれる割合
- NDCG@k: 順位の正確性を加味した指標
- MRR: 最初の正解の順位の逆数平均
自作PCとの関連
ローカルRAGシステムを自作PCで運用する場合、量子化は特に重要:
- GPUメモリ制約: RTX 4090(24GB VRAM)で100万ベクトル×1024次元をfloat32で格納すると約4GB。int8なら1GB、binaryなら128MBに収まり、LLM推論用のVRAMを確保できる
- CPU検索: AVX-512対応CPU(Intel 12世代以降)ではint8 SIMD演算で検索速度が4倍向上
- NVMe活用: 量子化ベクトルをNVMe SSDに格納し、オンデマンドでメモリにロードする方式も実用的(Qdrant mmap モード)
よくある質問(FAQ)
Q1: 量子化するとどのくらいメモリが減る? A: float32→int8で75%削減(4x圧縮)、float32→binaryで97%削減(32x圧縮)。100万ベクトル×1024次元の場合、float32で約4GB、int8で約1GB、binaryで約128MBとなる。
Q2: 量子化後の検索精度はどの程度低下する? A: 1024次元以上のベクトルでint8量子化+リスコアリングを使えば、Recall@10の低下は1%未満。バイナリ量子化でも768次元以上ならOversampling付きで5%未満の劣化に抑えられる。
Q3: すべてのEmbeddingモデルで量子化は有効? A: ほとんどのモデルで有効だが、Matryoshka Representation Learning(MRL)対応モデルは量子化との相性が特に良い。MRLモデルは低次元でも情報を保持するよう訓練されているため、次元削減+量子化の組み合わせで最大の圧縮効果を得られる。
Q4: 量子化はいつ行うべき? A: ベクトル数が10万件を超えたら検討開始。100万件以上では必須。インデックス構築後でもQdrantやWeaviateは動的に量子化を適用できるため、まずfloat32で構築し、スケール時に量子化を追加する戦略が安全。
まとめ
- 埋め込み量子化はfloat32ベクトルを低精度表現に変換してメモリ・コスト削減
- int8(4x圧縮)とbinary(32x圧縮)が主要方式
- リスコアリング併用でRecall低下を1%未満に抑制可能
- 高次元(1024+)ベクトルほど量子化耐性が高い
- ローカルRAGでは限られたGPUメモリの有効活用に直結