โ† Semua pembelajaran / AI Engineer Nol โ†’ Production
Fase 4 ยท Koneksi AI, Database & LLM

Vector database & semantic search dengan pgvector

Membandingkan satu vektor query dengan sejuta vektor tersimpan satu-satu (brute force) menjadi lambat begitu datanya besar. Vector database menyelesaikan ini dengan index khusus, dan pgvector membawa kemampuan itu ke Postgres.

Sumber asli github.com Resmi Rangkuman ~8 menit baca

Intisari

  • Vector database menyimpan embedding dan menyediakan pencarian 'k tetangga terdekat' (nearest neighbor) secara efisien โ€” tanpa harus membandingkan ke semua baris satu per satu.
  • pgvector adalah extension Postgres: menambah tipe kolom vector dan operator jarak langsung di SQL โ€” kamu tidak perlu database terpisah kalau sudah pakai Postgres.
  • Untuk data kecil (ribuan baris), brute-force scan (bandingkan ke semua baris) sudah cukup cepat. Index khusus (HNSW/IVFFlat) baru terasa perlu di skala jutaan baris.
  • Index vektor bersifat approximate (perkiraan) โ€” trade-off kecepatan vs akurasi 100%, beda dari index B-tree biasa yang selalu tepat.
  • Kolom vektor bisa hidup di tabel yang sama dengan data terstrukturmu โ€” artinya kamu bisa gabungkan WHERE kategori = 'elektronik' dengan pencarian kemiripan dalam satu query SQL.

Kenapa butuh index khusus

Mencari "vektor mana yang paling mirip dengan vektor query ini" di antara sejuta baris, dengan membandingkan satu per satu (brute force), berarti sejuta perhitungan cosine similarity setiap kali ada pencarian. Untuk data kecil ini masih cepat; begitu datanya jutaan baris, ini jadi lambat. Vector database (atau extension vektor di database yang sudah ada) menyediakan index khusus yang mempercepat pencarian ini secara signifikan, dengan trade-off akurasi sedikit di bawah 100%.

pgvector: kemampuan vektor di Postgres yang sudah kamu pakai

Kalau aplikasimu sudah memakai Postgres โ€” kemungkinan besar iya โ€” pgvector menambahkan tipe data vector dan operator jarak langsung sebagai extension, tanpa perlu menjalankan database terpisah khusus untuk vektor.

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE dokumen (
    id BIGSERIAL PRIMARY KEY,
    judul TEXT NOT NULL,
    isi TEXT NOT NULL,
    kategori TEXT,
    embedding VECTOR(1536)   -- sesuaikan dengan dimensi model embedding-mu
);

-- pencarian brute-force: cocok untuk data kecil/menengah
SELECT judul, isi, 1 - (embedding <=> '[0.1, 0.2, ...]') AS kemiripan
FROM dokumen
ORDER BY embedding <=> '[0.1, 0.2, ...]'   -- <=> adalah operator jarak cosine
LIMIT 5;
import psycopg

def cari_dokumen_mirip(query: str, k: int = 5) -> list[dict]:
    vektor_query = embed(query)  # dari materi sebelumnya

    with psycopg.connect(DSN) as conn:
        rows = conn.execute(
            """SELECT judul, isi, 1 - (embedding <=> %s) AS kemiripan
               FROM dokumen ORDER BY embedding <=> %s LIMIT %s""",
            (vektor_query, vektor_query, k),
        ).fetchall()
    return rows

Index HNSW: cepat, tapi perkiraan

Untuk data besar, tambahkan index HNSW (Hierarchical Navigable Small World) โ€” struktur graf yang mempercepat pencarian tetangga terdekat secara drastis.

CREATE INDEX ON dokumen USING hnsw (embedding vector_cosine_ops);

Index vektor bersifat approximate, bukan eksak. Berbeda dari index B-tree Postgres biasa (yang selalu memberi hasil 100% tepat), index HNSW/IVFFlat memberi hasil "hampir pasti k tetangga paling dekat" dengan trade-off kecepatan โ€” dalam praktik akurasinya sangat tinggi (>95% umumnya), tapi ini bukan jaminan matematis mutlak seperti index biasa. Untuk sebagian besar aplikasi pencarian/RAG, trade-off ini sangat sepadan dengan lonjakan kecepatannya.

Kelebihan menyatukan data terstruktur & vektor

Karena kolom vektor bisa hidup di tabel Postgres biasa, kamu bisa menggabungkan filter data terstruktur dengan pencarian kemiripan dalam satu query โ€” sesuatu yang lebih rumit dilakukan kalau vektor disimpan di sistem terpisah dari data relasionalmu.

-- cari dokumen mirip, TAPI hanya dalam kategori tertentu
SELECT judul, isi FROM dokumen
WHERE kategori = 'kebijakan-hr'
ORDER BY embedding <=> %s
LIMIT 5;
PilihanKapan masuk akal
pgvector (di Postgres yang sudah ada)Sudah pakai Postgres, skala menengah, ingin gabung query relasional + vektor
Vector database khusus (Pinecone, Weaviate, dll.)Skala sangat besar, butuh fitur vektor lanjutan yang belum ada di pgvector

Latihan: buat tabel dokumen seperti contoh di atas di Postgres lokal (dengan extension pgvector terpasang), isi 10 baris dengan embedding dari kalimat yang berbeda topik, lalu jalankan query pencarian kemiripan dan bandingkan urutannya dengan perhitungan cosine similarity manual dari materi sebelumnya.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.