BramLeo commited on
Commit
4b8ea86
·
verified ·
1 Parent(s): bc7d716

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -63
app.py CHANGED
@@ -1,136 +1,105 @@
1
  import gradio as gr
2
  import gspread
 
3
  from oauth2client.service_account import ServiceAccountCredentials
4
  from llama_cpp import Llama
5
  from llama_index.core import VectorStoreIndex, Settings
6
- from llama_index.core.node_parser import SentenceSplitter
7
- from llama_index.embeddings.huggingface import HuggingFaceEmbedding
8
- from llama_index.llms.llama_cpp import LlamaCPP
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", "pkb"]
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
49
  # ===================================
50
  def initialize_llama_model():
51
  model_path = hf_hub_download(
52
- repo_id="TheBLoke/zephyr-7b-beta-GGUF",
53
  filename="zephyr-7b-beta.Q4_K_M.gguf",
54
  cache_dir="./models"
55
  )
56
- return model_path
57
-
58
  # ===================================
59
  # 3️⃣ Inisialisasi Pengaturan Model
60
  # ===================================
 
61
  def initialize_settings(model_path):
62
- Settings.llm = LlamaCPP(model_path=model_path, temperature=0.7)
 
 
 
 
 
 
 
 
63
 
64
  # ===================================
65
  # 4️⃣ Inisialisasi Index & Chat Engine
66
- # ===================================
67
- def initialize_index():
68
- text_data = read_google_sheets()
69
- document = Document(text=text_data)
70
  parser = SentenceSplitter(chunk_size=100, chunk_overlap=30)
71
  nodes = parser.get_nodes_from_documents([document])
72
 
