Ringkasan & Hubungan ke Vault
Mengukur kesamaan antar-vektor adalah operasi paling mendasar di dalam sistem pencarian semantik (RAG) dan LLM. Catatan ini menyediakan peta jalan belajar dari implementasi matematika dasar hingga pembuatan sistem pencarian kustom, menjadi pasangan praktis dari berkas teoritis cosine-similarity-deepdive.
Daftar Isi
- Kurikulum Belajar 4 Fase
- Fase 1: Fondasi Matematika Vektor & Perkalian Titik
- Fase 2: Menulis Fungsi Kesamaan Kustom di Python & NumPy
- Fase 3: Mengapa Sudut Lebih Penting daripada Magnitudo
- Fase 4: Membangun Sistem Pencarian Dokumen (Vector Search Engine)
- Kumpulan Soal Latihan & Solusi
- Koneksi ke Vault
1. Kurikulum Belajar 4 Fase
Peta jalan belajar ini menuntun Anda dari aljabar linier dasar hingga mesin pencari semantik:
[Fase 1: Aljabar Linier] ──> [Fase 2: Custom Similarity] ──> [Fase 3: Geometri Vektor] ──> [Fase 4: Vector Search]
- Vektor & Magnitudo - Pure Python Sim - Efek Normalisasi - KNN Search Engine
- Perkalian Dot Product - NumPy Vectorization - Cosine vs Euclidean - FAISS comparison
2. Fase 1: Fondasi Matematika Vektor & Perkalian Titik
Diberikan dua vektor dan berdimensi :
- Dot Product (Perkalian Titik):
- Magnitudo Vektor (L2 Norm):
- Cosine Similarity:
Nilai Cosine Similarity berkisar antara . Untuk representasi teks (embedding), nilainya biasanya berada di rentang karena bobot fitur bernilai non-negatif.
3. Fase 2: Menulis Fungsi Kesamaan Kustom di Python & NumPy
3.1 Implementasi Pure Python (Tanpa Pustaka Eksternal)
Berguna untuk memahami logika kalkulasi di balik abstraksi library:
import math
def dot_product(a, b):
return sum(x * y for x, y in zip(a, b))
def magnitude(a):
return math.sqrt(sum(x * x for x in a))
def custom_cosine_similarity(a, b):
mag_a = magnitude(a)
mag_b = magnitude(b)
if mag_a == 0 or mag_b == 0:
return 0.0
return dot_product(a, b) / (mag_a * mag_b)3.2 Implementasi NumPy (Vektorisasi SIMD)
NumPy mempercepat komputasi dengan memanggil instruksi paralel prosesor:
import numpy as np
def numpy_cosine_similarity(a, b):
# a, b: numpy arrays
dot = np.dot(a, b)
norm_a = np.linalg.norm(a)
norm_b = np.linalg.norm(b)
if norm_a == 0 or norm_b == 0:
return 0.0
return dot / (norm_a * norm_b)4. Fase 3: Mengapa Sudut Lebih Penting daripada Magnitudo
Pertimbangkan masalah Pencarian Teks:
- Dokumen 1: “keamanan siber” (panjang: 2 kata).
- Dokumen 2: “keamanan siber keamanan siber keamanan siber” (panjang: 6 kata).
Kedua dokumen memiliki fokus topik yang sama persis.
- Euclidean Distance: Akan menilai kedua dokumen sangat berjauhan (karena Dokumen 2 memiliki magnitudo frekuensi kata yang jauh lebih besar).
- Cosine Similarity: Menghasilkan nilai 1.0 (kesamaan sempurna) karena arah sudut vektornya sejajar, mengabaikan perbedaan panjang dokumen (invarian terhadap panjang teks).
5. Fase 4: Membangun Sistem Pencarian Dokumen (Vector Search Engine)
Berikut adalah implementasi sistem K-Nearest Neighbors (KNN) kustom untuk mencari dokumen berdasarkan nilai kesamaan kosinus terdekat.
import numpy as np
class VectorSearchEngine:
def __init__(self, dimension):
self.dimension = dimension
self.database = [] # Menyimpan data dokumen teks
self.vectors = None # Menyimpan matriks embedding (N x D)
def add_document(self, doc_text, vector):
assert len(vector) == self.dimension, "Dimensi vektor tidak cocok"
self.database.append(doc_text)
# Normalisasi vektor terlebih dahulu (L2 normalize)
normalized_vector = vector / np.linalg.norm(vector)
if self.vectors is None:
self.vectors = np.array([normalized_vector])
else:
self.vectors = np.vstack([self.vectors, normalized_vector])
def search(self, query_vector, k=3):
if self.vectors is None:
return []
# 1. Normalisasi kueri input
q_norm = query_vector / np.linalg.norm(query_vector)
# 2. Karena data di DB sudah ternormalisasi, Cosine Sim cukup dihitung dengan Dot Product perkalian matriks!
# Rumus: Scores (N x 1) = Vectors (N x D) * Q_norm (D x 1)
scores = np.dot(self.vectors, q_norm)
# 3. Urutkan dari nilai tertinggi ke terendah
top_indices = np.argsort(scores)[::-1][:k]
results = []
for idx in top_indices:
results.append({
"document": self.database[idx],
"score": float(scores[idx])
})
return results6. Kumpulan Soal Latihan & Solusi
Soal 1
Diberikan tiga vektor berikut:
- Kueri
- Dokumen
- Dokumen Hitunglah:
- Cosine similarity antara dengan dan .
- Euclidean distance antara dengan dan .
- Berdasarkan hasil di atas, dokumen mana yang lebih dekat dengan kueri jika menggunakan Cosine vs Euclidean?
Solusi
Kalkulasi Cosine Similarity:
- Hasil Cosine: Dokumen A lebih mirip dengan Q daripada Dokumen B.
Kalkulasi Euclidean Distance:
- Hasil Euclidean: Dokumen A lebih dekat dengan Q daripada Dokumen B.
7. Koneksi ke Vault
| Catatan | Hubungan |
|---|---|
| cosine-similarity-deepdive | Teori dasar, pembuktian matematis formula kosinus, dan analisis performa. |
| cosine-vs-euclidean-vs-dot | Perbandingan komprehensif metrik jarak untuk sistem RAG. |
| embedding-model-selection-finetuning | Pemilihan model penghasil vektor representasi (embedding) untuk pencarian semantik. |