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