sama seperti sebelumnya
Browse files
app.py
CHANGED
@@ -6,7 +6,7 @@ import numpy as np # Import numpy jika belum ada
|
|
6 |
# --- 1. Inisialisasi Model dan Tokenizer (Dilakukan Sekali Saat Aplikasi Dimulai) ---
|
7 |
# Pastikan 'model_name' ini adalah model yang sudah kamu unggah ke Hugging Face Hub
|
8 |
# atau model publik lain yang ingin kamu gunakan.
|
9 |
-
model_name = "atsnetwork/my-custom-tinyllama-chatbot"
|
10 |
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
|
11 |
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
12 |
tokenizer.pad_token = tokenizer.eos_token # Pastikan token padding diatur
|
@@ -14,7 +14,7 @@ tokenizer.padding_side = "right" # Penting untuk efisiensi saat memproses sequen
|
|
14 |
|
15 |
# --- 2. Fungsi Pemroses Utama untuk Chatbot (Dipanggil Oleh Gradio) ---
|
16 |
# Fungsi ini mengintegrasikan logika inferensi dan analisis developer info
|
17 |
-
def generate_response_with_dev_info(prompt, max_new_tokens=100, temperature=0.
|
18 |
formatted_prompt = f"<s>[INST] {prompt} [/INST]"
|
19 |
inputs = tokenizer(formatted_prompt, return_tensors="pt").to(model.device)
|
20 |
|
@@ -44,24 +44,36 @@ def generate_response_with_dev_info(prompt, max_new_tokens=100, temperature=0.7,
|
|
44 |
else:
|
45 |
answer = generated_text.strip() # Fallback jika format tidak ditemukan
|
46 |
|
47 |
-
# --- Analisis Konfidensi Berbasis
|
48 |
-
|
49 |
total_generated_tokens = 0
|
50 |
if outputs.scores:
|
51 |
-
# Menghitung rata-rata probabilitas token tertinggi
|
52 |
for score_tensor in outputs.scores:
|
53 |
probabilities = torch.softmax(score_tensor, dim=-1)
|
54 |
-
|
55 |
-
|
|
|
|
|
56 |
total_generated_tokens += 1
|
57 |
|
58 |
if total_generated_tokens > 0:
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
|
66 |
# --- Analisis Frasa "Tidak Tahu" yang Dilatih ---
|
67 |
is_explicitly_unknown = False
|
@@ -82,7 +94,7 @@ def generate_response_with_dev_info(prompt, max_new_tokens=100, temperature=0.7,
|
|
82 |
|
83 |
# --- Gabungkan Informasi untuk Developer ---
|
84 |
developer_info = {
|
85 |
-
"confidence_score": f"{
|
86 |
"confidence_status": confidence_status,
|
87 |
"explicit_unknown_phrase_detected": is_explicitly_unknown,
|
88 |
"explicit_unknown_reason": explicit_unknown_reason if is_explicitly_unknown else "Tidak ada frasa 'tidak tahu' eksplisit.",
|
@@ -101,7 +113,7 @@ def gradio_interface_fn(prompt):
|
|
101 |
|
102 |
# Format developer info untuk ditampilkan di Gradio
|
103 |
dev_info_str = "--- Developer Info ---\n"
|
104 |
-
dev_info_str += f"Confidence Score: {dev_info['confidence_score']} ({dev_info['confidence_status']})\n"
|
105 |
dev_info_str += f"Explicit Unknown Phrase Detected: {dev_info['explicit_unknown_phrase_detected']}\n"
|
106 |
dev_info_str += f"Reason: {dev_info['explicit_unknown_reason']}\n"
|
107 |
# dev_info_str += f"Raw Generated Text: {dev_info['raw_generated_text']}\n"
|
|
|
6 |
# --- 1. Inisialisasi Model dan Tokenizer (Dilakukan Sekali Saat Aplikasi Dimulai) ---
|
7 |
# Pastikan 'model_name' ini adalah model yang sudah kamu unggah ke Hugging Face Hub
|
8 |
# atau model publik lain yang ingin kamu gunakan.
|
9 |
+
model_name = "atsnetwork/my-custom-tinyllama-chatbot"
|
10 |
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
|
11 |
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
12 |
tokenizer.pad_token = tokenizer.eos_token # Pastikan token padding diatur
|
|
|
14 |
|
15 |
# --- 2. Fungsi Pemroses Utama untuk Chatbot (Dipanggil Oleh Gradio) ---
|
16 |
# Fungsi ini mengintegrasikan logika inferensi dan analisis developer info
|
17 |
+
def generate_response_with_dev_info(prompt, max_new_tokens=100, temperature=0.6, top_k=30):
|
18 |
formatted_prompt = f"<s>[INST] {prompt} [/INST]"
|
19 |
inputs = tokenizer(formatted_prompt, return_tensors="pt").to(model.device)
|
20 |
|
|
|
44 |
else:
|
45 |
answer = generated_text.strip() # Fallback jika format tidak ditemukan
|
46 |
|
47 |
+
# --- Analisis Konfidensi Berbasis ENTROPY (PENGGANTI avg_max_prob) ---
|
48 |
+
avg_entropy = 0
|
49 |
total_generated_tokens = 0
|
50 |
if outputs.scores:
|
|
|
51 |
for score_tensor in outputs.scores:
|
52 |
probabilities = torch.softmax(score_tensor, dim=-1)
|
53 |
+
# Menghitung entropy untuk setiap distribusi probabilitas
|
54 |
+
epsilon = 1e-9 # Tambahkan sedikit epsilon untuk menghindari log(0)
|
55 |
+
entropy = -torch.sum(probabilities * torch.log(probabilities + epsilon), dim=-1).item()
|
56 |
+
avg_entropy += entropy
|
57 |
total_generated_tokens += 1
|
58 |
|
59 |
if total_generated_tokens > 0:
|
60 |
+
avg_entropy /= total_generated_tokens
|
61 |
+
else:
|
62 |
+
# Jika tidak ada token yang dihasilkan setelah prompt (kasus jarang)
|
63 |
+
avg_entropy = float('inf')
|
64 |
+
|
65 |
+
# Batas ambang keyakinan (contoh) untuk ENTROPY
|
66 |
+
# Penting: Nilai ini HARUS ditentukan setelah analisis empiris pada modelmu.
|
67 |
+
# Nilai entropy yang lebih RENDAH berarti model lebih YAKIN.
|
68 |
+
# Nilai entropy yang lebih TINGGI berarti model lebih TIDAK YAKIN.
|
69 |
+
# Sebagai titik awal, kamu bisa coba sekitar 1.0 atau lebih,
|
70 |
+
# tetapi validasi empiris sangat dianjurkan.
|
71 |
+
entropy_threshold = 1.0 # <--- SESUAIKAN NILAI INI BERDASARKAN ANALISISMU!
|
72 |
+
|
73 |
+
if avg_entropy > entropy_threshold: # <--- Perhatikan operatornya berubah (lebih besar = LOW_CONFIDENCE)
|
74 |
+
confidence_status = "LOW_CONFIDENCE: Model mungkin tidak memiliki pola yang jelas (Entropy Tinggi)."
|
75 |
+
else:
|
76 |
+
confidence_status = "HIGH_CONFIDENCE"
|
77 |
|
78 |
# --- Analisis Frasa "Tidak Tahu" yang Dilatih ---
|
79 |
is_explicitly_unknown = False
|
|
|
94 |
|
95 |
# --- Gabungkan Informasi untuk Developer ---
|
96 |
developer_info = {
|
97 |
+
"confidence_score": f"{avg_entropy:.4f}", # Sekarang ini adalah entropy
|
98 |
"confidence_status": confidence_status,
|
99 |
"explicit_unknown_phrase_detected": is_explicitly_unknown,
|
100 |
"explicit_unknown_reason": explicit_unknown_reason if is_explicitly_unknown else "Tidak ada frasa 'tidak tahu' eksplisit.",
|
|
|
113 |
|
114 |
# Format developer info untuk ditampilkan di Gradio
|
115 |
dev_info_str = "--- Developer Info ---\n"
|
116 |
+
dev_info_str += f"Confidence Score (Entropy): {dev_info['confidence_score']} ({dev_info['confidence_status']})\n"
|
117 |
dev_info_str += f"Explicit Unknown Phrase Detected: {dev_info['explicit_unknown_phrase_detected']}\n"
|
118 |
dev_info_str += f"Reason: {dev_info['explicit_unknown_reason']}\n"
|
119 |
# dev_info_str += f"Raw Generated Text: {dev_info['raw_generated_text']}\n"
|