BramLeo commited on
Commit
ba9c6f3
·
verified ·
1 Parent(s): 7b9d5b2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +118 -109
app.py CHANGED
@@ -1,142 +1,151 @@
1
- # Import Library yang Diperlukan
2
  import gradio as gr
3
- import shutil
4
- import os
5
- import subprocess
6
- from llama_cpp import Llama
7
- from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings
8
- from llama_index.core.llms import ChatMessage
9
- from llama_index.llms.llama_cpp import LlamaCPP
10
  from llama_index.embeddings.huggingface import HuggingFaceEmbedding
11
  from huggingface_hub import hf_hub_download
12
- from llama_index.core.node_parser import SentenceSplitter
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- # Fungsi untuk mengunduh model Llama
 
 
 
 
 
 
 
 
 
 
15
  def initialize_llama_model():
16
- # Unduh model jika belum ada di direktori kerja
17
- model_path = hf_hub_download(
18
- repo_id="TheBLoke/zephyr-7b-beta-GGUF", # Nama repo model
19
- filename="zephyr-7b-beta.Q4_K_M.gguf", # Nama file model
20
- cache_dir="./models" # Lokasi direktori untuk menyimpan model
 
21
  )
22
- return model_path
23
 
24
- # Fungsi untuk mengatur konfigurasi Settings
25
- def initialize_settings(model_path):
26
- Settings.llm = LlamaCPP(
27
- model_path=model_path,
28
- temperature=0.7,
29
- )
30
 
31
- # Fungsi untuk Menginisialisasi Index
 
 
32
  def initialize_index():
