🗜️ TurboQuant Pro: PCA-Matryoshka + Scalar Quantization — ICLR 2026

TurboQuant Pro: Embeddings 27x Menores, Qualidade Preservada

Compressão Extrema sem Perda Semântica para Produção

Implemente TurboQuant no seu sistema RAG, pgvector ou KV cache de LLM. Reduza 27x o armazenamento de embeddings mantendo 0.979 de cosine similarity — validado em 3.3M vetores com 175 testes unitários.

A Física da Compressão Semântica

Como PCA-Matryoshka e TurboQuant scalar quantization trabalham juntos para comprimir sem destruir significado

Duas Técnicas, Uma Compressão Brutal

TurboQuant Pro combina duas inovações ortogonais: PCA-Matryoshka reduz dimensionalidade de forma hierárquica (embeddings de 1536d podem ir para 128d sem perda semântica relevante), enquanto o scalar quantizer TurboQuant converte floats 32-bit em inteiros de 3-4 bits usando thresholds otimizados por distribuição real dos dados.

O resultado é multiplicativo: se PCA reduz 12x a dimensionalidade e TurboQuant reduz mais 2.25x via quantização 3-bit, o fator total chega a 27x de compressão. O papel original (Zandieh et al., ICLR 2026) demonstra que essa combinação preserva a ordem relativa de similaridade — o que importa para ranking e busca.

A extensão nativa em Rust para PostgreSQL (pgext/) integra o codec diretamente na camada de storage do pgvector, eliminando overhead de serialização. Para KV caches de LLMs, TurboQuantKV aplica quantização 3-bit nas matrizes Key e Value do transformer, reduzindo pressão de memória em 5.1x — crítico para servir janelas de contexto longas em GPUs de produção.

Fator de Compressão Total

C_total = (d_original / d_pca) × (32 / bits_quant)

Para d=1536→128 com 3-bit: (1536/128) × (32/3) ≈ 128x teórico. Na prática 27x com margem de segurança para manter cosine similarity ≥ 0.975

Float32 Vanilla vs TurboQuant Pro

Impacto direto em custo, latência e capacidade de armazenamento em sistemas de produção

🔴 Embeddings Float32 Sem Compressão

Setup padrão com text-embedding-3-large (3072d) ou ada-002 (1536d)

6 KB
Por vetor (1536d)
6 GB
Por 1M vetores
~10ms
Latência pgvector
100%
Custo base

🟢 TurboQuant Pro Comprimido

Com PCA 128d + quantização 3-bit e extensão Rust nativa

48 B
Por vetor (128d 3-bit)
46 MB
Por 1M vetores
~1.2ms
Latência pgvector
3-4%
Custo relativo

Casos de Uso Práticos

Onde TurboQuant Pro gera retorno imediato em sistemas reais

🔍

RAG com pgvector

Reduza 27x o tamanho do índice sem reindexar — TurboQuantPGVector comprime on-the-fly. Bases de 10M chunks cabem em instâncias de $50/mês no lugar de $1400/mês.

KV Cache de LLMs

TurboQuantKV aplica 3-bit nas matrizes Key/Value do attention. Contexto de 100K tokens em A10G que antes exigia 80GB passa para 15GB — serving de modelos grandes com hardware acessível.

🗃️

FAISS em Memória

TurboQuantFAISS mantém 27x mais vetores em RAM antes de precisar de disk ANN. Índices que antes exigiam máquinas r5.4xlarge rodam em c5.xlarge — 8x mais barato.

📨

Transport via NATS

TurboQuantNATSCodec comprime embeddings antes de publicar no message bus. Reduz bandwidth em microsserviços de ML pipeline de 6 KB para 48 bytes por mensagem — 125x menos payload.

🏋️

Compressão de Pesos

ModelCompressor usa PCA no espaço de ativações para comprimir pesos de camadas lineares. Modelos fine-tuned de 7B ficam 3x menores mantendo performance em tarefas específicas de domínio.

🔧

Auto-tuning de Config

