Pyefuri commited on
Commit
ee0bd29
Β·
verified Β·
1 Parent(s): 135ee9d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +67 -46
app.py CHANGED
@@ -1,7 +1,9 @@
1
  import gradio as gr
2
  import torch
3
  import spaces
4
- from transformers import AutoModelForCausalLM, AutoTokenizer
 
 
5
 
6
  model_name = "Pyefuri/Qwen2.5-3B-Bahasa-Biak-Final"
7
 
@@ -11,17 +13,43 @@ tokenizer = AutoTokenizer.from_pretrained(model_name)
11
  print("Memuat model Bahasa Biak...")
12
  model = AutoModelForCausalLM.from_pretrained(
13
  model_name,
14
- torch_dtype=torch.float16, # Diperbaiki dari dtype menjadi torch_dtype agar standar
15
  device_map="auto"
16
  )
17
 
18
  @spaces.GPU
19
  def prediksi_terjemahan(message, history):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  percakapan = [
21
- {"role": "system", "content": "Kamu adalah asisten AI penerjemah yang ahli. Tugasmu adalah menerjemahkan teks dari Bahasa Indonesia ke Bahasa Biak secara akurat, alami, ringkas, dan langsung tanpa pengulangan kata."}
 
 
 
22
  ]
23
 
24
- # Membongkar history dengan validasi tipe data agar anti-unpack error
25
  if history:
26
  for interaksi in history:
27
  if isinstance(interaksi, (list, tuple)) and len(interaksi) == 2:
@@ -31,8 +59,7 @@ def prediksi_terjemahan(message, history):
31
  if assistant:
32
  percakapan.append({"role": "assistant", "content": str(assistant)})
33
 
34
- prompt_penerjemahan = f"Terjemahkan kalimat berikut ke dalam Bahasa Biak: {message}"
35
- percakapan.append({"role": "user", "content": prompt_penerjemahan})
36
 
37
  input_text = tokenizer.apply_chat_template(
38
  percakapan,
@@ -41,13 +68,14 @@ def prediksi_terjemahan(message, history):
41
  )
42
 
43
  inputs = tokenizer([input_text], return_tensors="pt").to(model.device)
44
- input_len = inputs.input_ids.shape[1]
45
 
46
- # Mengatur parameter generator teks
 
47
  generation_kwargs = dict(
48
  **inputs,
 
49
  max_new_tokens=128,
50
- temperature=0.1,
51
  top_p=0.85,
52
  repetition_penalty=1.2,
53
  do_sample=True,
@@ -55,43 +83,36 @@ def prediksi_terjemahan(message, history):
55
  pad_token_id=tokenizer.pad_token_id if tokenizer.pad_token_id is not None else tokenizer.eos_token_id
56
  )
57
 
58
- # --- PROSES STREAMING YANG AMAN UNTUK ZERO GPU ---
59
- # Di dalam decorator @spaces.GPU, kita melakukan iterasi pemrosesan token satu demi satu secara langsung
60
- with torch.no_grad():
61
- generated_tokens = inputs.input_ids
62
- for _ in range(generation_kwargs["max_new_tokens"]):
63
- outputs = model(**{"input_ids": generated_tokens})
64
- next_token_logits = outputs.logits[:, -1, :]
65
-
66
- # Menerapkan parameter pemrosesan (temperature & top-p) untuk pemilihan token berikutnya
67
- if generation_kwargs["do_sample"]:
68
- # Mengaplikasikan suhu (temperature)
69
- next_token_logits = next_token_logits / generation_kwargs["temperature"]
70
- probs = torch.softmax(next_token_logits, dim=-1)
71
- next_token = torch.multinomial(probs, num_samples=1)
72
- else:
73
- next_token = torch.argmax(next_token_logits, dim=-1, keepdim=True)
74
-
75
- # Menggabungkan token baru ke dalam deretan kata yang sudah tercipta
76
- generated_tokens = torch.cat([generated_tokens, next_token], dim=-1)
77
-
78
- # Mengubah token menjadi teks mentah yang siap ditampilkan ke UI
79
- text_terjemahan = tokenizer.decode(generated_tokens[0][input_len:], skip_special_tokens=True)
80
-
81
- # Mengirimkan potongan teks secara langsung ke layar web pengguna saat itu juga
82
- yield text_terjemahan.strip()
83
-
84
- # Menghentikan perulangan jika model mendeteksi tanda baca akhir (End of String / EOS)
85
- if next_token.item() == generation_kwargs["eos_token_id"]:
86
- break
87
 
88
- # Membuat Antarmuka Gradio (Menggunakan tema bawaan agar tampilannya rapi)
89
- demo = gr.ChatInterface(
90
- fn=prediksi_terjemahan,
91
- title="πŸ€– AI Bahasa Indonesia-Biak",
92
- description="Silakan masukkan kalimat dalam Bahasa Indonesia untuk diterjemahkan ke dalam Bahasa Biak.",
93
- theme=gr.themes.Soft()
94
- )
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
  if __name__ == "__main__":
