Delete tugas week 10..py
This commit is contained in:
@@ -1,91 +0,0 @@
|
|||||||
import os
|
|
||||||
import chromadb
|
|
||||||
from chromadb.utils import embedding_functions
|
|
||||||
from pypdf import PdfReader
|
|
||||||
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
|
||||||
|
|
||||||
# 1. Persiapan Dokumen
|
|
||||||
pdf_path = "dokumen_akademik.pdf" # Ganti dengan nama file PDF yang disiapkan
|
|
||||||
print(f"Membaca file: {pdf_path}")
|
|
||||||
|
|
||||||
reader = PdfReader('Buku Pedoman Akademik.pdf')
|
|
||||||
raw_text = ""
|
|
||||||
for page in reader.pages:
|
|
||||||
# Menggabungkan seluruh teks dari PDF
|
|
||||||
raw_text += page.extract_text() + "\n"
|
|
||||||
|
|
||||||
# 2. Setup Embedding Function
|
|
||||||
# Menggunakan model multilingual lokal agar performa pencarian untuk Bahasa Indonesia lebih akurat
|
|
||||||
print("Menyiapkan model embedding (ini akan mengunduh model pada run pertama)...")
|
|
||||||
emb_fn = embedding_functions.SentenceTransformerEmbeddingFunction(
|
|
||||||
model_name="paraphrase-multilingual-MiniLM-L12-v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
# 3. Inisialisasi ChromaDB Client
|
|
||||||
# PersistentClient akan membuat folder 'chroma_db_data' untuk menyimpan vektor secara lokal
|
|
||||||
client = chromadb.PersistentClient(path="./chroma_db_data")
|
|
||||||
|
|
||||||
# Eksperimen 3 ukuran chunk sesuai instruksi modul
|
|
||||||
chunk_sizes = [500, 1000, 1500]
|
|
||||||
|
|
||||||
for size in chunk_sizes:
|
|
||||||
print(f"\n--- Memproses ukuran chunk: {size} karakter ---")
|
|
||||||
collection_name = f"rag_koleksi_chunk_{size}"
|
|
||||||
|
|
||||||
# Hapus collection jika sebelumnya sudah ada saat di-run ulang
|
|
||||||
try:
|
|
||||||
client.delete_collection(name=collection_name)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Buat collection baru di vector DB
|
|
||||||
collection = client.create_collection(
|
|
||||||
name=collection_name,
|
|
||||||
embedding_function=emb_fn
|
|
||||||
)
|
|
||||||
|
|
||||||
# 4. Setup Text Splitter
|
|
||||||
# Overlap disetel 10% dari ukuran chunk untuk mencegah konteks terpotong mendadak
|
|
||||||
text_splitter = RecursiveCharacterTextSplitter(
|
|
||||||
chunk_size=size,
|
|
||||||
chunk_overlap=int(size * 0.1),
|
|
||||||
length_function=len,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Potong teks menjadi list of chunks
|
|
||||||
chunks = text_splitter.split_text(raw_text)
|
|
||||||
print(f"Total chunk yang dihasilkan: {len(chunks)} chunks")
|
|
||||||
|
|
||||||
# 5. Persiapkan ID dan Metadata
|
|
||||||
ids = [f"id_chunk_{size}_{i}" for i in range(len(chunks))]
|
|
||||||
metadatas = [{"source": pdf_path, "chunk_size": size, "chunk_index": i} for i in range(len(chunks))]
|
|
||||||
|
|
||||||
# 6. Masukkan Vektor, Teks, dan Metadata ke Vector Database
|
|
||||||
collection.add(
|
|
||||||
documents=chunks,
|
|
||||||
metadatas=metadatas,
|
|
||||||
ids=ids
|
|
||||||
)
|
|
||||||
print(f"Data chunk {size} berhasil di-index ke ChromaDB!")
|
|
||||||
|
|
||||||
# ==========================================
|
|
||||||
# CONTOH PENCARIAN (QUERY)
|
|
||||||
# ==========================================
|
|
||||||
print("\n--- Menguji Pencarian (Query Retrieval) ---")
|
|
||||||
query_text = "Apa syarat untuk mengajukan cuti akademik?" # Sesuaikan dengan isi PDF yang di-load
|
|
||||||
|
|
||||||
# Kita uji pencarian di collection yang ukuran chunk-nya 1000
|
|
||||||
test_collection = client.get_collection(name="rag_koleksi_chunk_1000", embedding_function=emb_fn)
|
|
||||||
|
|
||||||
# Retrieve Top-K (K=2)
|
|
||||||
results = test_collection.query(
|
|
||||||
query_texts=[query_text],
|
|
||||||
n_results=2
|
|
||||||
)
|
|
||||||
|
|
||||||
print(f"Pertanyaan: '{query_text}'\n")
|
|
||||||
|
|
||||||
# Hasil dibungkus di dalam list of lists oleh chromadb, maka kita akses index [0]
|
|
||||||
for i, (doc, dist) in enumerate(zip(results['documents'][0], results['distances'][0])):
|
|
||||||
print(f"--- Top {i+1} (Jarak Vektor: {dist:.4f}) ---")
|
|
||||||
print(f"{doc}\n")
|
|
||||||
Reference in New Issue
Block a user