Cari artikelCERITA AI UNTUK KAMU / INDONESIA

BAHASAN MENDALAM · Ekonomi digital di sekitar kamu

Mencari arsip dengan kata dan makna lewat pgvector

Pahami cara menyimpan potongan dokumen, membandingkan hasil pencarian, dan menjaga batas akses di arsip redaksi.

Sumber kami cek

Gambar konsep asli dari redaksi Nalarku; bukan tangkapan layar produk.

Mau langsung ke bagian mana?
  1. Angka dengan panjang sama belum tentu bisa dibandingkan
  2. Coba mekanismenya dengan data yang bisa dibaca
  3. Jadikan pencarian menyeluruh sebagai pembanding
  4. Penyaringan bisa mengurangi hasil yang ditemukan
  5. Gunakan pencarian kata untuk istilah yang harus persis
  6. Nilai indeks bersama mutu bukti yang ditemukan

Saat mencari arsip, kamu kadang membutuhkan nama produk yang cocok persis. Di lain waktu, kamu hanya ingat maksudnya dengan kata yang berbeda. Pencarian berdasarkan kata dan kemiripan makna bisa saling membantu, asalkan versi dokumen dan izin bacanya tetap jelas.

pgvector menambahkan penyimpanan serta pencarian angka yang mewakili makna, atau vektor, ke PostgreSQL. Kita akan membuat contoh arsip kecil dan membandingkan pencarian menyeluruh dengan pencarian perkiraan. Kode perintah database atau SQL di bawah ditujukan untuk database uji dengan tambahan perangkat lunak atau extension dan izin yang sesuai, bukan dijalankan ke database yang sedang melayani pengguna.

Angka dengan panjang sama belum tentu bisa dibandingkan

Proses mengubah isi menjadi deretan angka disebut embedding. Simpan nama model, versi, jumlah angka atau dimensi, dan cara menyiapkan teks sebelum diubah. Dua model bisa memberi vektor sama panjang tetapi memakai arti posisi angka yang berbeda.

Salah satu cara membandingkan vektor melihat kemiripan arahnya, yang disebut cosine. Mencampur embedding dari dua ruang makna yang berbeda membuat perbandingan itu tidak bermakna. Panjang vektor saja belum cukup sebagai patokan kecocokan.

Hubungkan setiap potongan dokumen, atau chunk, ke dokumen dan revisinya. Saat model embedding berubah, bangun ulang daftar pencarian atau indeks secara terencana, atau simpan ruang baru terpisah. Jangan menimpa sebagian vektor lalu menganggap seluruh indeks sudah seragam.

Tentukan juga cara menangani dokumen yang dihapus atau kehilangan izin. Menghapus teks utama belum cukup jika chunk, embedding, atau salinan hasil sementara atau cache masih bisa diakses. Identitas dokumen membantu menyebarkan perubahan ke semua salinannya.

Coba mekanismenya dengan data yang bisa dibaca

Contoh berikut memakai vektor tiga dimensi buatan. Angkanya tidak berasal dari model embedding dan tidak membuktikan mutu pencarian makna:

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE demo_chunks (
  id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  document_id text NOT NULL,
  visibility text NOT NULL,
  body text NOT NULL,
  embedding vector(3) NOT NULL,
  search_document tsvector GENERATED ALWAYS AS (
    to_tsvector('simple', body)
  ) STORED
);

INSERT INTO demo_chunks (document_id, visibility, body, embedding) VALUES
  ('D01:r1', 'public', 'Model contoh masih private preview', '[1,0,0]'),
  ('D02:r1', 'public', 'Panduan ringkasan dokumen', '[0.8,0.2,0]'),
  ('D03:r1', 'internal', 'Catatan tim internal', '[0,1,0]');

SELECT id, document_id, body,
       embedding <=> '[1,0,0]'::vector AS distance
FROM demo_chunks
WHERE visibility = 'public'
ORDER BY embedding <=> '[1,0,0]'::vector
LIMIT 5;

Operator <=> menyatakan jarak arah vektor, atau cosine distance, pada pgvector. Semakin kecil jaraknya, semakin mirip arah vektornya dalam ruang tersebut. Angka itu bukan peluang bahwa dokumen benar atau relevan.

Contoh ini menghindari vektor nol karena tidak punya arah cosine yang berguna. Kolom visibility juga hanya menyederhanakan contoh. Aplikasi dengan banyak pengguna tetap membutuhkan pemeriksaan identitas dan hak tiap dokumen; label publik atau internal belum cukup untuk semua kebutuhan organisasi.

Jadikan pencarian menyeluruh sebagai pembanding

Pencarian jarak yang tidak memakai indeks perkiraan dapat menjadi hasil pembanding menyeluruh, atau exact search, pada kumpulan uji. Pemilihan cara mencari dilakukan oleh perencana perintah database, atau planner. Indeks HNSW membantu mengurangi pekerjaan lewat pencarian perkiraan, dengan konsekuensi pada memori, waktu membangun, kecepatan, dan jumlah hasil pembanding yang berhasil ditemukan kembali atau recall.

