Embedding & Vector Search
Embedding mengubah teks menjadi vektor (array angka) yang menangkap makna. Teks yang mirip maknanya → vektor yang berdekatan. Ini memungkinkan semantic search.
Keyword vs Semantic Search
// Keyword search: "cara masak nasi goreng"
// Match: dokumen yang mengandung kata "nasi goreng"
// Miss: dokumen tentang "resep fried rice" (padahal sama)
// Semantic search: "cara masak nasi goreng"
// Match: semua dokumen tentang memasak nasi goreng
// Termasuk "fried rice recipe" karena maknanya dekat
Membuat Embedding
const response = await openai.embeddings.create({
model: "text-embedding-3-small",
input: "Cara membuat REST API di Express.js",
});
const vector = response.data[0].embedding;
// [0.023, -0.041, 0.078, ...] — array of 1536 numbers
Cosine Similarity
// Ukur kemiripan dua vektor (0 = tidak mirip, 1 = identik)
function cosineSimilarity(a, b) {
let dot = 0, normA = 0, normB = 0;
for (let i = 0; i < a.length; i++) {
dot += a[i] * b[i];
normA += a[i] ** 2;
normB += b[i] ** 2;
}
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
}
// sim("kucing", "cat") ≈ 0.85
// sim("kucing", "database") ≈ 0.15
Workflow
- Index time — Embed semua dokumen, simpan vektor di vector database
- Query time — Embed query, cari vektor terdekat (nearest neighbor search)
- Return — Dokumen yang paling mirip secara semantik