Pyefuri commited on
Commit
81dc1ea
·
verified ·
1 Parent(s): eddbdb5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -30
app.py CHANGED
@@ -11,17 +11,26 @@ tokenizer = AutoTokenizer.from_pretrained(model_name)
11
  print("Memuat model Bahasa Biak...")
12
  model = AutoModelForCausalLM.from_pretrained(
13
  model_name,
14
- dtype=torch.float16,
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
- # Solusi Pengaman Gradio Lama: 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 +40,8 @@ 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,36 +50,49 @@ def prediksi_terjemahan(message, history):
41
  )
42
 
43
  inputs = tokenizer([input_text], return_tensors="pt").to(model.device)
 
44
 
45
- with torch.no_grad():
46
- generated_ids = model.generate(
47
- **inputs,
48
- max_new_tokens=128,
49
- temperature=0.1,
50
- top_p=0.85,
51
- repetition_penalty=1.2,
52
- do_sample=True,
53
- eos_token_id=tokenizer.eos_token_id,
54
- pad_token_id=tokenizer.pad_token_id if tokenizer.pad_token_id is not None else tokenizer.eos_token_id
55
- )
56
-
57
- generated_ids = [
58
- output_ids[len(input_ids):] for input_ids, output_ids in zip(inputs.input_ids, generated_ids)
59
- ]
60
-
61
- respons = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
62
-
63
- # Memastikan output berupa string bersih murni
64
- if respons and len(respons) > 0:
65
- return str(respons[0]).strip()
66
 
67
- return "Maaf, terjadi kesalahan saat memproses terjemahan."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
- # Membuat Antarmuka Gradio (Menghapus parameter 'type' agar kompatibel dengan server lama)
70
  demo = gr.ChatInterface(
71
  fn=prediksi_terjemahan,
72
- title="🤖 AI Bahasa Indonesia-Biak",
73
- description="Silakan masukkan kalimat dalam Bahasa Indonesia untuk diterjemahkan ke dalam Bahasa Biak."
 
74
  )
75
 
76
  if __name__ == "__main__":
 
11
  print("Memuat model Bahasa Biak...")
12
  model = AutoModelForCausalLM.from_pretrained(
13
  model_name,
14
+ torch_dtype=torch.float16,
15
  device_map="auto"
16
  )
17
 
18
  @spaces.GPU
19
  def prediksi_terjemahan(message, history):
20
+ # PERUBAHAN UTAMA: Instruksi sistem diubah agar AI bersikap interaktif dan ramah layaknya ChatGPT
21
  percakapan = [
22
+ {
23
+ "role": "system",
24
+ "content": (
25
+ "Kamu adalah asisten AI chat interaktif sekaligus penerjemah yang ramah untuk Bahasa Indonesia dan Bahasa Biak. "
26
+ "Jika pengguna menyapa (seperti selamat pagi, siang, atau malam), jawablah sapaan tersebut dengan ramah, "
27
+ "sopan, dan tawarkan bantuan menggunakan gaya bahasa santai atau padanannya yang tepat. "
28
+ "Jika pengguna memberikan kalimat berita/tanya untuk diterjemahkan, berikan terjemahan ke Bahasa Biak secara alami."
29
+ )
30
+ }
31
  ]
32
 
33
+ # Membongkar history dengan validasi tipe data agar anti-unpack error
34
  if history:
35
  for interaksi in history:
36
  if isinstance(interaksi, (list, tuple)) and len(interaksi) == 2:
 
40
  if assistant:
41
  percakapan.append({"role": "assistant", "content": str(assistant)})
42
 
43
+ # Memasukkan pesan terbaru dari pengguna
44
+ percakapan.append({"role": "user", "content": message})
45
 
46
  input_text = tokenizer.apply_chat_template(
47
  percakapan,
 
50
  )
51
 
52
  inputs = tokenizer([input_text], return_tensors="pt").to(model.device)
53
+ input_len = inputs.input_ids.shape[1]
54
 
55
+ generation_kwargs = dict(
56
+ **inputs,
57
+ max_new_tokens=128,
58
+ temperature=0.4, # Menaikkan sedikit dari 0.1 ke 0.4 agar jawaban AI lebih variatif & tidak kaku
59
+ top_p=0.85,
60
+ repetition_penalty=1.2,
61
+ do_sample=True,
62
+ eos_token_id=tokenizer.eos_token_id,
63
+ pad_token_id=tokenizer.pad_token_id if tokenizer.pad_token_id is not None else tokenizer.eos_token_id
64
+ )
 
 
 
 
 
 
 
 
 
 
 
65
 
66
+ # PROSES STREAMING (Mengalirkan kata per kata secara bertahap ke UI)
67
+ with torch.no_grad():
68
+ generated_tokens = inputs.input_ids
69
+ for _ in range(generation_kwargs["max_new_tokens"]):
70
+ outputs = model(**{"input_ids": generated_tokens})
71
+ next_token_logits = outputs.logits[:, -1, :]
72
+
73
+ if generation_kwargs["do_sample"]:
74
+ next_token_logits = next_token_logits / generation_kwargs["temperature"]
75
+ probs = torch.softmax(next_token_logits, dim=-1)
76
+ next_token = torch.multinomial(probs, num_samples=1)
77
+ else:
78
+ next_token = torch.argmax(next_token_logits, dim=-1, keepdim=True)
79
+
80
+ generated_tokens = torch.cat([generated_tokens, next_token], dim=-1)
81
+
82
+ # Memotong token input agar hanya mengambil teks baru dari AI
83
+ text_terjemahan = tokenizer.decode(generated_tokens[0][input_len:], skip_special_tokens=True)
84
+
85
+ yield text_terjemahan.strip()
86
+
87
+ if next_token.item() == generation_kwargs["eos_token_id"]:
88
+ break
89
 
90
+ # Membuat Antarmuka Gradio dengan tambahan contoh sapaan interaktif di bagian bawah
91
  demo = gr.ChatInterface(
92
  fn=prediksi_terjemahan,
93
+ title="🤖 AI Bahasa Indonesia-Biak",
94
+ description="Ketik kalimat sapaan atau teks Bahasa Indonesia untuk berinteraksi langsung dengan AI.",
95
+
96
  )
97
 
98
  if __name__ == "__main__":