33
- # Tentukan dokumen input untuk pembacaan data
34
- documents = SimpleDirectoryReader(input_files=["bahandokumen/K3.txt",
35
- "bahandokumen/bonus.txt",
36
- "bahandokumen/absensi.txt",
37
- "bahandokumen/cuti.txt",
38
- "bahandokumen/disiplinkerja.txt",
39
- "bahandokumen/fasilitas&bantuan.txt",
40
- "bahandokumen/fasilitaskerja.txt",
41
- "bahandokumen/hak.txt",
42
- "bahandokumen/hubunganpengusaha&serikat.txt",
43
- "bahandokumen/istilah.txt",
44
- "bahandokumen/jaminanserikat.txt",
45
- "bahandokumen/jamkes.txt",
46
- "bahandokumen/jamsos.txt",
47
- "bahandokumen/keluhkesah.txt",
48
- "bahandokumen/kenaikanupah.txt",
49
- "bahandokumen/kewajiban.txt",
50
- "bahandokumen/kompensasi.txt",
51
- "bahandokumen/larangan.txt",
52
- "bahandokumen/lembur.txt",
53
- "bahandokumen/luaskesepakatan.txt",
54
- "bahandokumen/mogok.txt",
55
- "bahandokumen/pelanggaran&sanksi.txt",
56
- "bahandokumen/pendidikan.txt",
57
- "bahandokumen/pengangkatan.txt",
58
- "bahandokumen/penilaian&promosi.txt",
59
- "bahandokumen/pensiun.txt",
60
- "bahandokumen/perjadin.txt",
61
- "bahandokumen/pesangon.txt",
62
- "bahandokumen/phk.txt",
63
- "bahandokumen/pihak.txt",
64
- "bahandokumen/pkb.txt",
65
- "bahandokumen/resign.txt",
66
- "bahandokumen/sanksi.txt",
67
- "bahandokumen/shift.txt",
68
- "bahandokumen/syaratkerja.txt",
69
- "bahandokumen/sisacuti.txt",
70
- "bahandokumen/target.txt",
71
- "bahandokumen/tatacara.txt",
72
- "bahandokumen/tka.txt",
73
- "bahandokumen/tunjangan.txt",
74
- "bahandokumen/uangpisah.txt",
75
- "bahandokumen/upah.txt",
76
- "bahandokumen/upahlembur.txt",
77
- "bahandokumen/waktukerja.txt"]).load_data()
78
-
79
- parser = SentenceSplitter(chunk_size=150, chunk_overlap=10)
80
- nodes = parser.get_nodes_from_documents(documents)
81
  embedding = HuggingFaceEmbedding("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
82
  Settings.embed_model = embedding
 
83
  index = VectorStoreIndex(nodes)
84
  return index
85
 
86
- # Inisialisasi Mesin Chat
87
  def initialize_chat_engine(index):
88
- from llama_index.core.prompts import PromptTemplate
89
- from llama_index.core.chat_engine.condense_plus_context import CondensePlusContextChatEngine
90
  retriever = index.as_retriever(similarity_top_k=3)
91
  chat_engine = CondensePlusContextChatEngine.from_defaults(
92
  retriever=retriever,
93
- verbose=True,
94
  )
95
  return chat_engine
96
 
97
- # Fungsi untuk menghasilkan respons chatbot
98
- def generate_response(message, history, chat_engine):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  chat_messages = [
100
  ChatMessage(
101
  role="system",
102
- content="Anda adalah chatbot yang menjawab dalam bahasa Indonesia. Berikut contoh percakapan:\n"
103
- "Pengguna: Apa itu lembur?\n"
104
- "Chatbot: Lembur adalah pekerjaan yang dilakukan di luar jam kerja yang telah ditetapkan.\n"
105
- "Pengguna: Apa syarat kerja di perusahaan?\n"
106
- "Chatbot: Syarat kerja di perusahaan meliputi waktu kerja, gaji, dan tunjangan sesuai dengan peraturan perusahaan."
 
 
 
 
107
  ),
108
  ]
109
- response = chat_engine.stream_chat(message)
110
- text = "".join(response.response_gen) # Gabungkan semua token menjadi string
111
- history.append((message, text)) # Tambahkan ke riwayat
112
- return history
113
 
114
- def clear_history(chat_engine):
115
- chat_engine.clear()
116
 
117
- # Inisialisasi Komponen Gradio untuk UI
118
- def launch_gradio(chat_engine):
119
- with gr.Blocks() as demo:
120
- # Mengatur tombol untuk menghapus riwayat chat
121
- clear_btn = gr.Button("Clear")
122
- clear_btn.click(lambda: clear_history(chat_engine))
123
-
124
- # Membuat antarmuka chat
125
- chat_interface = gr.ChatInterface(
126
- lambda message, history: generate_response(message, history, chat_engine)
127
- )
128
- demo.launch()
129
-
130
- # Fungsi Utama untuk Menjalankan Aplikasi
131
  def main():
132
- # Unduh model dan inisialisasi pengaturan
133
- model_path = initialize_llama_model()
134
- initialize_settings(model_path) # Mengirimkan model_path ke fungsi initialize_settings
135
- # Inisialisasi index dan engine
136
  index = initialize_index()
137
  chat_engine = initialize_chat_engine(index)
138
- # Luncurkan antarmuka
139
- launch_gradio(chat_engine)
140
-
 
 
 
 
 
 
 
141
  if __name__ == "__main__":
142
  main()
 
 
1
  import gradio as gr
2
+ import gspread
3
+ import torch
4
+ from oauth2client.service_account import ServiceAccountCredentials
5
+ from transformers import AutoModelForCausalLM, AutoTokenizer
6
+ from llama_index.core import VectorStoreIndex, Settings
7
+ from llama_index.core.node_parser import SentenceSplitter
 
8
  from llama_index.embeddings.huggingface import HuggingFaceEmbedding
9
  from huggingface_hub import hf_hub_download
10
+ from llama_index.core.llms import ChatMessage
11
+ from llama_index.core.chat_engine.condense_plus_context import CondensePlusContextChatEngine
12
+ from llama_index.core.schema import Document
13
+
14
+ # ===================================
15
+ # 1️⃣ Fungsi Membaca Data Google Spreadsheet
16
+ # ===================================
17
+ def read_google_sheets():
18
+ try:
19
+ scope = ["https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive"]
20
+ creds = ServiceAccountCredentials.from_json_keyfile_name("credentials.json", scope)
21
+ client = gspread.authorize(creds)
22
+
23
+ SPREADSHEET_ID = "1e_cNMhwF-QYpyYUpqQh-XCw-OdhWS6EuYsoBUsVtdNg"
24
+ sheet_names = ["datatarget", "datacuti", "dataabsen", "datalembur"]
25
+
26
+ all_data = []
27
+ spreadsheet = client.open_by_key(SPREADSHEET_ID)
28
+
29
+ for sheet_name in sheet_names:
30
+ try:
31
+ sheet = spreadsheet.worksheet(sheet_name)
32
+ data = sheet.get_all_values()
33
+ all_data.append(f"=== Data dari {sheet_name.upper()} ===")
34
+ all_data.extend([" | ".join(row) for row in data])
35
+ all_data.append("\n")
36
+ except gspread.exceptions.WorksheetNotFound:
37
+ all_data.append(f"❌ ERROR: Worksheet {sheet_name} tidak ditemukan.")
38
 
39
+ return "\n".join(all_data).strip()
40
+
41
+ except gspread.exceptions.SpreadsheetNotFound:
42
+ return "❌ ERROR: Spreadsheet tidak ditemukan!"
43
+
44
+ except Exception as e:
45
+ return f"❌ ERROR: {str(e)}"
46
+
47
+ # ===================================
48
+ # 2️⃣ Inisialisasi Model Llama di GPU
49
+ # ===================================
50
  def initialize_llama_model():
51
+ model_name = "HuggingFaceH4/zephyr-7b-beta" # Pastikan model ini kompatibel dengan transformers
52
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
53
+ model = AutoModelForCausalLM.from_pretrained(
54
+ model_name,
55
+ torch_dtype=torch.float16, # Gunakan float16 agar lebih hemat memori
56
+ device_map="auto" # Memastikan model berjalan di GPU jika tersedia
57
  )
58
+ return tokenizer, model
59
 
60
+ # ===================================
61
+ # 3️⃣ Inisialisasi Pengaturan Model
62
+ # ===================================
63
+ def initialize_settings(tokenizer, model):
64
+ Settings.llm = model # Tidak lagi menggunakan LlamaCPP
 
65
 
66
+ # ===================================
67
+ # 4️⃣ Inisialisasi Index & Chat Engine
68
+ # ===================================
69
  def initialize_index():
70
+ text_data = read_google_sheets()
71
+ document = Document(text=text_data)
72
+ parser = SentenceSplitter(chunk_size=100, chunk_overlap=30)
73
+ nodes = parser.get_nodes_from_documents([document])
74
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  embedding = HuggingFaceEmbedding("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
76
  Settings.embed_model = embedding
77
+
78
  index = VectorStoreIndex(nodes)
79
  return index
80
 
 
81
  def initialize_chat_engine(index):
 
 
82
  retriever = index.as_retriever(similarity_top_k=3)
83
  chat_engine = CondensePlusContextChatEngine.from_defaults(
84
  retriever=retriever,
85
+ verbose=False # ❌ Hapus verbose agar tidak ada referensi dokumen
86
  )
87
  return chat_engine
88
 
89
+ # ===================================
90
+ # 5️⃣ Fungsi untuk Merapikan Jawaban Chatbot
91
+ # ===================================
92
+ def clean_response(response):
93
+ text = "".join(response.response_gen) # Gabungkan teks yang dihasilkan
94
+ text = text.replace("\n\n", "\n").strip() # Hilangkan newline berlebihan
95
+ text = text.replace("user:", "").replace("jawaban:", "").replace("assistant:", "").strip()
96
+ return text
97
+
98
+ # ===================================
99
+ # 6️⃣ Fungsi untuk Menghasilkan Respons Chatbot
100
+ # ===================================
101
+ def generate_response(message, history, tokenizer, model):
102
+ if history is None:
103
+ history = []
104
+
105
  chat_messages = [
106
  ChatMessage(
107
  role="system",
108
+ content=(
109
+ "Anda adalah chatbot HRD yang membantu karyawan memahami administrasi perusahaan. "
110
+ "Jangan menjawab menggunakan Bahasa Inggris. "
111
+ "Gunakan Bahasa Indonesia dengan gaya profesional dan ramah. "
112
+ "Jika informasi tidak tersedia dalam dokumen, katakan dengan sopan bahwa Anda tidak tahu. "
113
+ "Jawaban harus singkat, jelas, dan sesuai konteks."
114
+ "Jangan memberikan jawaban untuk pertanyaan yang tidak diajukan oleh pengguna. "
115
+ "Jangan menyertakan rekomendasi pertanyaan lain."
116
+ ),
117
  ),
118
  ]
 
 
 
 
119
 
120
+ # Tokenisasi input
121
+ inputs = tokenizer(message, return_tensors="pt").to("cuda")
122
 
123
+ # Hasilkan respons
124
+ with torch.no_grad():
125
+ outputs = model.generate(**inputs, max_length=512)
126
+
127
+ response = tokenizer.decode(outputs[0], skip_special_tokens=True)
128
+ history.append((message, response))
129
+ return response
130
+
131
+ # ===================================
132
+ # 7️⃣ Fungsi Utama untuk Menjalankan Aplikasi
133
+ # ===================================
 
 
 
134
  def main():
135
+ tokenizer, model = initialize_llama_model()
136
+ initialize_settings(tokenizer, model)
137
+
 
138
  index = initialize_index()
139
  chat_engine = initialize_chat_engine(index)
140
+
141
+ def chatbot_response(message, history=None):
142
+ return generate_response(message, history, tokenizer, model)
143
+
144
+ gr.Interface(
145
+ fn=chatbot_response,
146
+ inputs=["text"],
147
+ outputs=["text"],
148
+ ).launch()
149
+
150
  if __name__ == "__main__":
151
  main()