Refactor data management by removing fallback data creation methods and simplifying error handling. Enhance UI model responses tab with improved filtering options and pagination for better user experience.
Browse files- data_manager.py +1 -58
- ui_model_responses.py +183 -3
data_manager.py
CHANGED
|
@@ -104,64 +104,7 @@ class DataManager:
|
|
| 104 |
# Buraya geldiysek, tüm denemeler başarısız oldu
|
| 105 |
logger.error(f"{self._max_retries} deneme sonrası veri kümesi yüklenemedi: {last_error}")
|
| 106 |
|
| 107 |
-
|
| 108 |
-
return self._create_fallback_data(data_type, path)
|
| 109 |
-
|
| 110 |
-
def _create_fallback_data(self, data_type: str, path: str) -> pd.DataFrame:
|
| 111 |
-
"""Veri türüne göre yedek veri oluştur."""
|
| 112 |
-
logger.info(f"{data_type} için yedek veri oluşturuluyor")
|
| 113 |
-
|
| 114 |
-
if "leaderboard" in path.lower() or data_type == "leaderboard":
|
| 115 |
-
return self._create_fallback_leaderboard()
|
| 116 |
-
elif "responses" in path.lower() or data_type == "responses":
|
| 117 |
-
return self._create_fallback_responses()
|
| 118 |
-
elif "section" in path.lower() or data_type == "section_results":
|
| 119 |
-
return self._create_fallback_section_results()
|
| 120 |
-
else:
|
| 121 |
-
return pd.DataFrame({"hata": ["Bilinmeyen veri türü"], "mesaj": [f"{path} yüklenemedi"]})
|
| 122 |
-
|
| 123 |
-
def _create_fallback_leaderboard(self) -> pd.DataFrame:
|
| 124 |
-
"""Kapsamlı yedek liderlik tablosu dataframe'i oluştur."""
|
| 125 |
-
logger.info("Yedek liderlik tablosu verisi oluşturuluyor")
|
| 126 |
-
return pd.DataFrame({
|
| 127 |
-
"model": ["GPT-4-Turbo", "Claude-3-Opus", "Gemini-Pro", "Llama-2-70B", "Mistral-7B"],
|
| 128 |
-
"family": ["OpenAI", "Anthropic", "Google", "Meta", "Mistral"],
|
| 129 |
-
"quantization_level": ["Yok", "Yok", "Yok", "float16", "int8"],
|
| 130 |
-
"score": [85.2, 83.7, 81.4, 78.9, 75.3],
|
| 131 |
-
"timestamp": [pd.Timestamp.now()] * 5,
|
| 132 |
-
"parameters": ["1.76T", "Bilinmiyor", "Bilinmiyor", "70B", "7B"],
|
| 133 |
-
"license": ["Mülkiyet", "Mülkiyet", "Mülkiyet", "Özel", "Apache 2.0"]
|
| 134 |
-
})
|
| 135 |
-
|
| 136 |
-
def _create_fallback_responses(self) -> pd.DataFrame:
|
| 137 |
-
"""Kapsamlı yedek cevaplar dataframe'i oluştur."""
|
| 138 |
-
logger.info("Yedek cevaplar verisi oluşturuluyor")
|
| 139 |
-
return pd.DataFrame({
|
| 140 |
-
"bolum": ["Matematik", "Tarih", "Coğrafya", "Edebiyat", "Fen"],
|
| 141 |
-
"soru": [
|
| 142 |
-
"2 + 2 kaçtır?",
|
| 143 |
-
"Osmanlı İmparatorluğu ne zaman kuruldu?",
|
| 144 |
-
"Türkiye'nin başkenti neresidir?",
|
| 145 |
-
"Yunus Emre hangi dönemde yaşamıştır?",
|
| 146 |
-
"Suyun kimyasal formülü nedir?"
|
| 147 |
-
],
|
| 148 |
-
"cevap": ["4", "1299", "Ankara", "13-14. yüzyıl", "H2O"],
|
| 149 |
-
"GPT-4-Turbo_cevap": ["4", "1299", "Ankara", "13-14. yüzyıl", "H2O"],
|
| 150 |
-
"Claude-3-Opus_cevap": ["4", "1299 civarı", "Ankara", "13-14. yüzyıl", "H2O"],
|
| 151 |
-
"Gemini-Pro_cevap": ["4", "1299", "Ankara", "13. ve 14. yüzyıl", "H2O"]
|
| 152 |
-
})
|
| 153 |
-
|
| 154 |
-
def _create_fallback_section_results(self) -> pd.DataFrame:
|
| 155 |
-
"""Kapsamlı yedek bölüm sonuçları dataframe'i oluştur."""
|
| 156 |
-
logger.info("Yedek bölüm sonuçları verisi oluşturuluyor")
|
| 157 |
-
return pd.DataFrame({
|
| 158 |
-
"section": ["Matematik", "Tarih", "Coğrafya", "Edebiyat", "Fen", "Felsefe", "Sosyoloji"],
|
| 159 |
-
"GPT-4-Turbo": [88.5, 85.2, 82.7, 89.1, 86.3, 83.8, 81.4],
|
| 160 |
-
"Claude-3-Opus": [86.2, 87.1, 80.5, 88.7, 84.9, 85.2, 82.1],
|
| 161 |
-
"Gemini-Pro": [84.7, 83.6, 81.2, 86.4, 85.1, 82.3, 80.8],
|
| 162 |
-
"Llama-2-70B": [82.1, 80.4, 78.9, 83.2, 81.7, 79.6, 77.3],
|
| 163 |
-
"Mistral-7B": [79.3, 77.8, 76.2, 80.1, 78.5, 76.9, 74.6]
|
| 164 |
-
})
|
| 165 |
|
| 166 |
def refresh_datasets(self) -> None:
|
| 167 |
"""Thread güvenliği ile tüm veri kümelerini kaynaktan yenile."""
|
|
|
|
| 104 |
# Buraya geldiysek, tüm denemeler başarısız oldu
|
| 105 |
logger.error(f"{self._max_retries} deneme sonrası veri kümesi yüklenemedi: {last_error}")
|
| 106 |
|
| 107 |
+
return pd.DataFrame()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
|
| 109 |
def refresh_datasets(self) -> None:
|
| 110 |
"""Thread güvenliği ile tüm veri kümelerini kaynaktan yenile."""
|
ui_model_responses.py
CHANGED
|
@@ -3,7 +3,187 @@ import pandas as pd
|
|
| 3 |
|
| 4 |
|
| 5 |
def add_model_responses_tab(block, data_manager, available_models):
|
| 6 |
-
with gr.Tab("
|
| 7 |
gr.Markdown("### Model Cevaplarını Göz At")
|
| 8 |
-
gr.Markdown("**6.200 soruyu ve model cevaplarını
|
| 9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
|
| 5 |
def add_model_responses_tab(block, data_manager, available_models):
|
| 6 |
+
with gr.Tab("Model Cevapları"):
|
| 7 |
gr.Markdown("### Model Cevaplarını Göz At")
|
| 8 |
+
gr.Markdown("**6.200 soruyu ve model cevaplarını model ve kategoriye göre filtreleyin.**")
|
| 9 |
+
|
| 10 |
+
# Prepare category choices from actual data
|
| 11 |
+
categories = ["Tümü"]
|
| 12 |
+
if not data_manager.responses_data.empty:
|
| 13 |
+
# Check what category column actually exists
|
| 14 |
+
category_col = None
|
| 15 |
+
for col in data_manager.responses_data.columns:
|
| 16 |
+
if 'kategori' in col.lower() or 'category' in col.lower() or 'bolum' in col.lower():
|
| 17 |
+
category_col = col
|
| 18 |
+
break
|
| 19 |
+
|
| 20 |
+
if category_col:
|
| 21 |
+
categories += sorted(data_manager.responses_data[category_col].dropna().unique().tolist())
|
| 22 |
+
|
| 23 |
+
with gr.Row():
|
| 24 |
+
model_filter = gr.Dropdown(
|
| 25 |
+
choices=["Tümü"] + available_models,
|
| 26 |
+
label="Model Filtresi",
|
| 27 |
+
value="Tümü"
|
| 28 |
+
)
|
| 29 |
+
category_filter = gr.Dropdown(
|
| 30 |
+
choices=categories,
|
| 31 |
+
label="Kategori Filtresi",
|
| 32 |
+
value="Tümü"
|
| 33 |
+
)
|
| 34 |
+
filter_btn = gr.Button("Filtrele", variant="primary")
|
| 35 |
+
clear_btn = gr.Button("Temizle")
|
| 36 |
+
|
| 37 |
+
with gr.Row():
|
| 38 |
+
page_size = gr.Slider(
|
| 39 |
+
minimum=10,
|
| 40 |
+
maximum=100,
|
| 41 |
+
value=20,
|
| 42 |
+
step=10,
|
| 43 |
+
label="Sayfa Başına Gösterim"
|
| 44 |
+
)
|
| 45 |
+
page_info = gr.HTML(value="<div style='text-align: center; padding: 10px;'>Sayfa 1</div>")
|
| 46 |
+
|
| 47 |
+
responses_table = gr.DataFrame(
|
| 48 |
+
headers=["Soru", "Doğru Cevap", "Model Cevabı", "Kategori"],
|
| 49 |
+
datatype=["str", "str", "str", "str"],
|
| 50 |
+
col_count=(4, "fixed"),
|
| 51 |
+
interactive=False,
|
| 52 |
+
wrap=True
|
| 53 |
+
)
|
| 54 |
+
|
| 55 |
+
with gr.Row():
|
| 56 |
+
prev_btn = gr.Button("← Önceki", variant="secondary")
|
| 57 |
+
next_btn = gr.Button("Sonraki →", variant="secondary")
|
| 58 |
+
|
| 59 |
+
# State variables
|
| 60 |
+
current_page = gr.State(1)
|
| 61 |
+
|
| 62 |
+
def filter_responses(model, category, page_size_val, page):
|
| 63 |
+
try:
|
| 64 |
+
df = data_manager.responses_data.copy()
|
| 65 |
+
if df.empty:
|
| 66 |
+
return pd.DataFrame(), 1, "<div style='text-align: center; padding: 10px;'>Veri bulunamadı</div>"
|
| 67 |
+
|
| 68 |
+
# Find the actual column names in the dataset
|
| 69 |
+
question_col = None
|
| 70 |
+
answer_col = None
|
| 71 |
+
category_col = None
|
| 72 |
+
|
| 73 |
+
# Look for question column
|
| 74 |
+
for col in df.columns:
|
| 75 |
+
if 'soru' in col.lower() or 'question' in col.lower():
|
| 76 |
+
question_col = col
|
| 77 |
+
break
|
| 78 |
+
|
| 79 |
+
# Look for answer column
|
| 80 |
+
for col in df.columns:
|
| 81 |
+
if 'cevap' in col.lower() and not col.endswith('_cevap'):
|
| 82 |
+
answer_col = col
|
| 83 |
+
break
|
| 84 |
+
|
| 85 |
+
# Look for category column
|
| 86 |
+
for col in df.columns:
|
| 87 |
+
if 'kategori' in col.lower() or 'category' in col.lower() or 'bolum' in col.lower():
|
| 88 |
+
category_col = col
|
| 89 |
+
break
|
| 90 |
+
|
| 91 |
+
# If we can't find required columns, return empty
|
| 92 |
+
if not question_col or not answer_col:
|
| 93 |
+
return pd.DataFrame(), 1, "<div style='text-align: center; padding: 10px;'>Gerekli sütunlar bulunamadı</div>"
|
| 94 |
+
|
| 95 |
+
# Filter by model
|
| 96 |
+
if model and model != "Tümü":
|
| 97 |
+
model_col = f"{model}_cevap"
|
| 98 |
+
if model_col in df.columns:
|
| 99 |
+
df = df[df[model_col].notna()]
|
| 100 |
+
|
| 101 |
+
# Filter by category
|
| 102 |
+
if category and category != "Tümü" and category_col:
|
| 103 |
+
df = df[df[category_col] == category]
|
| 104 |
+
|
| 105 |
+
# Prepare display data
|
| 106 |
+
display_cols = [question_col, answer_col]
|
| 107 |
+
if category_col:
|
| 108 |
+
display_cols.append(category_col)
|
| 109 |
+
|
| 110 |
+
if model and model != "Tümü":
|
| 111 |
+
model_col = f"{model}_cevap"
|
| 112 |
+
if model_col in df.columns:
|
| 113 |
+
display_cols.append(model_col)
|
| 114 |
+
df_display = df[display_cols].copy()
|
| 115 |
+
df_display.columns = ['Soru', 'Doğru Cevap', 'Kategori', 'Model Cevabı'] if category_col else ['Soru', 'Doğru Cevap', 'Model Cevabı']
|
| 116 |
+
else:
|
| 117 |
+
df_display = df[display_cols].copy()
|
| 118 |
+
df_display['Model Cevabı'] = 'Cevap yok'
|
| 119 |
+
df_display.columns = ['Soru', 'Doğru Cevap', 'Kategori', 'Model Cevabı'] if category_col else ['Soru', 'Doğru Cevap', 'Model Cevabı']
|
| 120 |
+
else:
|
| 121 |
+
# Show first available model response
|
| 122 |
+
model_cols = [col for col in df.columns if col.endswith('_cevap')]
|
| 123 |
+
if model_cols:
|
| 124 |
+
display_cols.append(model_cols[0])
|
| 125 |
+
df_display = df[display_cols].copy()
|
| 126 |
+
df_display.columns = ['Soru', 'Doğru Cevap', 'Kategori', 'Model Cevabı'] if category_col else ['Soru', 'Doğru Cevap', 'Model Cevabı']
|
| 127 |
+
else:
|
| 128 |
+
df_display = df[display_cols].copy()
|
| 129 |
+
df_display['Model Cevabı'] = 'Cevap yok'
|
| 130 |
+
df_display.columns = ['Soru', 'Doğru Cevap', 'Kategori', 'Model Cevabı'] if category_col else ['Soru', 'Doğru Cevap', 'Model Cevabı']
|
| 131 |
+
|
| 132 |
+
# Pagination
|
| 133 |
+
total_rows = len(df_display)
|
| 134 |
+
total_pages = (total_rows + page_size_val - 1) // page_size_val
|
| 135 |
+
page = max(1, min(page, total_pages))
|
| 136 |
+
start_idx = (page - 1) * page_size_val
|
| 137 |
+
end_idx = start_idx + page_size_val
|
| 138 |
+
page_data = df_display.iloc[start_idx:end_idx]
|
| 139 |
+
page_info_text = f"<div style='text-align: center; padding: 10px;'>Sayfa {page}/{total_pages} ({total_rows} sonuç)</div>"
|
| 140 |
+
return page_data, page, page_info_text
|
| 141 |
+
|
| 142 |
+
except Exception as e:
|
| 143 |
+
print(f"Filter error: {e}")
|
| 144 |
+
return pd.DataFrame(), 1, "<div style='text-align: center; padding: 10px;'>Filtreleme hatası</div>"
|
| 145 |
+
|
| 146 |
+
def next_page(current_page_val):
|
| 147 |
+
return current_page_val + 1
|
| 148 |
+
|
| 149 |
+
def prev_page(current_page_val):
|
| 150 |
+
return max(1, current_page_val - 1)
|
| 151 |
+
|
| 152 |
+
def clear_filters():
|
| 153 |
+
return "Tümü", "Tümü", 1
|
| 154 |
+
|
| 155 |
+
# Event handlers
|
| 156 |
+
filter_btn.click(
|
| 157 |
+
filter_responses,
|
| 158 |
+
inputs=[model_filter, category_filter, page_size, current_page],
|
| 159 |
+
outputs=[responses_table, current_page, page_info]
|
| 160 |
+
)
|
| 161 |
+
|
| 162 |
+
next_btn.click(
|
| 163 |
+
next_page,
|
| 164 |
+
inputs=[current_page],
|
| 165 |
+
outputs=[current_page]
|
| 166 |
+
).then(
|
| 167 |
+
filter_responses,
|
| 168 |
+
inputs=[model_filter, category_filter, page_size, current_page],
|
| 169 |
+
outputs=[responses_table, current_page, page_info]
|
| 170 |
+
)
|
| 171 |
+
|
| 172 |
+
prev_btn.click(
|
| 173 |
+
prev_page,
|
| 174 |
+
inputs=[current_page],
|
| 175 |
+
outputs=[current_page]
|
| 176 |
+
).then(
|
| 177 |
+
filter_responses,
|
| 178 |
+
inputs=[model_filter, category_filter, page_size, current_page],
|
| 179 |
+
outputs=[responses_table, current_page, page_info]
|
| 180 |
+
)
|
| 181 |
+
|
| 182 |
+
clear_btn.click(
|
| 183 |
+
clear_filters,
|
| 184 |
+
outputs=[model_filter, category_filter, current_page]
|
| 185 |
+
).then(
|
| 186 |
+
filter_responses,
|
| 187 |
+
inputs=[model_filter, category_filter, page_size, current_page],
|
| 188 |
+
outputs=[responses_table, current_page, page_info]
|
| 189 |
+
)
|