Spaces:
Running
Running
Refactor build_leadearboard_df function to integrate data conversion from Small Shlepa format to DeathMath; enhance error handling and logging for model data processing
Browse files
src/leaderboard/build_leaderboard.py
CHANGED
@@ -140,26 +140,25 @@ def build_leadearboard_df():
|
|
140 |
with open(os.path.join(external_dir, file), "r", encoding="utf-8") as f:
|
141 |
data = json.load(f)
|
142 |
|
143 |
-
#
|
144 |
-
|
145 |
-
if not model_name:
|
146 |
-
logging.error(f"Failed to parse {file}: 'model_name' not found")
|
147 |
-
continue
|
148 |
|
149 |
-
|
150 |
-
|
151 |
-
|
|
|
152 |
continue
|
153 |
|
154 |
# Стандартизируем данные
|
155 |
model_data = {
|
156 |
"model": model_name,
|
157 |
-
"score": float(score),
|
158 |
-
"math_score": float(
|
159 |
-
"physics_score": float(
|
160 |
-
"total_tokens": int(
|
161 |
-
"evaluation_time": float(
|
162 |
-
"system_prompt":
|
|
|
163 |
}
|
164 |
|
165 |
# Определяем, является ли это лучшим результатом для данной модели
|
@@ -213,3 +212,81 @@ def build_leadearboard_df():
|
|
213 |
df[numeric_cols] = df[numeric_cols].round(3)
|
214 |
|
215 |
return df
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
with open(os.path.join(external_dir, file), "r", encoding="utf-8") as f:
|
141 |
data = json.load(f)
|
142 |
|
143 |
+
# Конвертируем данные из любого формата в формат DeathMath
|
144 |
+
converted_data = convert_old_format_to_deatmath(data)
|
|
|
|
|
|
|
145 |
|
146 |
+
# Проверяем наличие необходимых полей после конвертации
|
147 |
+
model_name = converted_data.get("model_name", converted_data.get("model", ""))
|
148 |
+
if not model_name:
|
149 |
+
logging.error(f"Failed to parse {file}: 'model_name' not found after conversion")
|
150 |
continue
|
151 |
|
152 |
# Стандартизируем данные
|
153 |
model_data = {
|
154 |
"model": model_name,
|
155 |
+
"score": float(converted_data.get("score", 0.0)),
|
156 |
+
"math_score": float(converted_data.get("math_score", 0.0)),
|
157 |
+
"physics_score": float(converted_data.get("physics_score", 0.0)),
|
158 |
+
"total_tokens": int(converted_data.get("total_tokens", 0)),
|
159 |
+
"evaluation_time": float(converted_data.get("evaluation_time", 0.0)),
|
160 |
+
"system_prompt": converted_data.get("system_prompt",
|
161 |
+
"Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
|
162 |
}
|
163 |
|
164 |
# Определяем, является ли это лучшим результатом для данной модели
|
|
|
212 |
df[numeric_cols] = df[numeric_cols].round(3)
|
213 |
|
214 |
return df
|
215 |
+
|
216 |
+
|
217 |
+
def convert_old_format_to_deatmath(data):
|
218 |
+
"""
|
219 |
+
Конвертирует данные из старого формата Small Shlepa в формат DeathMath
|
220 |
+
|
221 |
+
Args:
|
222 |
+
data (dict): Данные модели в старом формате
|
223 |
+
|
224 |
+
Returns:
|
225 |
+
dict: Конвертированные данные в формате DeathMath
|
226 |
+
"""
|
227 |
+
# Проверяем, возможно это файл уже в формате DeathMath
|
228 |
+
if "score" in data:
|
229 |
+
return data
|
230 |
+
|
231 |
+
# Проверяем формат Small Shlepa с полями: musicmc, moviesmc, booksmc, lawmc, mmluproru
|
232 |
+
small_shlepa_fields = ["musicmc", "moviesmc", "booksmc", "lawmc", "mmluproru", "model"]
|
233 |
+
is_shlepa_format = any(field in data for field in small_shlepa_fields)
|
234 |
+
|
235 |
+
if is_shlepa_format:
|
236 |
+
logging.info(f"Конвертация модели из формата Small Shlepa в формат DeathMath: {data.get('model', 'Unknown')}")
|
237 |
+
|
238 |
+
# Конвертируем данные с примерным соответствием:
|
239 |
+
# math_score = среднее(musicmc, booksmc, mmluproru)
|
240 |
+
# physics_score = lawmc или moviesmc
|
241 |
+
math_score = 0.0
|
242 |
+
math_components = 0
|
243 |
+
|
244 |
+
if "musicmc" in data and data["musicmc"] is not None:
|
245 |
+
math_score += float(data["musicmc"])
|
246 |
+
math_components += 1
|
247 |
+
|
248 |
+
if "booksmc" in data and data["booksmc"] is not None:
|
249 |
+
math_score += float(data["booksmc"])
|
250 |
+
math_components += 1
|
251 |
+
|
252 |
+
if "mmluproru" in data and data["mmluproru"] is not None:
|
253 |
+
math_score += float(data["mmluproru"])
|
254 |
+
math_components += 1
|
255 |
+
|
256 |
+
if math_components > 0:
|
257 |
+
math_score /= math_components
|
258 |
+
|
259 |
+
# Для physics_score используем значение lawmc или moviesmc (что доступно)
|
260 |
+
physics_score = 0.0
|
261 |
+
if "lawmc" in data and data["lawmc"] is not None:
|
262 |
+
physics_score = float(data["lawmc"])
|
263 |
+
elif "moviesmc" in data and data["moviesmc"] is not None:
|
264 |
+
physics_score = float(data["moviesmc"])
|
265 |
+
|
266 |
+
# Общий скор - среднее арифметическое
|
267 |
+
avg_score = (math_score + physics_score) / 2 if math_score or physics_score else 0.0
|
268 |
+
|
269 |
+
converted_data = {
|
270 |
+
"model_name": data.get("model", "Unknown"),
|
271 |
+
"score": avg_score,
|
272 |
+
"math_score": math_score,
|
273 |
+
"physics_score": physics_score,
|
274 |
+
"total_tokens": int(data.get("total_tokens", 0)),
|
275 |
+
"evaluation_time": float(data.get("evaluation_time", 0.0)),
|
276 |
+
"system_prompt": data.get("system_prompt",
|
277 |
+
"Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
|
278 |
+
}
|
279 |
+
|
280 |
+
return converted_data
|
281 |
+
|
282 |
+
# Если формат неизвестен, возвращаем стандартный шаблон
|
283 |
+
logging.warning(f"Неизвестный формат данных модели, использую шаблон")
|
284 |
+
return {
|
285 |
+
"model_name": data.get("model_name", data.get("model", "Unknown")),
|
286 |
+
"score": 0.0,
|
287 |
+
"math_score": 0.0,
|
288 |
+
"physics_score": 0.0,
|
289 |
+
"total_tokens": 0,
|
290 |
+
"evaluation_time": 0.0,
|
291 |
+
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
292 |
+
}
|