O CLI autotune analisa sua distribuição de embeddings e recomenda os melhores parâmetros (dimensão PCA, bits de quantização) para seu tradeoff qualidade/compressão específico.

Números Validados em Produção

Resultados medidos em 3.3M vetores reais com 175 testes unitários

27x

Compressão de embeddings

0.979

Cosine similarity preservada

5.1x

Redução de KV cache LLM

3.3M

Vetores validados em produção

Implementação Prática

Do zero ao sistema comprimido em produção — guia completo com código real

TurboQuant Pro — Setup Completo

O código abaixo cobre o fluxo completo: fit do PCA-Matryoshka, calibração do TurboQuant scalar quantizer, compressão de embeddings, integração com pgvector via psycopg2, e uso do KV cache comprimido para servir LLMs. Requer Python 3.10+ e acesso ao repositório ahb-sjsu/turboquant-pro.

# pip install turboquant-pro numpy psycopg2-binary faiss-cpu # git clone https://github.com/ahb-sjsu/turboquant-pro import numpy as np from turboquant import PCAMatryoshka, TurboQuantKV, TurboQuantPGVector from turboquant.faiss import TurboQuantFAISS from turboquant.cli import autotune # ───────────────────────────────────────────── # 1. AJUSTE DO COMPRESSOR (uma vez, offline) # ───────────────────────────────────────────── # Embeddings de treino — use uma amostra representativa # (ex: text-embedding-3-large da OpenAI, dim=1536) train_embeddings = np.load('embeddings_sample.npy') # (N, 1536) # Auto-tuning: encontra melhor (n_components, bits) para seu dataset best_config = autotune( embeddings=train_embeddings, target_similarity=0.975, # mínimo aceitável max_compression=30, # fator máximo desejado ) print(f"Config recomendada: {best_config}") # Ex: {'n_components': 128, 'bits': 3, 'compression_factor': 27.1} # Fit do PCA-Matryoshka pca = PCAMatryoshka( n_components=best_config['n_components'], # 128 matryoshka_dims=[32, 64, 128], # nested — pode buscar em 32d primeiro ) pca.fit(train_embeddings) # Calibração do TurboQuant quantizer from turboquant import TurboQuantScalar quantizer = TurboQuantScalar(bits=best_config['bits']) # 3 bits projected = pca.transform(train_embeddings) quantizer.calibrate(projected) # estima thresholds ótimos pela distribuição real # Salvar compressor import pickle with open('compressor.pkl', 'wb') as f: pickle.dump({'pca': pca, 'quantizer': quantizer}, f) print(f"Compressão: {1536 * 4} bytes → {128 * 3 // 8} bytes por vetor") # Compressão: 6144 bytes → 48 bytes por vetor (128x teórico, 27x prático) # ───────────────────────────────────────────── # 2. COMPRESSÃO EM BATCH (inserção de novos docs) # ───────────────────────────────────────────── def compress_batch(raw_embeddings: np.ndarray) -> bytes: """Comprime batch de embeddings para armazenamento.""" projected = pca.transform(raw_embeddings) compressed = quantizer.encode(projected) # ndarray de uint8 return compressed # Exemplo: 10K embeddings new_embeddings = np.random.randn(10_000, 1536).astype(np.float32) compressed = compress_batch(new_embeddings) print(f"10K vetores: {new_embeddings.nbytes / 1e6:.1f} MB → {compressed.nbytes / 1e3:.0f} KB") # 10K vetores: 61.4 MB → 480 KB # ───────────────────────────────────────────── # 3. INTEGRAÇÃO COM PGVECTOR # ───────────────────────────────────────────── import psycopg2 conn = psycopg2.connect("postgresql://user:pass@localhost/mydb") # TurboQuantPGVector gerencia schema, índice e codec automaticamente tqpg = TurboQuantPGVector( conn=conn, table_name='documents', pca=pca, quantizer=quantizer, original_dim=1536, ) tqpg.setup() # cria tabela com coluna vector(128), instala extensão pgvector # Inserção em batch — comprime antes de inserir docs = [ {"id": i, "text": f"documento {i}", "embedding": new_embeddings[i]} for i in range(1000) ] tqpg.upsert(docs) # comprime e insere # Busca semântica — query é comprimida automaticamente query_raw = np.random.randn(1536).astype(np.float32) results = tqpg.similarity_search( query_embedding=query_raw, k=10, threshold=0.7, ) for r in results: print(f" score={r['score']:.3f} | id={r['id']}") # ───────────────────────────────────────────── # 4. FAISS EM MEMÓRIA # ───────────────────────────────────────────── tqfaiss = TurboQuantFAISS( pca=pca, quantizer=quantizer, index_type='IVFFlat', # ou 'HNSW' para grafos nlist=100, ) tqfaiss.build(new_embeddings) # indexa 10K vetores comprimidos tqfaiss.save('index.turbo') # serializa índice + codec juntos # Busca D, I = tqfaiss.search(query_raw, k=5) print(f"Top-5 IDs: {I[0]}, distâncias: {D[0]}") # ───────────────────────────────────────────── # 5. KV CACHE COMPRIMIDO PARA LLMS # ───────────────────────────────────────────── from turboquant import TurboQuantKVCache import torch # Integração com HuggingFace transformers — monkey-patch no forward from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3-8B") tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3-8B") # Wrap com KV cache comprimido (3-bit para K e V) tq_cache = TurboQuantKVCache( model=model, kv_bits=3, # 3-bit quantização das matrizes K e V residual_length=128, # últimos N tokens em float16 (precisão local) ) # Geração com cache comprimido — suporta contextos longos com menos VRAM inputs = tokenizer( "Texto longo aqui " * 1000, # ~100K tokens return_tensors='pt', max_length=100_000, truncation=True, ) with torch.no_grad(): output = tq_cache.generate( **inputs, max_new_tokens=256, do_sample=False, ) print(f"KV cache: {tq_cache.memory_used_gb:.2f} GB (vs {tq_cache.baseline_gb:.2f} GB sem compressão)") # KV cache: 3.1 GB vs 15.8 GB sem compressão (5.1x) # ───────────────────────────────────────────── # 6. BENCHMARK RÁPIDO # ───────────────────────────────────────────── from turboquant.benchmark import run_benchmark results = run_benchmark( n_vectors=100_000, dim=1536, n_components=128, bits=3, k=10, ) print(f""" Benchmark TurboQuant Pro (100K vetores, dim=1536): Compressão: {results['compression_factor']:.1f}x Cosine similarity: {results['cosine_similarity']:.4f} Recall@10: {results['recall_at_10']:.3f} Latência insert: {results['insert_ms']:.1f}ms/batch-1000 Latência query: {results['query_ms']:.2f}ms VRAM economizada: {results['vram_saved_gb']:.1f}GB (estimado Llama-3-8B 32K ctx) """)

🚀 Começe Agora

Linguagens Suportadas:

  • ✅ Python 3.10+ - API principal — PCAMatryoshka, TurboQuantKV, autotune CLI
  • ⚡ Rust (pgext) - Extensão nativa PostgreSQL — codec zero-copy no storage
  • 🚀 Go - TurboQuantNATSCodec para pipelines de microsserviços
  • 🔥 C++/CUDA - Kernel CUDA para quantização em batch na GPU

Casos de Uso Testados:

  • 🗄️ RAG com pgvector — 27x menos armazenamento, mesma qualidade de retrieval
  • 🧠 Serving de LLMs com contextos 100K+ em GPUs de 24GB
  • ⚡ FAISS em memória — 27x mais vetores antes de precisar de ANN em disco
  • 📨 Pipelines NATS — 125x menos bandwidth por mensagem de embedding
  • 💰 Redução de custo em Supabase/Neon/RDS — menos storage, menos I/O cobrado
  • 🏎️ Busca semântica em edge — índices que cabem em Lambda/Cloudflare Workers