Sentence Transformers: Embedding, Kemiripan Semantik, dan Reranker
Sentence Transformers (sering disebut SBERT) adalah pustaka Python untuk mengubah teks menjadi embedding vektor padat yang menangkap makna, bukan sekadar kata di permukaan. Dalam tutorial ini kita membangun sistem retrieval kecil di atas korpus contoh, mengukur kemiripan semantik, menambahkan reranker cross-encoder, lalu melatih model embedding kita sendiri dengan API pelatihan modern. Tujuannya adalah gambaran praktis menyeluruh tentang bagaimana pustaka ini cocok ke dalam pipeline pencarian atau RAG nyata.
Apa Itu Sentence Transformers
Pustaka sentence-transformers membungkus model transformer (BERT, RoBERTa, MPNet, dan banyak lainnya) dan menambahkan pooling sehingga satu kalimat atau paragraf utuh dipetakan ke satu vektor berukuran tetap. Dua teks dengan makna serupa menghasilkan vektor yang berdekatan, sehingga Anda dapat membandingkannya dengan cosine similarity alih-alih pencocokan kata kunci.
Pustaka ini dikelola bersama ekosistem Hugging Face, sehingga model dimuat dari Hub, dataset memakai format datasets, dan model hasil pelatihan dapat diunggah kembali ke Hub dengan satu pemanggilan. Ini adalah alat standar untuk membangun pencarian berbasis embedding, clustering, deduplikasi, dan tahap retrieval pada sistem RAG.
Bi-Encoder vs Cross-Encoder
Ada dua keluarga model dalam pustaka ini, dan memilih dengan tepat adalah keputusan desain yang paling penting.
Sebuah bi-encoder mengkodekan setiap teks secara independen menjadi sebuah vektor. Anda meng-embed seluruh korpus sekali, menyimpan vektornya, dan saat kueri datang Anda cukup meng-embed kuerinya saja lalu membandingkannya dengan vektor tersimpan. Ini cepat dan dapat menskala hingga jutaan dokumen karena perbandingannya hanya berupa dot product. Komprominya adalah akurasi: model tidak pernah melihat kueri dan dokumen secara bersamaan, sehingga dapat melewatkan interaksi halus.
Sebuah cross-encoder menerima pasangan teks sekaligus (kueri dan kandidat) dan menghasilkan satu skor relevansi. Karena model memperhatikan kedua teks secara bersamaan, akurasinya jauh lebih tinggi. Biayanya adalah Anda tidak dapat menghitung apa pun di awal: setiap pasangan kueri-dokumen harus dijalankan melalui model. Menilai satu kueri terhadap satu juta dokumen menjadi tidak praktis.
Pola standar menggabungkan keduanya. Bi-encoder mengambil beberapa lusin kandidat dengan cepat, lalu cross-encoder me-rerank hanya kandidat tersebut untuk presisi. Inilah pola retrieve-then-rerank yang kita bangun nanti.
Kueri --> [Bi-encoder] --> 50 kandidat teratas --> [Cross-encoder] --> 5 teratas hasil rerank
(cepat, perkiraan) (lambat, presisi)
Instalasi
Pasang pustaka dengan pip. Ia akan menarik PyTorch, transformers, dan datasets sebagai dependensi.
pip install -U sentence-transformers
Untuk pelatihan dan evaluasi Anda mungkin juga membutuhkan beberapa tambahan. Memasang accelerate memungkinkan pelatihan lebih cepat dan multi-GPU, dan datasets diperlukan oleh API pelatihan (biasanya sudah ikut terpasang).
pip install -U accelerate datasets
Verifikasi pemasangan dan periksa perangkat yang tersedia.
import torch
from sentencetransformers import SentenceTransformer
print("sentence-transformers siap")
print("CUDA tersedia:", torch.cuda.isavailable())
Memuat Model dan Mengkodekan Teks
Kelas inti adalah SentenceTransformer. Berikan nama model dari Hub dan ia akan mengunduh serta menyimpan bobotnya di cache. Model awal serbaguna yang baik adalah all-MiniLM-L6-v2: kecil, cepat, berdimensi 384, dan kuat untuk kemiripan semantik bahasa Inggris.
from sentencetransformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
sentences = [
"Bagaimana cara mengatur ulang kata sandi akun saya?",
"Langkah memulihkan login yang terlupa",
"Cuaca di Jakarta panas hari ini.",
]
embeddings = model.encode(sentences)
print(embeddings.shape) # (3, 384)