Membangun Mesin Pencari Semantik dari Nol
Daftar Isi
Pendahuluan
Mesin pencari berbasis kata kunci tradisional mencocokkan dokumen berdasarkan kecocokan kata yang tepat atau samar. Pencarian semantik melangkah lebih jauh dengan memahami makna di balik query dan dokumen. Ketika pengguna mencari "cara memperbaiki pipa bocor," mesin pencari semantik juga dapat mengembalikan hasil tentang "perbaikan saluran air" atau "solusi kebocoran pipa" -- meskipun kata-kata persis tersebut tidak ada dalam query.
Tutorial ini memandu Anda membangun mesin pencari semantik lengkap dari nol. Anda akan mempelajari cara menghasilkan text embedding, membangun indeks vektor dengan FAISS dan Annoy, mengimplementasikan filtering dan reranking, menggabungkan pencarian semantik dan kata kunci menjadi sistem hybrid, mengekspos semuanya melalui REST API FastAPI, dan mengukur kualitas pencarian dengan metrik evaluasi standar.
Prasyarat
- Python 3.9 atau lebih tinggi
- Pemahaman dasar tentang konsep machine learning
- Keakraban dengan REST API
pip install sentence-transformers faiss-cpu annoy numpy fastapi uvicorn rank-bm25 scikit-learn pydantic
Memahami Pencarian Semantik
Pencarian semantik bekerja dalam tiga tahap:
Wawasan kuncinya adalah bahwa teks yang mirip secara semantik menghasilkan vektor yang mirip, memungkinkan pengambilan berbasis makna alih-alih pencocokan kata kunci.
Query Pengguna: "mobil listrik terjangkau"
|
v
[Model Embedding] -> Vektor Query [0.12, -0.45, 0.78, ...]
|
v
[Indeks Vektor] -> Pencarian Tetangga Terdekat
|
v
Hasil:
"EV ramah anggaran untuk 2025" (kemiripan: 0.92)
"Perbandingan kendaraan listrik murah" (kemiripan: 0.89)
"Panduan harga Tesla Model 3" (kemiripan: 0.84)
Text Embedding dengan Sentence-Transformers
Sentence-Transformers adalah pustaka Python yang menyediakan model terlatih untuk menghasilkan text embedding berkualitas tinggi.
Memuat dan Menggunakan Model Embedding
from sentencetransformers import SentenceTransformer
import numpy as np
Muat model terlatih
'all-MiniLM-L6-v2' adalah keseimbangan yang baik antara kecepatan dan kualitas
model = SentenceTransformer('all-MiniLM-L6-v2')
Hasilkan embedding untuk teks tunggal
teks = "Machine learning adalah bagian dari kecerdasan buatan."
embedding = model.encode(teks)
print(f"Bentuk embedding: {embedding.shape}") # (384,)
print(f"Tipe data embedding: {embedding.dtype}") # float32
Hasilkan embedding untuk beberapa teks (batch untuk efisiensi)
dokumen = [
"Python adalah bahasa pemrograman serbaguna.",
"Deep learning menggunakan jaringan saraf dengan banyak lapisan.",
"FastAPI adalah framework web modern untuk Python.",
"Pemrosesan bahasa alami berurusan dengan pemahaman teks.",
"Container Docker menyederhanakan deployment aplikasi.",
]
emb
dokumen = model.encode(dokumen, showprogressbar=True, batchsize=32)