Pencarian tetangga terdekat secara perkiraan biasa disebut approximate nearest neighbor, atau ANN. Berikut contoh pembuatan indeksnya, bersama indeks untuk pencarian teks:

CREATE INDEX demo_chunks_embedding_hnsw
  ON demo_chunks USING hnsw (embedding vector_cosine_ops);

CREATE INDEX demo_chunks_search_gin
  ON demo_chunks USING gin (search_document);

Pakai kelompok operator indeks, atau operator class, yang sesuai dengan ukuran jarak. Indeks cosine belum tentu dipakai sebagaimana diharapkan jika bentuk pengurutan perintahnya tidak cocok. Periksa rencana perintah atau query dan ukuran data; tabel tiga baris tidak cukup untuk menyimpulkan kenaikan kecepatan.

Jalankan uji pembanding atau benchmark pada salinan data uji. Jangan menyuntikkan beban tak terkendali ke database yang dipakai pengguna. Catat pengaturan indeks dan versi extension karena kemampuan serta pilihannya dapat berkembang.

Penyaringan bisa mengurangi hasil yang ditemukan

Dokumentasi pgvector menjelaskan bahwa penyaringan atau filter pada pencarian perkiraan bisa diterapkan setelah sebagian indeks dibaca. Akibatnya, hasil yang lolos filter bisa lebih sedikit daripada jumlah LIMIT yang diminta. Pada versi yang mendukungnya, pembacaan indeks lanjutan atau iterative index scans dapat mencari lebih jauh dengan batas tertentu.

Uji menurut kelompok izin dan topik. Indeks yang terlihat baik pada seluruh arsip bisa kehilangan banyak calon hasil ketika pengguna hanya boleh membaca sebagian kecil dokumen. Pengujian tanpa filter belum menggambarkan keadaan itu.

Jika hasil kurang, tetap pertahankan filter akses. Pertimbangkan susunan indeks, pembagian data atau partisi, penambahan calon hasil, atau exact search untuk bagian data yang kecil. Kebutuhan pencarian tidak menghapus batas izin.

Gunakan pencarian kata untuk istilah yang harus persis

Full Text Search PostgreSQL menyediakan pembacaan teks menjadi bagian yang bisa dicari, penyusunan kueri, pengurutan hasil, dan indeks. Cara ini disebut pencarian leksikal. Pengaturan simple pada contoh belum menjadi pengolah kata dasar atau stemmer bahasa Indonesia yang lengkap.

SELECT id, document_id,
       ts_rank_cd(search_document,
                  websearch_to_tsquery('simple', 'private preview')) AS rank
FROM demo_chunks
WHERE visibility = 'public'
  AND search_document @@ websearch_to_tsquery('simple', 'private preview')
ORDER BY rank DESC, id;

Di aplikasi, kirim nilai masukan terpisah dari perintah SQL lewat binding parameter. Jangan menyambung teks pencarian pengguna langsung ke SQL. Uji nama model, tanda baca, singkatan, dan campuran bahasa.

Hasil pencarian kata dan vektor bisa disatukan dengan penggabungan peringkat atau reciprocal rank fusion. Cara itu tidak mengharuskan kamu menyamakan skala skor mentah dari kedua pencarian.

Nilai indeks bersama mutu bukti yang ditemukan

Bandingkan calon hasil perkiraan dengan hasil exact pada kueri yang sama untuk menghitung recall. Tambahkan penilaian manusia tentang kecocokannya. Hasil dengan vektor terdekat pun belum tentu menjadi sumber terbaik bagi pertanyaan redaksi.

Ukur waktu tunggu atau latensi: p50 menunjukkan waktu di tengah, sedangkan p95 adalah batas yang masih mencakup hampir semua permintaan. Catat memori indeks, waktu pembaruan, dan hasil setelah filter. Sertakan dokumen baru, revisi lama, dan dokumen yang dihapus agar pengujian mencakup perubahan arsip.

Simpan versi kumpulan data dan pengaturannya agar pengujian berikutnya memakai pembanding yang jelas. Saat menyusun jawaban, bawa ID sumber sampai ke klaim akhir. Panduan RAG menjelaskan cara mengambil bahan lalu menyusun jawaban yang didukung bukti.

KAMU BISA CEK SUMBERNYA

Sumber dan catatan kami

  1. pgvector documentationpgvector maintainers
  2. PostgreSQL text searchPostgreSQL

Tulisan ini memakai panduan resmi dan usulan cara kerja dari Nalarku. Contoh dan data latihan diberi label. Keterangan produk bisa berubah setelah sumber kami periksa.

Baca cara kami memakai AI serta cara kami menulis. Keduanya menjelaskan proses di balik bacaan ini.

Ada teman yang perlu baca ini?Kenali Nalar Pekan →