97
- demo.launch()
 
 
 
 
1
  import gradio as gr
2
  import torch
3
  import spaces
4
+ from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
5
+ from threading import Thread
6
+ import time
7
 
8
  model_name = "Pyefuri/Qwen2.5-3B-Bahasa-Biak-Final"
9
 
 
13
  print("Memuat model Bahasa Biak...")
14
  model = AutoModelForCausalLM.from_pretrained(
15
  model_name,
16
+ dtype=torch.float16,
17
  device_map="auto"
18
  )
19
 
20
  @spaces.GPU
21
  def prediksi_terjemahan(message, history):
22
+ # ========================================================
23
+ # FILTRASI UX: MENDETEKSI SAPAAN AGAR AI JAWABNYA RAMAH
24
+ # ========================================================
25
+ pesan_bersih = message.lower().strip()
26
+ sapaan_id = ["halo", "hai", "selamat siang", "slamat siang", "selamat pagi", "slamat pagi", "selamat malam", "slamat malam", "apa kabar"]
27
+
28
+ # Jika pengguna hanya menyapa, berikan respon chat interaktif buatan secara streaming
29
+ if any(sapaan in pesan_bersih for sapaan in sapaan_id):
30
+ respon_sapaan = "Hai, selamat siang! Ada yang bisa saya bantu untuk diterjemahkan ke dalam Bahasa Biak hari ini? 😊"
31
+ if "pagi" in pesan_bersih:
32
+ respon_sapaan = "Hai, selamat pagi! Ada yang bisa saya bantu untuk diterjemahkan ke dalam Bahasa Biak hari ini? 😊"
33
+ elif "malam" in pesan_bersih:
34
+ respon_sapaan = "Hai, selamat malam! Ada yang bisa saya bantu untuk diterjemahkan ke dalam Bahasa Biak hari ini? 😊"
35
+
36
+ teks_berjalan = ""
37
+ for karakter in respon_sapaan:
38
+ teks_berjalan += karakter
39
+ time.sleep(0.01) # Efek mengetik halus
40
+ yield teks_berjalan
41
+ return # Menghentikan fungsi di sini agar model tidak ikut memproses terjemahan kaku
42
+
43
+ # ========================================================
44
+ # LOGIKA UTAMA: JIKA BUKAN SAPAAN, JALANKAN TRANSLATOR BIAK
45
+ # ========================================================
46
  percakapan = [
47
+ {
48
+ "role": "system",
49
+ "content": "Kamu adalah asisten AI penerjemah yang ahli. Tugasmu adalah menerjemahkan teks dari Bahasa Indonesia ke Bahasa Biak secara akurat, alami, ringkas, dan langsung."
50
+ }
51
  ]
52
 
 
53
  if history:
54
  for interaksi in history:
55
  if isinstance(interaksi, (list, tuple)) and len(interaksi) == 2:
 
59
  if assistant:
60
  percakapan.append({"role": "assistant", "content": str(assistant)})
61
 
62
+ percakapan.append({"role": "user", "content": message})
 
63
 
64
  input_text = tokenizer.apply_chat_template(
65
  percakapan,
 
68
  )
69
 
70
  inputs = tokenizer([input_text], return_tensors="pt").to(model.device)
 
71
 
72
+ streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
73
+
74
  generation_kwargs = dict(
75
  **inputs,
76
+ streamer=streamer,
77
  max_new_tokens=128,
78
+ temperature=0.1, # Dikembalikan ke 0.1 agar hasil terjemahan bahasa Biaknya sangat akurat dan kaku pada polanya
79
  top_p=0.85,
80
  repetition_penalty=1.2,
81
  do_sample=True,
 
83
  pad_token_id=tokenizer.pad_token_id if tokenizer.pad_token_id is not None else tokenizer.eos_token_id
84
  )
85
 
86
+ thread = Thread(target=model.generate, kwargs=generation_kwargs)
87
+ thread.start()
88
+
89
+ text_terjemahan = ""
90
+ for new_text in streamer:
91
+ text_terjemahan += new_text
92
+ yield text_terjemahan.strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
 
94
+ # ==========================================
95
+ # STRUKTUR DESAIN CUSTOM CSS
96
+ # ==========================================
97
+ desain_kustom_css = """
98
+ #wadah-lebar-chat {
99
+ max-width: 800px !important;
100
+ margin: 0 auto !important;
101
+ float: none !important;
102
+ }
103
+ """
104
+
105
+ with gr.Blocks() as demo:
106
+ gr.Markdown("# πŸ€– AI Bahasa Indonesia-Biak")
107
+
108
+ with gr.Column(elem_id="wadah-lebar-chat"):
109
+ gr.ChatInterface(
110
+ fn=prediksi_terjemahan,
111
+
112
+ )
113
 
114
  if __name__ == "__main__":
115
+ demo.launch(
116
+ theme=gr.themes.Soft(),
117
+ css=desain_kustom_css
118
+ )