File size: 4,033 Bytes
0b6c4dc
c704345
 
c63d462
 
0b6c4dc
c704345
 
 
c63d462
 
 
 
 
 
 
 
 
 
0b6c4dc
c704345
 
 
11a950a
 
84c48de
 
 
 
0b6c4dc
c704345
11a950a
c704345
 
 
 
 
 
84c48de
c704345
 
0b6c4dc
c704345
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0b6c4dc
c704345
 
0b6c4dc
c704345
 
0b6c4dc
c704345
 
 
 
 
 
 
 
 
 
 
 
 
0b6c4dc
c704345
 
 
 
 
 
 
 
 
 
 
 
 
 
0b6c4dc
c704345
 
0b6c4dc
c704345
0b6c4dc
c704345
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import os
from huggingface_hub import login

# --- Konfigurasi ---
# Gunakan ID model yang spesifik dari Hugging Face Hub
model_id = "google/gemma-3n-E4B-it-litert-preview"
# Dapatkan token dari Hugging Face Space Secrets
# Anda harus mengatur ini di pengaturan Space Anda!
hf_token = os.getenv("HF_TOKEN")

# Lakukan login menggunakan token jika tersedia
if hf_token:
    print("Melakukan login ke Hugging Face Hub...")
    login(token=hf_token)
else:
    print("Peringatan: Secret HF_TOKEN tidak ditemukan. Proses unduh model mungkin gagal jika repo bersifat privat/gated.")

# --- Muat Model dan Tokenizer ---
# Proses ini hanya berjalan sekali saat aplikasi dimulai
print("Memuat tokenizer...")
# Menambahkan trust_remote_code=True untuk mengizinkan kode kustom dari model.
# Token tidak perlu dilewatkan lagi setelah login().
tokenizer = AutoTokenizer.from_pretrained(
    model_id, 
    trust_remote_code=True
)

print("Memuat model... Ini mungkin memakan waktu beberapa menit.")
# Menambahkan trust_remote_code=True juga untuk model.
# torch_dtype=torch.bfloat16 mengurangi penggunaan memori.
# device_map="auto" akan secara otomatis menggunakan GPU jika tersedia.
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True,
)
print("Model berhasil dimuat!")

# --- Fungsi Inti untuk Chat ---
def chat_function(message, history):
    """
    Fungsi ini dipanggil setiap kali pengguna mengirim pesan.
    Ia memformat input, menghasilkan respons dari model, dan mengembalikan hasilnya.
    """
    # Template chat untuk Gemma memerlukan format spesifik dengan token khusus.
    # Kita akan membangun prompt dengan format ini dari riwayat percakapan.
    chat_template = []
    for user_msg, assistant_msg in history:
        chat_template.append({"role": "user", "content": user_msg})
        chat_template.append({"role": "assistant", "content": assistant_msg})
    
    # Tambahkan pesan pengguna yang baru
    chat_template.append({"role": "user", "content": message})
    
    # Terapkan template chat ke tokenizer
    # Ini akan membuat string prompt yang siap digunakan oleh model
    prompt = tokenizer.apply_chat_template(chat_template, tokenize=False, add_generation_prompt=True)

    # Tokenisasi prompt yang sudah diformat
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    print("\n--- Menghasilkan Respons ---")
    print(f"Prompt yang dikirim ke model:\n{prompt}")

    # Hasilkan respons dari model
    outputs = model.generate(
        **inputs,
        max_new_tokens=1500,  # Batas maksimum token untuk respons
        eos_token_id=tokenizer.eos_token_id  # Berhenti saat token end-of-sentence tercapai
    )
    
    # Decode token output menjadi teks
    # Kita hanya mengambil bagian respons yang baru dihasilkan
    response_text = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
    
    print(f"Respons dari model:\n{response_text}")
    return response_text

# --- Membuat Antarmuka Gradio ---
# gr.ChatInterface adalah komponen UI tingkat tinggi yang menyediakan fungsionalitas chat
chatbot_ui = gr.ChatInterface(
    fn=chat_function,
    title="🤖 Gemma 3n Chat",
    description="""
    Ini adalah antarmuka chat untuk model **google/gemma-3n-E4B-it-litert-preview**. 
    Model ini adalah model besar, jadi harap bersabar untuk responsnya jika berjalan di CPU.
    **Sangat disarankan untuk menggunakan hardware GPU untuk performa terbaik.**
    """,
    examples=[
        ["Ceritakan tentang sejarah singkat Indonesia"],
        ["Buatkan saya resep untuk membuat nasi goreng spesial"],
        ["Jelaskan konsep machine learning dalam 3 paragraf"]
    ],
    cache_examples=False # Nonaktifkan cache untuk contoh dinamis
).queue() # .queue() membuat aplikasi lebih responsif

# --- Menjalankan Aplikasi ---
if __name__ == "__main__":
    chatbot_ui.launch()