73
- embedding = HuggingFaceEmbedding("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
74
  Settings.embed_model = embedding
75
 
76
  index = VectorStoreIndex(nodes)
77
  return index
78
 
79
  def initialize_chat_engine(index):
80
- retriever = index.as_retriever(similarity_top_k=3)
81
  chat_engine = CondensePlusContextChatEngine.from_defaults(
82
  retriever=retriever,
83
- verbose=False # ❌ Hapus verbose agar tidak ada referensi dokumen
84
  )
85
  return chat_engine
86
 
87
- # ===================================
88
  # 5️⃣ Fungsi untuk Merapikan Jawaban Chatbot
89
  # ===================================
90
  def clean_response(response):
91
- text = "".join(response.response_gen) # Gabungkan teks yang dihasilkan
92
- text = text.replace("\n\n", "\n").strip() # Hilangkan newline berlebihan
93
  text = text.replace("user:", "").replace("jawaban:", "").replace("assistant:", "").strip()
94
  return text
95
 
96
- # ===================================
97
- # 6️⃣ Fungsi untuk Menghasilkan Respons Chatbot
98
- # ===================================
99
- def generate_response(message, history, chat_engine):
100
- if history is None:
101
- history = []
102
-
103
- chat_messages = [
104
- ChatMessage(
105
- role="system",
106
- content=(
107
- "Anda adalah chatbot HRD yang membantu karyawan memahami administrasi perusahaan. "
108
  "Jangan menjawab menggunakan Bahasa Inggris. "
109
  "Gunakan Bahasa Indonesia dengan gaya profesional dan ramah. "
110
  "Jika informasi tidak tersedia dalam dokumen, katakan dengan sopan bahwa Anda tidak tahu. "
111
- "Jawaban harus singkat, jelas, dan sesuai konteks."
112
  "Jangan memberikan jawaban untuk pertanyaan yang tidak diajukan oleh pengguna. "
113
  "Jangan menyertakan rekomendasi pertanyaan lain."
114
  ),
115
  ),
116
  ]
117
 
118
- response = chat_engine.stream_chat(message)
119
- cleaned_text = clean_response(response) # 🔹 Gunakan fungsi clean_response()
120
 
121
- history.append((message, cleaned_text)) # 🔹 Pastikan hanya teks yang masuk ke history
122
  return cleaned_text
123
 
124
- # ===================================
125
- # 7️⃣ Fungsi Utama untuk Menjalankan Aplikasi
126
  # ===================================
127
  def main():
128
  model_path = initialize_llama_model()
129
  initialize_settings(model_path)
130
-
131
  index = initialize_index()
132
  chat_engine = initialize_chat_engine(index)
133
-
134
  def chatbot_response(message, history):
135
  return generate_response(message, history, chat_engine)
136
 
 
1
  import gradio as gr
2
  import gspread
3
+ import time
4
  from oauth2client.service_account import ServiceAccountCredentials
5
  from llama_cpp import Llama
6
  from llama_index.core import VectorStoreIndex, Settings
 
 
 
 
 
 
7
  from llama_index.core.schema import Document
8
 
9
  # ===================================
10
+ # 1️⃣ Cache Data Google Sheets
11
  # ===================================
12
+ cached_text_data = None
13
+
14
  def read_google_sheets():
15
+ global cached_text_data
16
+ if cached_text_data is not None:
17
+ return cached_text_data
18
+
19
  try:
20
  scope = ["https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive"]
21
  creds = ServiceAccountCredentials.from_json_keyfile_name("credentials.json", scope)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  except gspread.exceptions.WorksheetNotFound:
23
  all_data.append(f"❌ ERROR: Worksheet {sheet_name} tidak ditemukan.")
24
 
25
+ cached_text_data = "\n".join(all_data).strip()
26
+ return cached_text_data
27
 
28
  except gspread.exceptions.SpreadsheetNotFound:
29
  return "❌ ERROR: Spreadsheet tidak ditemukan!"
 
 
 
 
 
 
30
  # ===================================
31
  def initialize_llama_model():
32
  model_path = hf_hub_download(
33
+ repo_id="TheBloke/zephyr-7b-beta-GGUF",
34
  filename="zephyr-7b-beta.Q4_K_M.gguf",
35
  cache_dir="./models"
36
  )
 
 
37
  # ===================================
38
  # 3️⃣ Inisialisasi Pengaturan Model
39
  # ===================================
40
+
41
  def initialize_settings(model_path):
42
+ Settings.llm = LlamaCPP(
43
+ model_path=model_path,
44
+ temperature=0.7,
45
+ context_window=4096,
46
+ max_new_tokens=512,
47
+ # n_gpu_layers=20, # ❌ Hapus jika error
48
+ model_kwargs={"n_ctx": 4096}
49
+ )
50
+
51
 
52
  # ===================================
53
  # 4️⃣ Inisialisasi Index & Chat Engine
 
 
 
 
54
  parser = SentenceSplitter(chunk_size=100, chunk_overlap=30)
55
  nodes = parser.get_nodes_from_documents([document])
56
 
57
+ embedding = HuggingFaceEmbedding("sentence-transformers/all-MiniLM-L6-v2") # ✅ Lebih ringan
58
  Settings.embed_model = embedding
59
 
60
  index = VectorStoreIndex(nodes)
61
  return index
62
 
63
  def initialize_chat_engine(index):
64
+ retriever = index.as_retriever(similarity_top_k=1) # ✅ Kurangi ke 1 untuk kecepatan
65
  chat_engine = CondensePlusContextChatEngine.from_defaults(
66
  retriever=retriever,
67
+ verbose=False
68
  )
69
  return chat_engine
70
 
 
71
  # 5️⃣ Fungsi untuk Merapikan Jawaban Chatbot
72
  # ===================================
73
  def clean_response(response):
74
+ text = "".join(response.response_gen)
75
+ text = text.replace("\n\n", "\n").strip()
76
  text = text.replace("user:", "").replace("jawaban:", "").replace("assistant:", "").strip()
77
  return text
78
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  "Jangan menjawab menggunakan Bahasa Inggris. "
80
  "Gunakan Bahasa Indonesia dengan gaya profesional dan ramah. "
81
  "Jika informasi tidak tersedia dalam dokumen, katakan dengan sopan bahwa Anda tidak tahu. "
82
+ "Jawaban harus singkat, jelas, dan sesuai konteks. "
83
  "Jangan memberikan jawaban untuk pertanyaan yang tidak diajukan oleh pengguna. "
84
  "Jangan menyertakan rekomendasi pertanyaan lain."
85
  ),
86
  ),
87
  ]
88
 
89
+ response = chat_engine.chat(message) # GANTI: pakai .chat() bukan .stream_chat()
90
+ cleaned_text = response.response.strip() # GANTI: langsung ambil response
91
 
92
+ history.append((message, cleaned_text))
93
  return cleaned_text
94
 
 
 
95
  # ===================================
96
  def main():
97
  model_path = initialize_llama_model()
98
  initialize_settings(model_path)
99
+
100
  index = initialize_index()
101
  chat_engine = initialize_chat_engine(index)
102
+
103
  def chatbot_response(message, history):
104
  return generate_response(message, history, chat_engine)
105