# Import Library yang Diperlukan import gradio as gr import shutil import os import subprocess from llama_cpp import Llama from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings 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 memasang ulang llama-cpp-python dengan dukungan CUDA def install_llama_with_cuda(): try: # Baca file requirements.txt with open("requirements.txt", "r") as f: packages = f.read().splitlines() # Install setiap paket dengan CMAKE_ARGS untuk dukungan CUDA for package in packages: subprocess.run( env={"CMAKE_ARGS": "-DGGML_CUDA=on"}, check=True ) # Periksa apakah CUDA Toolkit tersedia if not shutil.which("nvcc"): print("CUDA Toolkit tidak ditemukan. Pastikan sudah diinstal.") return print("Memasang ulang llama-cpp-python dengan dukungan CUDA...") print("llama-cpp-python berhasil diinstal ulang dengan dukungan CUDA.") except subprocess.CalledProcessError as e: print(f"Error saat menginstal ulang llama-cpp-python: {e}") except Exception as e: print(f"Kesalahan umum: {e}") # Fungsi untuk mengunduh model Llama def initialize_llama_model(): # Unduh model jika belum ada di direktori kerja model_path = hf_hub_download( repo_id="TheBLoke/zephyr-7b-beta-GGUF", # Nama repo model filename="zephyr-7b-beta.Q4_K_M.gguf", # Nama file model cache_dir="./models" # Lokasi direktori untuk menyimpan model ) return model_path # Fungsi untuk mengatur konfigurasi Settings def initialize_settings(model_path): Settings.llm = Llama( model_path=model_path, n_gpu_layers=1, # Sesuaikan dengan kebutuhan perangkat Anda temperature=0.7, # Sesuaikan untuk respons yang lebih cepat top_p=0.9 # Mengurangi eksplorasi token ) # Fungsi untuk Menginisialisasi Index def initialize_index(): # Tentukan dokumen input untuk pembacaan data 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() parser = SentenceSplitter(chunk_size=150, chunk_overlap=10) nodes = parser.get_nodes_from_documents(documents) embedding = HuggingFaceEmbedding("BAAI/bge-base-en-v1.5") Settings.embed_model = embedding index = VectorStoreIndex(nodes) return index # Inisialisasi Mesin Chat def initialize_chat_engine(index): from llama_index.core.prompts import PromptTemplate from llama_index.core.chat_engine.condense_plus_context import CondensePlusContextChatEngine retriever = index.as_retriever(similarity_top_k=3) chat_engine = CondensePlusContextChatEngine.from_defaults( retriever=retriever, verbose=True, ) return chat_engine # Fungsi untuk menghasilkan respons chatbot def generate_response(message, history, chat_engine): chat_messages = [ ChatMessage( role="system", content="Anda adalah chatbot yang selalu menjawab pertanyaan secara singkat, ramah, dan jelas dalam bahasa Indonesia." ), ] response = chat_engine.stream_chat(message) text = "".join(response.response_gen) # Gabungkan semua token menjadi string history.append((message, text)) # Tambahkan ke riwayat return history def clear_history(chat_engine): chat_engine.clear() # Inisialisasi Komponen Gradio untuk UI def launch_gradio(chat_engine): with gr.Blocks() as demo: # Mengatur tombol untuk menghapus riwayat chat clear_btn = gr.Button("Clear") clear_btn.click(lambda: clear_history(chat_engine)) # Membuat antarmuka chat chat_interface = gr.ChatInterface( lambda message, history: generate_response(message, history, chat_engine) ) demo.launch() # Fungsi Utama untuk Menjalankan Aplikasi def main(): install_llama_with_cuda() # Unduh model dan inisialisasi pengaturan model_path = initialize_llama_model() initialize_settings(model_path) # Mengirimkan model_path ke fungsi initialize_settings # Inisialisasi index dan engine index = initialize_index() chat_engine = initialize_chat_engine(index) # Luncurkan antarmuka launch_gradio(chat_engine) if __name__ == "__main__": main()