# Import Library yang Diperlukan import gradio as gr import gdown import pandas as pd import os import threading import schedule import time from datetime import datetime from llama_cpp import Llama from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings, Document from llama_index.core.llms import ChatMessage from llama_index.llms.llama_cpp import LlamaCPP from llama_index.embeddings.huggingface import HuggingFaceEmbedding from huggingface_hub import hf_hub_download from llama_index.core.node_parser import SentenceSplitter # Fungsi untuk mengunduh model Llama def initialize_llama_model(): model_path = hf_hub_download( repo_id="TheBLoke/zephyr-7b-beta-GGUF", filename="zephyr-7b-beta.Q4_K_M.gguf", cache_dir="./models" ) return model_path # Fungsi untuk mengatur konfigurasi Settings def initialize_settings(model_path): Settings.llm = LlamaCPP( model_path=model_path, temperature=0.7, ) # Fungsi untuk mengunduh file CSV terbaru dari Google Drive def download_csv_from_drive(): csv_url = "https://drive.google.com/uc?id=1UIx369_8GlzPiKArMVg8v-IwC6hYTYA0" # Ganti dengan ID file Google Drive kamu output_csv = "data.csv" if os.path.exists(output_csv): os.remove(output_csv) # Hapus file lama print("🔄 Mengunduh file CSV terbaru...") gdown.download(csv_url, output_csv, quiet=False) return output_csv # Fungsi untuk update index (dijalankan 1x sehari) def update_index(): print(f"🔄 [{datetime.now()}] Mengupdate index dengan data terbaru...") csv_file = download_csv_from_drive() # Baca CSV dengan Pandas df = pd.read_csv(csv_file) # Konversi isi CSV menjadi dokumen teks documents = [Document(text=" | ".join(map(str, row.values))) for _, row in df.iterrows()] # Tambahkan file dokumen lain text_documents = SimpleDirectoryReader(input_files=[ "bahandokumen/K3.txt", "bahandokumen/bonus.txt", "bahandokumen/cuti.txt", "bahandokumen/disiplinkerja.txt", "bahandokumen/fasilitas&bantuan.txt", "bahandokumen/upahlembur.txt", "bahandokumen/waktukerja.txt" ]).load_data() documents.extend(text_documents) # Parsing dokumen menjadi nodes parser = SentenceSplitter(chunk_size=150, chunk_overlap=10) nodes = parser.get_nodes_from_documents(documents) # Gunakan model embedding embedding = HuggingFaceEmbedding("firqaaa/indo-sentence-bert-base") Settings.embed_model = embedding # Buat index vektor global index index = VectorStoreIndex(nodes) print("✅ Index berhasil diperbarui!") # Inisialisasi Mesin Chat def initialize_chat_engine(): return index.as_chat_engine(chat_mode="condense_plus_context", similarity_top_k=3) # Fungsi untuk menghasilkan respons chatbot def generate_response(message, history): chat_engine = initialize_chat_engine() # Gunakan index yang sudah diperbarui response = chat_engine.stream_chat(message) text = "".join(response.response_gen) history.append((message, text)) return history # Scheduler untuk update otomatis setiap jam 12 malam def schedule_update(): schedule.every().day.at("00:00").do(update_index) while True: schedule.run_pending() time.sleep(60) # Cek setiap 1 menit # Fungsi untuk menjalankan scheduler di thread terpisah def start_scheduler(): thread = threading.Thread(target=schedule_update, daemon=True) thread.start() # Inisialisasi Komponen Gradio untuk UI def launch_gradio(): with gr.Blocks() as demo: clear_btn = gr.Button("Clear") chat_interface = gr.ChatInterface(lambda message, history: generate_response(message, history)) demo.launch() # Fungsi Utama untuk Menjalankan Aplikasi def main(): global index # Agar index bisa diperbarui secara global model_path = initialize_llama_model() initialize_settings(model_path) print("🔄 Inisialisasi index pertama kali...") update_index() # Buat index pertama kali print("⏳ Menjalankan scheduler update index (setiap jam 12 malam)...") start_scheduler() # Jalankan update otomatis di background launch_gradio() # Jalankan chatbot if __name__ == "__main__": main()