BramLeo commited on
Commit
38484a9
·
verified ·
1 Parent(s): d86a965

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +103 -96
app.py CHANGED
@@ -1,4 +1,7 @@
1
  import gradio as gr
 
 
 
2
  from llama_index.core.llms import ChatMessage
3
  from llama_index.core.chat_engine.condense_plus_context import CondensePlusContextChatEngine
4
  from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
@@ -7,120 +10,124 @@ from llama_index.embeddings.huggingface import HuggingFaceEmbedding
7
  from llama_index.core import Settings
8
  from llama_cpp import Llama
9
 
10
- # Load Llama model
11
- llm = Llama(
12
- model_path=model_path = hf_hub_download(
13
- repo_id="TheBLoke/zephyr-7b-beta-GGUF", # Nama repo model
14
- filename="zephyr-7b-beta.Q4_K_M.gguf", # Nama file model
15
- cache_dir="./models" # Lokasi direktori untuk menyimpan model
16
- )
17
- return model_path, # Sesuaikan path model
18
- n_gpu_layers=1, # Aktifkan GPU jika tersedia
19
- )
20
- model_path = hf_hub_download(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  repo_id="TheBLoke/zephyr-7b-beta-GGUF", # Nama repo model
22
  filename="zephyr-7b-beta.Q4_K_M.gguf", # Nama file model
23
  cache_dir="./models" # Lokasi direktori untuk menyimpan model
24
  )
25
  return model_path
26
- # Konfigurasi untuk indexing dokumen
27
- documents = SimpleDirectoryReader(input_files=[ "bahandokumen/bonus.txt",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  "bahandokumen/cuti.txt",
29
  "bahandokumen/disiplinkerja.txt",
30
  "bahandokumen/fasilitas&bantuan.txt",
31
- "bahandokumen/fasilitaskerja.txt",
32
- "bahandokumen/hak.txt",
33
- "bahandokumen/hubunganpengusaha&serikat.txt",
34
- "bahandokumen/istilah.txt",
35
- "bahandokumen/jaminanserikat.txt",
36
- "bahandokumen/jamkes.txt",
37
- "bahandokumen/jamsos.txt",
38
- "bahandokumen/keluhkesah.txt",
39
- "bahandokumen/kenaikanupah.txt",
40
- "bahandokumen/kewajiban.txt",
41
- "bahandokumen/kompensasi.txt",
42
- "bahandokumen/larangan.txt",
43
- "bahandokumen/lembur.txt",
44
- "bahandokumen/luaskesepakatan.txt",
45
- "bahandokumen/mogok.txt",
46
- "bahandokumen/pelanggaran&sanksi.txt",
47
- "bahandokumen/pendidikan.txt",
48
- "bahandokumen/pengangkatan.txt",
49
- "bahandokumen/penilaian&promosi.txt",
50
- "bahandokumen/pensiun.txt",
51
- "bahandokumen/perjadin.txt",
52
- "bahandokumen/pesangon.txt",
53
- "bahandokumen/phk.txt",
54
- "bahandokumen/pihak.txt",
55
- "bahandokumen/pkb.txt",
56
- "bahandokumen/resign.txt",
57
- "bahandokumen/sanksi.txt",
58
- "bahandokumen/shift.txt",
59
- "bahandokumen/syaratkerja.txt",
60
- "bahandokumen/tatacara.txt",
61
- "bahandokumen/tka.txt",
62
- "bahandokumen/tunjangan.txt",
63
- "bahandokumen/uangpisah.txt",
64
- "bahandokumen/upah.txt",
65
  "bahandokumen/upahlembur.txt",
66
  "bahandokumen/waktukerja.txt"]).load_data()
67
 
68
- # Split dokumen menjadi node
69
- parser = SentenceSplitter(chunk_size=300, chunk_overlap=20)
70
- nodes = parser.get_nodes_from_documents(documents)
71
-
72
- # Set embeddings dan index
73
- embedding = HuggingFaceEmbedding("BAAI/bge-base-en-v1.5")
74
- Settings.llm = llm
75
- Settings.embed_model = embedding
76
 
