Vektor embedding dihasilkan oleh model encoder, yaitu model yang telah dilatih sebelumnya (pretrained) pada teks dalam jumlah besar. Topik ini menjelaskan alur satu arah dari teks menjadi vektor, alasan menggunakan model jadi alih-alih melatih sendiri, serta wujud vektornya di sisi Python sebagai array NumPy, yakni larik angka dengan tipe data seragam. Contoh pemanggilan model tidak dijalankan karena bobot model tidak tersedia di sandbox, sedangkan sifat datanya diuji dengan NumPy sungguhan.
Model encoder sebagai sumber vektor#
Model embedding bekerja sebagai encoder yang membaca teks dan mengeluarkan satu vektor. Alurnya satu arah dan tidak dapat dibalik, yaitu teks masuk, dihitung menjadi tensor, kemudian dikonversi menjadi daftar float berpanjang tetap. Tensor adalah struktur angka multidimensi yang muncul selama perhitungan berlangsung, sedangkan daftar float adalah wujud akhir yang disimpan. Proses ini berjalan dua kali dalam satu siklus pencarian, yaitu saat dokumen baru diindeks dan saat query (pernyataan pencarian) dikirim, karena query juga harus berada pada ruang yang sama dengan dokumen.
Sumber vektor saat ini terbagi dua keluarga besar. Keluarga pertama berjalan secara lokal melalui library, yakni kumpulan kode yang dipasang lalu dipanggil. Contoh modelnya adalah all-MiniLM-L6-v2 dari sentence-transformers yang menghasilkan 384 dimensi dengan sekitar 22,7 juta parameter, atau bge-m3 yang menghasilkan 1024 dimensi dan mendukung teks multibahasa. Keluarga kedua diakses melalui API vendor, misalnya text-embedding-3-small dengan 1536 dimensi dan text-embedding-3-large dengan 3072 dimensi. Keduanya menerima teks dan mengembalikan vektor dengan kontrak yang sama, sehingga pilihannya lebih ditentukan oleh lingkungan pemasangan dan biaya daripada oleh bentuk keluarannya.
Geometri makna tersebut tidak dirancang secara manual, melainkan dibentuk saat pelatihan melalui pasangan teks, yaitu pasangan yang semestinya mirip ditarik mendekat dan pasangan yang berlawanan didorong menjauh. Karena bentuknya hasil pembelajaran, dua model yang berbeda menghasilkan geometri yang berbeda pula. Sebaliknya, teks yang berbeda dari satu model dapat menghasilkan vektor yang berdekatan apabila maknanya memang serupa.
Menggunakan model jadi#
Melatih model embedding sendiri menuntut tiga hal yang jarang dimiliki sebuah proyek. Pertama, data, karena model perlu melihat jutaan pasangan teks yang mirip maupun berlawanan agar geometri maknanya terbentuk. Kedua, biaya, karena pelatihan memerlukan GPU dalam jumlah besar dan durasi panjang. Ketiga, kompetensi, karena pelatihan beserta evaluasi model bahasa merupakan disiplin tersendiri. Model pretrained menyediakan ketiganya dalam bentuk siap guna, dan sebagian besar kebutuhan pencarian terjawab oleh model umum tanpa penyesuaian apa pun.
Model juga mengunci dua keputusan penting. Dimensi ditetapkan oleh arsitektur keluarannya, sedangkan metrik dasar ditetapkan oleh cara pelatihan, misalnya cosine atau dot product sebagai perkalian titik antar vektor. Keduanya tidak dapat dinegosiasikan dari luar, sehingga memilih model berarti memilih skema data pula.
Pelatihan sendiri tetap masuk akal pada kasus yang sangat khusus, misalnya bahasa bidang yang kosakatanya jauh dari bahasa umum atau data yang tidak boleh meninggalkan jaringan internal. Keputusan semacam itu jarang menjadi kebutuhan tahap awal, dan sebagian besar arsip, termasuk arsip catatan kelas pada contoh jalur ini, dilayani dengan baik oleh model umum. Kasus khusus baru dipertimbangkan setelah kebutuhan kualitasnya terukur dan model umum terbukti tidak memenuhinya.
Pemanggilan model lokal berlangsung dalam beberapa baris. Contoh berikut tidak dijalankan karena library dan bobot modelnya tidak tersedia di sandbox, tetapi bentuknya persis seperti penggunaan nyatanya.
# tidak-dijalankan
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
v = model.encode("rekap statistik nilai ujian kelas")
print(v.shape) # (384,)
print(v.dtype) # float32Pemanggilan melalui API vendor berlangsung serupa, yaitu teks dikirim sebagai permintaan dan vektor dikembalikan sebagai daftar angka dalam JSON. Yang membedakan hanya tempat komputasinya, bukan bentuk keluarannya.
Vektor di sisi Python hanyalah array#
Setelah keluar dari model, vektor tinggal sekadar kumpulan angka. Di sisi Python, vektor adalah array NumPy satu dimensi dengan jumlah elemen sama dengan dimensi model. Berkas berikut memeriksa bentuk, tipe data, dan ukuran memori sebuah vektor ilustrasi delapan elemen, lalu mengonversinya ke float32 melalui astype.
import numpy as np
# Vektor ilustrasi, bukan keluaran model embedding sungguhan.
# Bentuk dan tipe datanya sama dengan vektor yang dihasilkan model.
v = np.array(
[0.0132, -0.0271, 0.0443, -0.0068, 0.0391, 0.0107, -0.0226, 0.0318]
)
print("shape :", v.shape)
print("dtype :", v.dtype)
v32 = v.astype(np.float32)
print("dtype setelah astype(np.float32):", v32.dtype)
print("jumlah elemen :", v32.size)
print("ukuran memori :", v32.nbytes, "byte")shape : (8,)
dtype : float64
dtype setelah astype(np.float32): float32
jumlah elemen : 8
ukuran memori : 32 bytePerubahan tipe data ke float32 bukan perkara kosmetik. Penyimpan vektor seperti pgvector menyimpan float32, yaitu empat byte per elemen, sehingga vektor delapan elemen di atas menempati 32 byte. Vektor untuk teks yang sama tetap sama selama bobot model dan versinya tidak berubah, sehingga array sederhana ini dapat digunakan ulang antar operasi tanpa konversi tambahan. Seluruh operasi aritmetika NumPy, misalnya pengurangan vektor dan perkalian titik, berjalan langsung atas array ini tanpa struktur khusus.
Pemanggilan astype meniru persiapan yang dilakukan banyak klien penyimpanan, karena keluaran model biasanya dikonversi ke float32 sebelum dikirim. Tipe lain seperti float64 membutuhkan delapan byte per elemen tanpa manfaat bagi penyimpan vektor umum. Memeriksa shape dan dtype sebelum mengirim adalah pemeriksaan murah yang mencegah pengiriman dimensi yang salah ke penyimpanan vektor.
Ringkasan#
- Model encoder pretrained mengubah teks menjadi vektor melalui alur satu arah, yaitu teks, tensor, lalu daftar float berpanjang tetap.
- Model jadi dipilih karena melatih sendiri menuntut data, biaya, dan kompetensi, sedangkan dimensi serta metriknya sudah dikunci oleh model.
- Setelah dihasilkan, vektor hanyalah array NumPy dengan tipe float32, yaitu empat byte per elemen.
Referensi#
- Dokumentasi Qdrant — Qdrant — Dokumentasi resmi Qdrant yang memuat penggunaan model embedding beserta konsep penyimpanan dan pencarian vektornya.
- Dokumentasi Milvus — Milvus — Dokumentasi resmi Milvus yang menjelaskan schema collection dengan field vektor berdimensi tetap dan metrik COSINE, L2, serta IP.