File size: 2,959 Bytes
2047172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
68
69
70
71
72
73
74
75
76
77
78
79
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from dotenv import load_dotenv

# Memuat variabel lingkungan dari file .env
load_dotenv()

# --- KONFIGURASI ---
SOURCE_DIRECTORY = "source_data"
PERSIST_DIRECTORY = "data"
# ✅ MODEL SUDAH DIGANTI KE VERSI YANG LEBIH RINGAN
EMBEDDING_MODEL = "all-MiniLM-L6-v2"
CHUNK_SIZE = 1000
CHUNK_OVERLAP = 100

def create_vector_store():
    """
    Fungsi untuk memuat PDF, membaginya menjadi potongan,
    dan membuat database vektor Chroma yang persisten.
    """
    # 1. Memuat semua dokumen PDF dari direktori sumber
    pdf_files = [f for f in os.listdir(SOURCE_DIRECTORY) if f.endswith('.pdf')]
    if not pdf_files:
        print(f"Tidak ada file PDF yang ditemukan di folder '{SOURCE_DIRECTORY}'.")
        return

    all_docs = []
    print("Memulai proses memuat dokumen PDF...")
    for pdf_file in pdf_files:
        try:
            file_path = os.path.join(SOURCE_DIRECTORY, pdf_file)
            loader = PyPDFLoader(file_path)
            data = loader.load()
            all_docs.extend(data)
            print(f"-> Berhasil memuat {len(data)} halaman dari '{pdf_file}'")
        except Exception as e:
            print(f"-> GAGAL memuat PDF '{pdf_file}': {e}")

    if not all_docs:
        print("Tidak ada data yang berhasil dimuat dari PDF. Proses dihentikan.")
        return

    # 2. Membagi dokumen menjadi potongan-potongan kecil (chunks)
    print("\nMembagi dokumen menjadi potongan teks...")
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=CHUNK_SIZE,
        chunk_overlap=CHUNK_OVERLAP
    )
    docs_split = text_splitter.split_documents(all_docs)
    print(f"Total potongan dokumen yang dibuat: {len(docs_split)}")

    # 3. Menginisialisasi model embedding
    print(f"\nMenginisialisasi model embedding: {EMBEDDING_MODEL}...")
    try:
        embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)
    except Exception as e:
        print(f"GALAT: Gagal menginisialisasi model embedding: {e}")
        print("Pastikan Anda memiliki koneksi internet dan library 'sentence-transformers' terinstal.")
        return

    # 4. Membuat dan menyimpan database vektor Chroma
    print(f"\nMembuat dan menyimpan vector store di direktori '{PERSIST_DIRECTORY}'...")
    try:
        vectorstore = Chroma.from_documents(
            documents=docs_split,
            embedding=embeddings,
            persist_directory=PERSIST_DIRECTORY
        )
        print("\n--- PROSES SELESAI ---")
        print("Database vektor berhasil dibuat dan disimpan.")
        print("Anda sekarang dapat menjalankan 'app.py' untuk memulai chatbot.")
    except Exception as e:
        print(f"GALAT: Gagal membuat vector store Chroma: {e}")

if __name__ == '__main__':
    create_vector_store()