Embedding: Apa yang Sebenarnya Direpresentasikan

Kalau saya tanya ke developer yang baru mulai pakai fitur pencarian berbasis AI, "embedding itu apa sih sebenarnya", jawabannya biasanya "vektor angka yang mewakili teks". Betul, tapi jawaban itu belum menjelaskan kenapa mengubah kalimat jadi deretan angka bisa membuat pencarian jadi jauh lebih pintar dibanding LIKE '%kata%' di database. Ini topik yang menurut saya wajib dipahami intuisinya sebelum pakai vector database atau membangun RAG, karena kalau salah paham soal apa yang direpresentasikan, kita bisa salah memilih model, salah desain skema pencarian, atau kecewa waktu hasilnya "kok nggak nyambung".

Dari kata ke koordinat

Bayangkan setiap kata atau kalimat dipetakan jadi satu titik di ruang berdimensi tinggi, misalnya ilustrasi sederhana: 768 atau 1536 dimensi tergantung modelnya. Yang membuat pemetaan ini berguna bukan angkanya satu-satu, tapi posisi relatifnya. Model embedding dilatih supaya teks dengan makna mirip diletakkan berdekatan, dan teks dengan makna jauh berbeda diletakkan berjauhan. Ini yang disebut ruang semantik (semantic space).

Poin yang sering terlewat: embedding tidak menyimpan makna kata secara simbolik seperti kamus. Tidak ada satu dimensi yang artinya "ini soal kesehatan" dan dimensi lain "ini soal keuangan". Maknanya tersebar (distributed) di banyak dimensi sekaligus, hasil dari proses training di mana model belajar memprediksi konteks. Karena itu embedding sulit diinterpretasi manusia secara manual, tapi sangat berguna untuk dihitung mesin.

Kenapa jarak antar-vektor berarti kemiripan makna

Begitu teks jadi vektor, kita bisa menghitung kedekatan dua teks dengan operasi matematis biasa, paling umum cosine similarity: mengukur sudut antara dua vektor, bukan jaraknya secara mentah. Semakin kecil sudutnya, semakin mirip maknanya secara statistik menurut model tersebut.

Contoh ilustrasi (bukan hasil pengukuran nyata): kalimat "pasien mengeluh nyeri dada" dan "nyeri di area dada dialami pasien" akan punya cosine similarity yang tinggi walau susunan katanya berbeda, sementara "pasien mengeluh nyeri dada" dan "stok obat menipis di gudang" akan jauh lebih rendah kemiripannya. Inilah yang tidak bisa dilakukan pencarian berbasis kata kunci biasa, karena LIKE hanya cocok kalau string-nya sama persis atau mengandung substring yang sama, sedangkan embedding menangkap kemiripan makna walau kata-katanya berbeda total.

Praktis di kode, alurnya kira-kira begini:

// ilustrasi alur, bukan kode produksi
$vector = $embeddingModel->embed($teks);
// simpan $vector ke vector store / kolom vektor
// saat query, embed juga teks pencarian
$queryVector = $embeddingModel->embed($queryUser);
// cari N vektor tersimpan dengan cosine similarity tertinggi
$hasil = $vectorStore->search($queryVector, limit: 5);

Yang penting diingat: model embedding untuk menyimpan data dan model embedding untuk query harus sama (atau kompatibel), karena ruang vektor tiap model berbeda. Vektor dari model A dan model B tidak bisa dibandingkan langsung meski dimensinya kebetulan sama.

Bukan pengganti pemahaman, tapi alat pencocokan

Satu kesalahpahaman yang sering saya temui: mengira embedding "mengerti" teks seperti manusia. Sebenarnya embedding adalah hasil kompresi statistik pola bahasa dari data training model tersebut. Kalau domain teksnya sangat spesifik (misalnya istilah medis, kode internal, singkatan khas industri tertentu), model embedding umum bisa saja kurang tajam membedakan nuansa yang penting di domain itu, karena pola itu jarang muncul di data training-nya. Ini alasan kenapa retrieval berbasis embedding di RAG kadang perlu dibantu langkah tambahan, seperti reranking, filtering berdasarkan metadata, atau knowledge base yang lebih terstruktur, bukan cuma mengandalkan similarity search mentah-mentah.

Hal lain yang perlu diperhatikan: dimensi lebih tinggi tidak otomatis berarti lebih akurat, dan model embedding yang lebih besar tidak selalu lebih cocok untuk kasus tertentu. Yang lebih menentukan biasanya adalah seberapa dekat data training model dengan domain pemakaian, dan bagaimana teks dipotong (chunking) sebelum di-embed, karena embedding dari satu paragraf panjang bisa mengaburkan makna spesifik yang sebenarnya kita cari.

Takeaway

Embedding pada intinya mengubah kemiripan makna menjadi sesuatu yang bisa dihitung: jarak atau sudut antar-vektor di ruang berdimensi tinggi. Ini yang membuat pencarian semantik mungkin dilakukan tanpa harus kata-katanya identik. Tapi embedding bukan solusi ajaib, hasilnya sangat bergantung pada model yang dipakai, cara teks dipotong, dan kecocokan domain. Sebelum membangun fitur pencarian atau RAG berbasis embedding, saya selalu menyarankan pahami dulu perilaku model embedding-nya lewat contoh-contoh nyata dari domain kita sendiri, bukan cuma percaya begitu saja karena angka similarity-nya "terlihat tinggi".