File size: 5,605 Bytes
43a4ef4
b02a1ec
 
 
 
a21a6cc
 
7fb3d43
 
 
a21a6cc
b02a1ec
 
 
 
 
 
 
 
bb546ea
a1864a8
 
 
 
 
 
43a4ef4
 
 
 
 
 
 
4697e29
 
 
 
43a4ef4
 
4697e29
b02a1ec
 
4697e29
43a4ef4
39b77d1
 
 
4697e29
 
 
 
b02a1ec
4697e29
b02a1ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4697e29
b02a1ec
 
 
 
 
 
 
 
 
 
 
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# Import Library yang Diperlukan
import gradio as gr
import shutil
import os
import subprocess
import sys
import platform
import transformers
import numpy
import torch

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

print(LlamaCPP.__version__)
try:
    # Periksa versi pip
    subprocess.run(["pip", "--version"], check=True)
except FileNotFoundError:
    print("pip tidak ditemukan di sistem.")

# Fungsi untuk memeriksa dan memastikan CUDA tersedia
def check_cuda_availability():
    if torch.cuda.is_available():
        print("CUDA Toolkit tersedia di sistem.")
        return True
    else:
        print("CUDA Toolkit tidak ditemukan di sistem.")
        return False

def install_llama_with_cuda():
    try:
        # Periksa ketersediaan CUDA Toolkit
        if not check_cuda_availability():
            print("Proses instalasi dihentikan karena CUDA Toolkit tidak tersedia.")
            return

        print("Memasang ulang llama-cpp-python dengan dukungan CUDA...")
        # Perintah pemasangan ulang llama-cpp-python dengan dukungan CUDA
        pip_path = "/home/user/.pyenv/versions/3.10.16/bin/pip"
        print("Memasang ulang llama-cpp-python dengan dukungan CUDA...")
        subprocess.run([pip_path, "install", "llama-cpp-python", "--force-reinstall", "--no-cache-dir"],
            env={"CMAKE_ARGS": "-DGGML_CUDA=on"},  # Aktifkan dukungan CUDA
            check=True
        )
        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()