-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path07_vector_search.py
More file actions
67 lines (54 loc) · 2.68 KB
/
Copy path07_vector_search.py
File metadata and controls
67 lines (54 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import os
import pandas as pd
import numpy as np
from sentence_transformers import SentenceTransformer
#Konfigurasi Path
PROCESSED_DIR = os.path.join(os.getcwd(),"data", "processed")
DB_FILE = os.path.join(PROCESSED_DIR, "knowledge_master.parquet")
os.environ['SENTENCE_TRANSFORMERS_HOME'] = os.path.join(os.getcwd(), "models", "sentence_transformers")
def cosine_similarity(query_vec,db_vectors):
"""
Menghitung kemiripan susdut antara 1 vektor pertanyaan dengan SEMUA vektor dokumen di database.
Perhitungan menggunakan NumPy matrix multiplication agar super cepat (C-backend).
"""
# Menghitung dot product (A.B)
dot_product = np.dot(db_vectors, query_vec)
#Menghitung panjang/norma dar masing-masing vektor (||A|| dan ||B||)
query_norm = np.linalg.norm(query_vec)
db_norms = np.linalg.norm(db_vectors, axis=1)
# Cosine similarity = Dot Product / (Norm A * Norm B)
similarities = dot_product / (db_norms * query_norm)
return similarities
def run_search_engine(user_query, top_k=2):
print(f"\n[*] User Bertanya: '{user_query}'")
#1.Memuat database vektor
if not os.path.exists(DB_FILE):
print("[-] Database Parquet tidak ditemukan! jalankan sesi 7 terlebih dahulu.")
return
df=pd.read_parquet(DB_FILE)
#Mengubah kolom embbedding (Yang berbentuk list) menjadi matriks NumPy (2D array)
db_vectors = np.stack(df['embedding'].values)
#2.Membuat model dan mengubah Pertanyaan (query) menjadi vektor
print("[*] Memuat model Embedding ke CPU...")
model = SentenceTransformer("all-MiniLM-L6-v2", device="cpu")
print("[*] Menerjemahkan pertanyaan ke ruang vektor...")
query_vector = model.encode(user_query)
# 3. Menghitung Cosine Similarity
print("[*] Mencari di database (Scanning...)")
similarities = cosine_similarity(query_vector, db_vectors)
# Menyimpan skor ke dalam tabel DataFrame
df['similarity_score'] = similarities
# 4. Mengurutkan hasil dari yang paling mirip (Skor tertinggi)
# top_k berarti kita hanya mengambil sejumlah K dokumen teratas
top_results = df.sort_values(by='similarity_score', ascending=False).head(top_k)
# 5. Menampilkan Hasil
print("\n=== HASIL PENCARIAN TERATAS ===")
for index, row in top_results.iterrows():
print(f"Skor Kemiripan: {row['similarity_score']:.4f}")
print(f"Sumber Dokumen: {row['source']} (ID: {row['chunk_id']})")
print(f"Isi Teks : {row['content']}")
print("-" * 40)
if __name__ == "__main__":
# Kamu bisa mengganti kalimat di bawah ini untuk bereksperimen
pertanyaan = "Gimana prosedur kalau saya mau kerja dari rumah?"
run_search_engine(user_query=pertanyaan, top_k=2)