Embedding condensation adalah kondisi ketika vektor representasi dari model embedding menumpuk pada manifold berdimensi rendah atau memiliki kesamaan kosinus antar-vektor yang sangat tinggi (> 0.90) secara seragam. Kondisi ini sering muncul akibat bias arsitektur representasi (anisotropi) pada model transformer atau corpus data teks yang sangat homogen. Pada pgvector, konsentrasi titik data dalam ruang sempit merusak partisi ruang dan topologi graf indeks approximate nearest neighbor (ANN).

Dampak Kondensasi Vektor pada Indeks HNSW dan IVFFlat

Indeks ANN di pgvector dirancang dengan asumsi distribusi data memiliki variansi geometris yang cukup untuk membedakan ketetanggaan.

  • Degradasi IVFFlat: IVFFlat membagi ruang vektor ke dalam klaster menggunakan algoritma k-means. Ketika kondensasi terjadi, centroid k-means runtuh saling berdekatan. Sebagian besar vektor berakhir pada sejumlah kecil list (imbalanced buckets). Hasilnya, PostgreSQL terpaksa melakukan sequential scan berulang pada bucket yang padat, menyebabkan latensi melonjak drastis dan recall turun kecuali parameter ivfflat.probes dinaikkan mendekati jumlah total list.
  • Degradasi HNSW: HNSW menyusun graf multi-lapisan. Jika jarak antar-titik sangat rapat, variasi jarak euklidean atau kosinus menjadi sangat kecil. Algoritma penjelajahan graf (greedy traversal) mudah terjebak dalam local minima karena batas pemisah antar-node menjadi ambigu. Untuk mencapai target recall yang sama, indeks membutuhkan traversal node yang jauh lebih dalam.

Audit Distribusi Jarak Kosinus

Sebelum melakukan modifikasi indeks, validasi apakah corpus mengalami kondensasi melalui perhitungan sampling jarak kosinus antar-vektor.

-- Hitung statistik distribusi jarak kosinus acak (10.000 sampel pasangan)
WITH sample_a AS (
    SELECT id, embedding FROM documents ORDER BY random() LIMIT 100
),
sample_b AS (
    SELECT id, embedding FROM documents ORDER BY random() LIMIT 100
),
distances AS (
    SELECT 
        a.id AS id_a, 
        b.id AS id_b, 
        (a.embedding <=> b.embedding) AS cosine_distance
    FROM sample_a a
    CROSS JOIN sample_b b
    WHERE a.id <> b.id
)
SELECT 
    AVG(cosine_distance) AS avg_dist,
    STDDEV(cosine_distance) AS std_dist,
    MIN(cosine_distance) AS min_dist,
    MAX(cosine_distance) AS max_dist,
    percentile_cont(0.5) WITHIN GROUP (ORDER BY cosine_distance) AS median_dist
FROM distances;

Jika avg_dist bernilai < 0.15 (cosine similarity > 0.85) dan std_dist bernilai sangat rendah (< 0.05), dataset terindikasi mengalami kondensasi ekstrem.

Mitigasi di Sisi Pipeline Data: Regularisasi dan Dispersi

Cara paling efektif mengatasi kondensasi adalah memproses embedding sebelum diinjeksi ke PostgreSQL. Dua teknik standar meliputi Mean-Centering dan Z-score Normalization untuk mengembalikan isotropi ruang.

import numpy as np

def post_process_embeddings(embeddings: np.ndarray) -> np.ndarray:
    """
    embeddings: Matriks 2D (N, D).
    Mengurangi rata-rata corpus (mean-centering) lalu normalisasi unit-length (L2).
    """
    # Hitung rata-rata corpus per-dimensi
    corpus_mean = np.mean(embeddings, axis=0)
    
    # Geser vektor ke titik pusat
    centered = embeddings - corpus_mean
    
    # Normalisasi kembali ke unit length untuk mempertahankan kompatibilitas Cosine Distance
    norms = np.linalg.norm(centered, axis=1, keepdims=True)
    norms[norms == 0] = 1.0
    dispersed = centered / norms
    
    return dispersed
Peringatan: Vektor corpus_mean harus disimpan sebagai artefak inferensi. Setiap query vektor dari user input harus dikurangi dengan corpus_mean yang sama sebelum kueri dieksekusi di database.

Konfigurasi Parameter Indeks pgvector

Jika modifikasi data pada pipeline embedding tidak memungkinkan, mitigasi harus dilakukan melalui tuning struktur indeks dan runtime query pgvector.

1. Penyesuaian HNSW

Tingkatkan kapasitas keterhubungan node (m) dan cakupan eksplorasi saat membangun indeks (ef_construction). Hal ini meminimalkan node terisolasi pada wilayah yang padat.

-- Bangun indeks HNSW dengan konektivitas lebih padat
CREATE INDEX idx_documents_embedding_hnsw 
ON documents 
USING hnsw (embedding vector_cosine_ops)
WITH (m = 32, ef_construction = 128);

Pada tingkat runtime kueri, perbesar hnsw.ef_search dari default (40) guna memaksa algoritma mengeksplorasi graf lebih luas sebelum memutuskan kandidat terdekat:

SET hnsw.ef_search = 100;

SELECT id, content
FROM documents
ORDER BY embedding <=> '[0.012, 0.043, ...]'
LIMIT 10;

2. Penyesuaian IVFFlat

Pada IVFFlat, hindari jumlah list yang terlalu kecil agar ukuran tiap bucket tidak membludak. Pada data ter-kondensasi, probes harus disetel lebih tinggi.

-- Naikkan jumlah centroids
CREATE INDEX idx_documents_embedding_ivfflat 
ON documents 
USING ivfflat (embedding vector_cosine_ops) 
WITH (lists = 1000);

-- Naikkan probes saat pencarian untuk menjaga recall
SET ivfflat.probes = 50;

Trade-off dan Kesimpulan

Meningkatkan m dan ef_search pada HNSW akan memulihkan recall yang hilang akibat kondensasi, namun meningkatkan konsumsi memori shared buffers dan menaikkan response time kueri. Pendekatan perbaikan di level data (mean-centering dan normalisasi L2) menawarkan rasio trade-off terbaik tanpa menambah beban throughput query engine PostgreSQL.