first commit
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
import chromadb
|
||||
from chromadb.utils import embedding_functions
|
||||
|
||||
# Model embedding yang sama
|
||||
emb = embedding_functions.SentenceTransformerEmbeddingFunction(
|
||||
model_name="paraphrase-multilingual-MiniLM-L12-v2"
|
||||
)
|
||||
|
||||
client = chromadb.PersistentClient(path="./chroma_db")
|
||||
|
||||
# 15 pertanyaan dan kata kunci dari PDF
|
||||
UJI = [
|
||||
("Apa arti airworthiness?", "fit for safe flight"),
|
||||
("Apa kepanjangan MRO?", "Maintenance, Repair, and Overhaul"),
|
||||
("Apa tugas line maintenance?", "Routine maintenance tasks"),
|
||||
("Apa itu base maintenance?", "taken out of service"),
|
||||
("Apa tujuan NDT?", "without causing damage"),
|
||||
("Apa tujuan utama aircraft maintenance?", "safety and performance"),
|
||||
("Apa itu pendekatan RCM?", "Reliability-Centered Maintenance"),
|
||||
("Strategi apa yang menggunakan data real-time?", "Condition-Based Maintenance"),
|
||||
("Siapa yang melakukan perawatan pesawat pada masa awal penerbangan?", "Wright brothers"),
|
||||
("Kapan prosedur standar perawatan mulai dikembangkan maskapai?", "1920s"),
|
||||
("Apa layanan yang digunakan maskapai untuk merawat armada?", "MRO services"),
|
||||
("Apa tujuan perawatan pesawat militer?", "mission readiness"),
|
||||
("Teknologi apa yang digunakan untuk pelatihan perawatan?", "Augmented Reality"),
|
||||
("Kendaraan apa yang diteliti untuk inspeksi dan perbaikan?", "Unmanned Aerial Vehicles"),
|
||||
("Material apa yang digunakan Boeing 787 Dreamliner?", "composite materials")
|
||||
]
|
||||
|
||||
|
||||
# Mencari peringkat pertama yang mengandung kata kunci
|
||||
def cari_peringkat(koleksi, pertanyaan, kunci, k=5):
|
||||
|
||||
jumlah = min(k, koleksi.count())
|
||||
|
||||
if jumlah == 0:
|
||||
return None
|
||||
|
||||
hasil = koleksi.query(
|
||||
query_texts=[pertanyaan],
|
||||
n_results=jumlah
|
||||
)
|
||||
|
||||
# Mengambil daftar dokumen hasil pencarian
|
||||
docs = hasil["documents"][0]
|
||||
|
||||
# Membersihkan kata kunci dari spasi dan baris baru
|
||||
kunci_bersih = " ".join(kunci.lower().split())
|
||||
|
||||
for peringkat, doc in enumerate(docs, start=1):
|
||||
|
||||
doc_bersih = " ".join(doc.lower().split())
|
||||
|
||||
if kunci_bersih in doc_bersih:
|
||||
return peringkat
|
||||
|
||||
return None
|
||||
|
||||
|
||||
# Menghitung Hit@K
|
||||
def hit_at_k(koleksi, uji, k=3):
|
||||
|
||||
benar = 0
|
||||
|
||||
for pertanyaan, kunci in uji:
|
||||
|
||||
peringkat = cari_peringkat(
|
||||
koleksi, pertanyaan, kunci, k
|
||||
)
|
||||
|
||||
if peringkat is not None:
|
||||
benar += 1
|
||||
|
||||
return benar / len(uji)
|
||||
|
||||
|
||||
# Menghitung MRR@5
|
||||
def hitung_mrr(koleksi, uji):
|
||||
|
||||
total = 0
|
||||
|
||||
for pertanyaan, kunci in uji:
|
||||
|
||||
peringkat = cari_peringkat(
|
||||
koleksi, pertanyaan, kunci, 5
|
||||
)
|
||||
|
||||
if peringkat is not None:
|
||||
total += 1 / peringkat
|
||||
|
||||
return total / len(uji)
|
||||
|
||||
|
||||
# Membandingkan dua koleksi
|
||||
for nama in ("pedoman_500", "pedoman_1000"):
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print(f"EVALUASI KOLEKSI: {nama}")
|
||||
|
||||
koleksi = client.get_collection(
|
||||
name=nama,
|
||||
embedding_function=emb
|
||||
)
|
||||
|
||||
if koleksi.count() == 0:
|
||||
print("Koleksi kosong!")
|
||||
continue
|
||||
|
||||
print("Jumlah pertanyaan:", len(UJI))
|
||||
|
||||
for k in (1, 3, 5):
|
||||
|
||||
nilai = hit_at_k(koleksi, UJI, k)
|
||||
|
||||
print(f"Hit@{k} = {nilai:.2f}")
|
||||
|
||||
mrr = hitung_mrr(koleksi, UJI)
|
||||
|
||||
print(f"MRR@5 = {mrr:.2f}")
|
||||
|
||||
print("\nPERTANYAAN YANG GAGAL DITEMUKAN:")
|
||||
|
||||
for pertanyaan, kunci in UJI:
|
||||
|
||||
peringkat = cari_peringkat(
|
||||
koleksi, pertanyaan, kunci, 5
|
||||
)
|
||||
|
||||
if peringkat is None:
|
||||
print("-", pertanyaan)
|
||||
Reference in New Issue
Block a user