Membangun fondasi knowledge system: mengubah teks menjadi embedding, menghitung kesamaan semantik, dan memakai vector database untuk pencarian cepat. Kalian menyiapkan pipeline embeddings dengan ChromaDB yang siap dipakai untuk RAG di episode 7type: text

Di episode 5 kalian membuat model bisa "bertindak". Episode ini membangun kemampuan yang tak kalah penting: ingatan — cara memberikan model akses ke pengetahuan yang tidak ada di training-nya. Fondasinya adalah embedding dan vector database.
Mengapa episode ini penting? Karena LLM hanya tahu apa yang ada di data training. Untuk menjawab pertanyaan tentang dokumen perusahaan, produk, atau riwayat percakapan — model butuh retrieval. Dan retrieval modern dibangun di atas embedding: representasi teks sebagai vektor yang bisa dibandingkan secara matematis.
Embedding adalah representasi teks sebagai deretan angka (vektor) yang menangkap makna. Kalimat yang mirip secara semantik akan punya vektor yang berdekatan, meskipun kata-katanya berbeda.
from openai import OpenAI
client = OpenAI()
def embed(text: str) -> list[float]:
r = client.embeddings.create(model="text-embedding-3-small", input=text)
return r.data[0].embedding
vec = embed("Kucing itu sangat lucu")
print(len(vec))
print(vec[:5])Vektor yang dihasilkan biasanya berdimensi besar (1.536 untuk model OpenAI, 384-768 untuk model lokal). Nilai vektor tidak bisa dibaca manusia — yang penting adalah jaraknya terhadap vektor lain.
Cara membandingkan dua embedding: hitung cosine similarity (kemiripan sudut antara dua vektor). Nilai 1 berarti sangat mirip, 0 berarti tidak terkait.
import numpy as np
def cosine(a: list[float], b: list[float]) -> float:
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
kalimat = [
"Kucing itu sangat lucu",
"The cat is very cute",
"Hari ini hujan deras di Jakarta",
]
v = [embed(k) for k in kalimat]
print("mirip-en:", round(cosine(v[0], v[1]), 3))
print("beda:", round(cosine(v[0], v[2]), 3))Perhatikan dua fakta penting:
Inilah kekuatan retrieval semantik: pertanyaan "produk apa yang cocok untuk kulit sensitif?" akan menemukan dokumen "handuk bayi ramah kulit" meski tidak ada kata yang sama.
Menghitung similarity satu per satu tidak akan skala untuk jutaan dokumen. Vector database mengindeks vektor dan melakukan pencarian tetangga terdekat (approximate nearest neighbor) secara efisien. Untuk series ini kita pakai ChromaDB (berjalan di mesin lokal tanpa server), dengan catatan bahwa pola yang sama berlaku untuk pgvector dan Qdrant di produksi.
import chromadb
client = chromadb.Client()
col = client.create_collection(
"produk", metadata={"hnsw:space": "cosine"}
)
col.add(
ids=["1", "2", "3"],
documents=[
"Handuk bayi berbahan katun organik, lembut untuk kulit sensitif.",
"Susu formula tahap 1 untuk bayi 0-6 bulan.",
"Kursi gaming ergonomis dengan sandaran lumbar.",
],
metadatas=[{"kategori": "bayi"}, {"kategori": "bayi"}, {"kategori": "elektronik"}],
)Pipeline yang akan dipakai terus-menerus:
hasil = col.query(
query_texts=["butuh produk untuk kulit bayi yang sensitif"],
n_results=2,
include=["documents", "metadatas", "distances"],
)
for doc, meta, dist in zip(
hasil["documents"][0], hasil["metadatas"][0], hasil["distances"][0]
):
print(f"[{dist:.3f}] {meta['kategori']} - {doc}")Perhatikan bahwa query "kulit bayi sensitif" berhasil menemukan dokumen handuk bayi — meskipun kata "sensitif" tidak ada di dokumen. Itu karena embedding menangkap makna. Inilah yang akan menjadi jantung RAG di episode 7.
Tip
Untuk biaya rendah dan privasi, embedding bisa dijalankan lokal dengan model seperti sentence-transformers atau nomic-embed-text (via Ollama). Kualitasnya mendekati API untuk banyak kasus. Di episode 15 kita bandingkan opsi embedding untuk produksi.
Vector database mendukung filter metadata — kombinasi kesamaan semantik dengan kriteria eksplisit (kategori, tanggal, author):
col.query(
query_texts=["produk bayi"],
n_results=5,
where={"kategori": "bayi"},
)Filter ini penting untuk RAG skala produksi: membatasi ruang pencarian mengurangi biaya, menaikkan akurasi, dan menghindari kebocoran data antar tenant (episode 20).
Inti yang harus dibawa pulang:
Di episode 7 selanjutnya kita merakit semuanya menjadi sistem knowledge pertama: Retrieval-Augmented Generation (RAG) — chunking, retrieval, rerank, grounding jawaban, dan pipeline RAG lengkap yang menjawab dari dokumen. Sampai jumpa di episode 7!