77
- index = VectorStoreIndex(nodes)
78
-
79
- # Retrieve data berdasarkan query
80
- retriever = index.as_retriever(similarity_top_k=3)
81
- query_engine = index.as_query_engine(similarity_top_k=3)
82
-
83
- # Setup chat engine
84
- chat_engine = CondensePlusContextChatEngine.from_defaults(
85
- retriever=retriever,
86
- verbose=True,
87
- )
88
 
89
- # Fungsi untuk merespons chat
90
- def generate_response(message, history):
91
  chat_messages = [
92
  ChatMessage(
93
  role="system",
94
- content="Anda adalah chatbot yang selalu menjawab pertanyaan dalam bahasa Indonesia dengan singkat dan ramah."
95
- )
96
  ]
 
 
 
 
97
 
98
- for human, ai in history:
99
- chat_messages.append(ChatMessage(role="user", content=human))
100
- chat_messages.append(ChatMessage(role="assistant", content=ai))
101
-
102
- chat_messages.append(ChatMessage(role="user", content=message))
103
-
104
- response = chat_engine.stream_chat(chat_messages)
105
- text = ""
106
- for token in response.response_gen:
107
- text += token
108
- yield text
109
-
110
- # Fungsi untuk mereset riwayat chat
111
- def clear_history():
112
- chat_engine.reset()
113
-
114
- # Gradio UI
115
- with gr.Blocks() as demo:
116
- with gr.Row():
117
  clear_btn = gr.Button("Clear")
118
- clear_btn.click(clear_history)
119
 
120
- chat_interface = gr.ChatInterface(
121
- fn=generate_response,
122
- clear_btn=clear_btn,
123
- chatbot_style="default"
124
- )
125
 
126
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ import shutil
3
+ import os
4
+ import subprocess
5
  from llama_index.core.llms import ChatMessage
6
  from llama_index.core.chat_engine.condense_plus_context import CondensePlusContextChatEngine
7
  from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
 
10
  from llama_index.core import Settings
11
  from llama_cpp import Llama
12
 
13
+ # Fungsi untuk memasang ulang llama-cpp-python dengan dukungan CUDA
14
+ def install_llama_with_cuda():
15
+ try:
16
+ # Baca file requirements.txt
17
+ with open("requirements.txt", "r") as f:
18
+ packages = f.read().splitlines()
19
+
20
+ # Install setiap paket dengan CMAKE_ARGS untuk dukungan CUDA
21
+ for package in packages:
22
+ subprocess.run(
23
+ [
24
+ package, "--force-reinstall", "--no-cache-dir"
25
+ ],
26
+ env={"CMAKE_ARGS": "-DGGML_CUDA=on"},
27
+ check=True
28
+ )
29
+ # Periksa apakah CUDA Toolkit tersedia
30
+ if not shutil.which("nvcc"):
31
+ print("CUDA Toolkit tidak ditemukan. Pastikan sudah diinstal.")
32
+ return
33
+
34
+ print("Memasang ulang llama-cpp-python dengan dukungan CUDA...")
35
+
36
+ print("llama-cpp-python berhasil diinstal ulang dengan dukungan CUDA.")
37
+ except subprocess.CalledProcessError as e:
38
+ print(f"Error saat menginstal ulang llama-cpp-python: {e}")
39
+ except Exception as e:
40
+ print(f"Kesalahan umum: {e}")
41
+
42
+ # Fungsi untuk mengunduh model Llama
43
+ def initialize_llama_model():
44
+ # Unduh model jika belum ada di direktori kerja
45
+ model_path = hf_hub_download(
46
  repo_id="TheBLoke/zephyr-7b-beta-GGUF", # Nama repo model
47
  filename="zephyr-7b-beta.Q4_K_M.gguf", # Nama file model
48
  cache_dir="./models" # Lokasi direktori untuk menyimpan model
49
  )
50
  return model_path
