P-10 RAG Embedding dan Vector Database

This commit is contained in:
Raphael
2026-11-02 10:58:52 +07:00
parent 99fe6f0d76
commit d3870f7ccc
7 changed files with 66 additions and 19 deletions
Binary file not shown.
Binary file not shown.
+66 -19
View File
@@ -14,26 +14,47 @@ MODEL_EMBEDDING = "paraphrase-multilingual-MiniLM-L12-v2"
# ========================================== # ==========================================
# 15 PERTANYAAN PENGUJIAN # 15 PERTANYAAN PENGUJIAN
# GANTI PERTANYAAN DAN KATA KUNCI # Berdasarkan materi PDF yang digunakan
# SESUAI ISI PDF YANG KAMU GUNAKAN.
# ========================================== # ==========================================
UJI = [ UJI = [
("Pertanyaan 1 dari dokumen", "kata kunci jawaban 1"), ("Apa kepanjangan dari LLM?", "Large Language Model"),
("Pertanyaan 2 dari dokumen", "kata kunci jawaban 2"),
("Pertanyaan 3 dari dokumen", "kata kunci jawaban 3"), ("Bagaimana cara kerja Bag-of-Words?", "frekuensi kata"),
("Pertanyaan 4 dari dokumen", "kata kunci jawaban 4"),
("Pertanyaan 5 dari dokumen", "kata kunci jawaban 5"), ("Apa kelemahan Bag-of-Words?", "tidak memahami urutan panjang"),
("Pertanyaan 6 dari dokumen", "kata kunci jawaban 6"),
("Pertanyaan 7 dari dokumen", "kata kunci jawaban 7"), ("Apa fungsi Word Embedding?", "vektor"),
("Pertanyaan 8 dari dokumen", "kata kunci jawaban 8"),
("Pertanyaan 9 dari dokumen", "kata kunci jawaban 9"), ("Apa contoh metode Word Embedding?", "Word2vec"),
("Pertanyaan 10 dari dokumen", "kata kunci jawaban 10"),
("Pertanyaan 11 dari dokumen", "kata kunci jawaban 11"), ("Apa itu RNN dan LSTM?", "RNN / LSTM"),
("Pertanyaan 12 dari dokumen", "kata kunci jawaban 12"),
("Pertanyaan 13 dari dokumen", "kata kunci jawaban 13"), ("Apa mekanisme yang digunakan Transformer?", "self-attention"),
("Pertanyaan 14 dari dokumen", "kata kunci jawaban 14"),
("Pertanyaan 15 dari dokumen", "kata kunci jawaban 15"), ("Apa judul penelitian yang memperkenalkan Transformer?",
"Attention Is All You Need"),
("Apa contoh model pada era pre-training skala besar?",
"BERT, GPT-2, GPT-3"),
("Apa kemampuan GPT-3 yang ditunjukkan dalam materi?",
"few-shot"),
("Apa yang dimaksud dengan RAG?",
"kumpulan dokumen"),
("Kapan RAG tepat digunakan?",
"sering berubah"),
("Apa kelemahan memasukkan seluruh dokumen ke prompt?",
"context window"),
("Apa teknik yang digunakan untuk memberikan contoh kepada model?",
"Few-shot"),
("Apa materi utama pada P-10?",
"Embedding & Vector Database"),
] ]
@@ -42,6 +63,7 @@ UJI = [
# ========================================== # ==========================================
def hubungkan_database(ukuran): def hubungkan_database(ukuran):
client = chromadb.PersistentClient( client = chromadb.PersistentClient(
path=FOLDER_DATABASE path=FOLDER_DATABASE
) )
@@ -67,6 +89,7 @@ def hubungkan_database(ukuran):
# ========================================== # ==========================================
def evaluasi(koleksi, k): def evaluasi(koleksi, k):
benar = 0 benar = 0
total_reciprocal_rank = 0 total_reciprocal_rank = 0
@@ -88,16 +111,24 @@ def evaluasi(koleksi, k):
peringkat_benar = None peringkat_benar = None
for nomor, dokumen in enumerate(daftar_dokumen, start=1): for nomor, dokumen in enumerate(
daftar_dokumen,
start=1
):
if kata_kunci.lower() in dokumen.lower(): if kata_kunci.lower() in dokumen.lower():
peringkat_benar = nomor peringkat_benar = nomor
break break
if peringkat_benar is not None: if peringkat_benar is not None:
benar += 1 benar += 1
total_reciprocal_rank += 1 / peringkat_benar total_reciprocal_rank += 1 / peringkat_benar
hit = benar / len(UJI) hit = benar / len(UJI)
mrr = total_reciprocal_rank / len(UJI) mrr = total_reciprocal_rank / len(UJI)
return hit, mrr return hit, mrr
@@ -108,25 +139,33 @@ def evaluasi(koleksi, k):
# ========================================== # ==========================================
def jalankan_evaluasi(): def jalankan_evaluasi():
print("\n===== EVALUASI RETRIEVAL RAG =====") print("\n===== EVALUASI RETRIEVAL RAG =====")
print("Jumlah pertanyaan:", len(UJI)) print("Jumlah pertanyaan:", len(UJI))
print("\nHasil perbandingan ukuran chunk:") print("\nHasil perbandingan ukuran chunk:")
print("-----------------------------------------------") print("-----------------------------------------------")
print("Ukuran | Hit@1 | Hit@3 | Hit@5 | MRR") print("Ukuran | Hit@1 | Hit@3 | Hit@5 | MRR")
print("-----------------------------------------------") print("-----------------------------------------------")
for ukuran in [500, 1000, 1500]: for ukuran in [500, 1000, 1500]:
try: try:
koleksi = hubungkan_database(ukuran) koleksi = hubungkan_database(ukuran)
hasil_1, mrr_1 = evaluasi(koleksi, 1) hasil_1, mrr_1 = evaluasi(koleksi, 1)
hasil_3, mrr_3 = evaluasi(koleksi, 3) hasil_3, mrr_3 = evaluasi(koleksi, 3)
hasil_5, mrr_5 = evaluasi(koleksi, 5) hasil_5, mrr_5 = evaluasi(koleksi, 5)
# MRR dihitung menggunakan hasil top-5. # MRR ditampilkan berdasarkan hasil top-5.
print( print(
f"{ukuran:6} | " f"{ukuran:6} | "
f"{hasil_1:.2f} | " f"{hasil_1:.2f} | "
@@ -136,12 +175,20 @@ def jalankan_evaluasi():
) )
except Exception as error: except Exception as error:
print(f"Chunk {ukuran}: gagal dievaluasi.") print(f"Chunk {ukuran}: gagal dievaluasi.")
print("Keterangan:", error) print("Keterangan:", error)
print("-----------------------------------------------") print("-----------------------------------------------")
print("Evaluasi selesai.") print("Evaluasi selesai.")
# ==========================================
# MENJALANKAN PROGRAM
# ==========================================
if __name__ == "__main__": if __name__ == "__main__":
jalankan_evaluasi() jalankan_evaluasi()
Binary file not shown.