51
+
52
+ # Fungsi untuk mengatur konfigurasi Settings
53
+ def initialize_settings(model_path): # Terima model_path sebagai parameter
54
+ Settings.llm = LlamaCPP(
55
+ model_path=model_path,
56
+ model_kwargs={"n_gpu_layers": 0, # Sesuaikan dengan kebutuhan perangkat Anda
57
+ "temperature": 0.7, # Sesuaikan untuk respons yang lebih cepat
58
+ "top_p": 0.9, # Mengurangi eksplorasi token
59
+ }
60
+ )
61
+
62
+ # Fungsi untuk Menginisialisasi Index
63
+ def initialize_index():
64
+ # Tentukan dokumen input untuk pembacaan data
65
+ documents = SimpleDirectoryReader(input_files=["bahandokumen/K3.txt",
66
+ "bahandokumen/bonus.txt",
67
  "bahandokumen/cuti.txt",
68
  "bahandokumen/disiplinkerja.txt",
69
  "bahandokumen/fasilitas&bantuan.txt",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  "bahandokumen/upahlembur.txt",
71
  "bahandokumen/waktukerja.txt"]).load_data()
72
 
73
+ parser = SentenceSplitter(chunk_size=150, chunk_overlap=10)
74
+ nodes = parser.get_nodes_from_documents(documents)
75
+ embedding = HuggingFaceEmbedding("BAAI/bge-base-en-v1.5")
76
+ Settings.embed_model = embedding
77
+ index = VectorStoreIndex(nodes)
78
+ return index
 
 
79
 
80
+ # Inisialisasi Mesin Chat
81
+ def initialize_chat_engine(index):
82
+ from llama_index.core.prompts import PromptTemplate
83
+ from llama_index.core.chat_engine.condense_plus_context import CondensePlusContextChatEngine
84
+ retriever = index.as_retriever(similarity_top_k=3)
85
+ chat_engine = CondensePlusContextChatEngine.from_defaults(
86
+ retriever=retriever,
87
+ verbose=True,
88
+ )
89
+ return chat_engine
 
90
 
91
+ # Fungsi untuk menghasilkan respons chatbot
92
+ def generate_response(message, history, chat_engine):
93
  chat_messages = [
94
  ChatMessage(
95
  role="system",
96
+ content="Anda adalah chatbot yang selalu menjawab pertanyaan secara singkat, ramah, dan jelas dalam bahasa Indonesia."
97
+ ),
98
  ]
99
+ response = chat_engine.stream_chat(message)
100
+ text = "".join(response.response_gen) # Gabungkan semua token menjadi string
101
+ history.append((message, text)) # Tambahkan ke riwayat
102
+ return history
103
 
104
+ def clear_history(chat_engine):
105
+ chat_engine.clear()
106
+
107
+ # Inisialisasi Komponen Gradio untuk UI
108
+ def launch_gradio(chat_engine):
109
+ with gr.Blocks() as demo:
110
+ # Mengatur tombol untuk menghapus riwayat chat
 
 
 
 
 
 
 
 
 
 
 
 
111
  clear_btn = gr.Button("Clear")
112
+ clear_btn.click(lambda: clear_history(chat_engine))
113
 
114
+ # Membuat antarmuka chat
115
+ chat_interface = gr.ChatInterface(
116
+ lambda message, history: generate_response(message, history, chat_engine)
117
+ )
118
+ demo.launch()
119
 
120
+ # Fungsi Utama untuk Menjalankan Aplikasi
121
+ def main():
122
+ install_llama_with_cuda()
123
+ # Unduh model dan inisialisasi pengaturan
124
+ model_path = initialize_llama_model()
125
+ initialize_settings(model_path) # Mengirimkan model_path ke fungsi initialize_settings
126
+ # Inisialisasi index dan engine
127
+ index = initialize_index()
128
+ chat_engine = initialize_chat_engine(index)
129
+ # Luncurkan antarmuka
130
+ launch_gradio(chat_engine)
131
+
132
+ if __name__ == "__main__":
133
+ main()