Spaces:
Running
Running
Update code base and add ruff format
Browse files- README.md +2 -17
- app.py +92 -95
- generate_initial_leaderboard.py +70 -65
- leaderboard.json +9 -36
- pyproject.toml +2 -2
- temp_leaderboard/model_data/external/Claude_3.5_Sonnet.json +0 -9
- temp_leaderboard/model_data/external/Claude_3.7_Sonnet.json +0 -9
- temp_leaderboard/model_data/external/DeepSeek_V3_0324.json +0 -9
- temp_leaderboard/model_data/external/Gemini_2.0_Flash.json +0 -9
- temp_leaderboard/model_data/external/Gemini_2.5_Pro_Preview.json +0 -9
- temp_leaderboard/model_data/external/Gemma_3_12B.json +0 -9
- temp_leaderboard/model_data/external/Gemma_3_27B.json +0 -9
- temp_leaderboard/model_data/external/Gemma_3_4B.json +0 -9
- temp_leaderboard/model_data/external/GigaChat-2-Max.json +0 -9
- temp_leaderboard/model_data/external/GigaChat-2-Pro.json +0 -9
- temp_leaderboard/model_data/external/GigaChat-2.json +0 -9
- temp_leaderboard/model_data/external/GigaChat-Max.json +0 -9
- temp_leaderboard/model_data/external/Qwen2.5_72B_Instruct.json +0 -9
- temp_leaderboard/model_data/external/gpt-4.1.json +0 -9
- temp_leaderboard/model_data/external/gpt-4o.json +0 -9
- temp_leaderboard/model_data/external/o3-mini-high.json +0 -9
- temp_leaderboard/model_data/external/o4-mini-high.json +0 -9
README.md
CHANGED
@@ -1,25 +1,14 @@
|
|
1 |
-
---
|
2 |
-
title: DeathMath Leaderboard
|
3 |
-
emoji: 🔢
|
4 |
-
colorFrom: indigo
|
5 |
-
colorTo: purple
|
6 |
-
sdk: gradio
|
7 |
-
sdk_version: "4.20.0"
|
8 |
-
app_file: app.py
|
9 |
-
pinned: false
|
10 |
-
hf_oauth: true
|
11 |
-
---
|
12 |
-
app_file: app.py
|
13 |
# DeathMath Leaderboard
|
14 |
|
15 |
DeathMath - это бенчмарк для оценки способности моделей решать сложные математические и физические задачи на русском языке.
|
16 |
|
17 |
## Текущий лидерборд
|
18 |
|
19 |
-
Последнее обновление: 2025-04-20
|
20 |
|
21 |
| Модель | Общий балл | Математика | Физика | Токены | Время оценки |
|
22 |
|--------|------------|------------|---------|---------|--------------|
|
|
|
23 |
| o3-mini-high | 0.601 | 0.847 | 0.355 | 2,455,126 | 4015.4s |
|
24 |
| o4-mini-high | 0.591 | 0.863 | 0.318 | 1,898,964 | 4623.6s |
|
25 |
| Gemini 2.5 Pro Preview | 0.586 | 0.800 | 0.373 | 1,394,299 | 4533.2s |
|
@@ -31,12 +20,8 @@ DeathMath - это бенчмарк для оценки способности
|
|
31 |
| Gemma 3 12B | 0.298 | 0.442 | 0.155 | 441,055 | 3916.3s |
|
32 |
| Qwen2.5 72B Instruct | 0.278 | 0.384 | 0.173 | 366,729 | 2460.1s |
|
33 |
| gpt-4o | 0.262 | 0.405 | 0.118 | 468,809 | 1078.4s |
|
34 |
-
| GigaChat-2-Max | 0.250 | 0.326 | 0.173 | 220,487 | 1006.2s |
|
35 |
-
| GigaChat-2-Pro | 0.209 | 0.326 | 0.091 | 212,196 | 1002.6s |
|
36 |
-
| GigaChat-Max | 0.139 | 0.179 | 0.100 | 201,090 | 978.8s |
|
37 |
| DeepSeek V3 0324 | 0.132 | 0.174 | 0.091 | 359,162 | 4257.7s |
|
38 |
| Gemma 3 4B | 0.124 | 0.221 | 0.027 | 572,095 | 1682.7s |
|
39 |
-
| GigaChat-2 | 0.094 | 0.142 | 0.045 | 299,747 | 834.7s |
|
40 |
|
41 |
## Как принять участие в бенчмарке
|
42 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
# DeathMath Leaderboard
|
2 |
|
3 |
DeathMath - это бенчмарк для оценки способности моделей решать сложные математические и физические задачи на русском языке.
|
4 |
|
5 |
## Текущий лидерборд
|
6 |
|
7 |
+
Последнее обновление: 2025-04-20 20:46:25
|
8 |
|
9 |
| Модель | Общий балл | Математика | Физика | Токены | Время оценки |
|
10 |
|--------|------------|------------|---------|---------|--------------|
|
11 |
+
| o3 | 0.621 | 0.868 | 0.373 | 1,251,746 | 4609.1s |
|
12 |
| o3-mini-high | 0.601 | 0.847 | 0.355 | 2,455,126 | 4015.4s |
|
13 |
| o4-mini-high | 0.591 | 0.863 | 0.318 | 1,898,964 | 4623.6s |
|
14 |
| Gemini 2.5 Pro Preview | 0.586 | 0.800 | 0.373 | 1,394,299 | 4533.2s |
|
|
|
20 |
| Gemma 3 12B | 0.298 | 0.442 | 0.155 | 441,055 | 3916.3s |
|
21 |
| Qwen2.5 72B Instruct | 0.278 | 0.384 | 0.173 | 366,729 | 2460.1s |
|
22 |
| gpt-4o | 0.262 | 0.405 | 0.118 | 468,809 | 1078.4s |
|
|
|
|
|
|
|
23 |
| DeepSeek V3 0324 | 0.132 | 0.174 | 0.091 | 359,162 | 4257.7s |
|
24 |
| Gemma 3 4B | 0.124 | 0.221 | 0.027 | 572,095 | 1682.7s |
|
|
|
25 |
|
26 |
## Как принять участие в бенчмарке
|
27 |
|
app.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1 |
import logging
|
2 |
import os
|
|
|
3 |
os.makedirs("tmp", exist_ok=True)
|
4 |
-
os.environ[
|
5 |
import subprocess
|
6 |
import shutil
|
7 |
import glob
|
@@ -14,6 +15,7 @@ from gradio_space_ci import enable_space_ci
|
|
14 |
import json
|
15 |
from io import BytesIO
|
16 |
|
|
|
17 |
def handle_file_upload(file):
|
18 |
file_path = file.name.split("/")[-1] if "/" in file.name else file.name
|
19 |
logging.info("File uploaded: %s", file_path)
|
@@ -21,29 +23,30 @@ def handle_file_upload(file):
|
|
21 |
v = json.load(f)
|
22 |
return v, file_path
|
23 |
|
|
|
24 |
def submit_file(v, file_path, mn, profile: gr.OAuthProfile | None):
|
25 |
"""
|
26 |
Обрабатывает загрузку файлов с результатами пользовательских моделей
|
27 |
-
|
28 |
Args:
|
29 |
v: Загруженные данные результатов из JSON
|
30 |
file_path: Путь к загруженному файлу
|
31 |
mn: Имя модели, указанное пользователем
|
32 |
profile: Профиль пользователя HuggingFace
|
33 |
-
|
34 |
Returns:
|
35 |
str: Сообщение об успехе или ошибке
|
36 |
"""
|
37 |
if profile is None:
|
38 |
return "Hub Login Required: Войдите в HuggingFace, чтобы загрузить результаты"
|
39 |
-
|
40 |
try:
|
41 |
# Проверяем наличие обязательных полей
|
42 |
required_fields = ["score", "math_score", "physics_score"]
|
43 |
for field in required_fields:
|
44 |
if field not in v:
|
45 |
return f"Error: Отсутствует обязательное поле '{field}' в JSON файле"
|
46 |
-
|
47 |
# Создаем новый объект для сохранения в базе данных
|
48 |
new_file = {
|
49 |
"model_name": profile.username + "/" + mn,
|
@@ -52,22 +55,24 @@ def submit_file(v, file_path, mn, profile: gr.OAuthProfile | None):
|
|
52 |
"physics_score": float(v["physics_score"]),
|
53 |
"total_tokens": int(v.get("total_tokens", 0)),
|
54 |
"evaluation_time": float(v.get("evaluation_time", 0.0)),
|
55 |
-
"system_prompt": v.get(
|
|
|
|
|
56 |
}
|
57 |
-
|
58 |
# Проверка значений на корректность
|
59 |
-
if not (
|
60 |
-
|
61 |
-
|
62 |
return "Error: Все значения оценок должны быть в диапазоне от 0 до 1"
|
63 |
-
|
64 |
# Создаем уникальное имя файла на основе username и имени модели
|
65 |
safe_filename = profile.username + "_" + mn.replace("/", "_").replace(" ", "_") + ".json"
|
66 |
-
|
67 |
# Создаем JSON в памяти и загружаем его в репозиторий
|
68 |
buf = BytesIO()
|
69 |
-
buf.write(json.dumps(new_file, ensure_ascii=False).encode(
|
70 |
-
|
71 |
# Загружаем файл в репозиторий
|
72 |
API.upload_file(
|
73 |
path_or_fileobj=buf,
|
@@ -75,24 +80,21 @@ def submit_file(v, file_path, mn, profile: gr.OAuthProfile | None):
|
|
75 |
repo_id="Vikhrmodels/DeathMath-leaderboard-data",
|
76 |
repo_type="dataset",
|
77 |
)
|
78 |
-
|
79 |
# Устанавливаем флаг для обновления лидерборда
|
80 |
os.environ[RESET_JUDGEMENT_ENV] = "1"
|
81 |
-
|
82 |
# Логируем успешную загрузку
|
83 |
logging.info(f"Successfully uploaded model results: {new_file['model_name']}")
|
84 |
-
|
85 |
return f"Success! Результаты модели '{mn}' успешно отправлены в лидерборд DeathMath."
|
86 |
-
|
87 |
except Exception as e:
|
88 |
logging.error(f"Error submitting file: {e}")
|
89 |
return f"Error: Произошла ошибка при отправке файла: {str(e)}"
|
90 |
|
91 |
-
|
92 |
-
|
93 |
-
TITLE,
|
94 |
-
LLM_BENCHMARKS_TEXT
|
95 |
-
)
|
96 |
from src.display.css_html_js import custom_css
|
97 |
from src.display.utils import (
|
98 |
AutoEvalColumn,
|
@@ -113,33 +115,36 @@ enable_space_ci()
|
|
113 |
|
114 |
# download_openbench()
|
115 |
|
|
|
116 |
def restart_space():
|
117 |
API.restart_space(repo_id=REPO_ID)
|
118 |
download_openbench()
|
119 |
|
|
|
120 |
def update_plot(selected_models):
|
121 |
return create_plot(selected_models)
|
122 |
|
|
|
123 |
def build_demo():
|
124 |
"""
|
125 |
Строит интерфейс лидерборда DeathMath
|
126 |
"""
|
127 |
# Загружаем данные для лидерборда
|
128 |
download_openbench()
|
129 |
-
|
130 |
# Создаем интерфейс с настройками темы
|
131 |
demo = gr.Blocks(
|
132 |
-
title="DeathMath Leaderboard",
|
133 |
css=custom_css,
|
134 |
theme=gr.themes.Default(
|
135 |
primary_hue="indigo",
|
136 |
secondary_hue="purple",
|
137 |
-
)
|
138 |
)
|
139 |
-
|
140 |
# Получаем данные для лидерборда
|
141 |
leaderboard_df = build_leadearboard_df()
|
142 |
-
|
143 |
# Строим интерфейс
|
144 |
with demo:
|
145 |
# Заголовок и введение
|
@@ -151,7 +156,7 @@ def build_demo():
|
|
151 |
# Вкладка лидерборда
|
152 |
with gr.TabItem("🏅 Лидерборд", elem_id="llm-benchmark-tab-table", id=0):
|
153 |
gr.Markdown("### Таблица результатов моделей DeathMath")
|
154 |
-
|
155 |
# Таблица с результатами
|
156 |
Leaderboard(
|
157 |
value=leaderboard_df,
|
@@ -170,33 +175,25 @@ def build_demo():
|
|
170 |
with gr.TabItem("🚀 Отправить результаты", elem_id="submit-tab", id=1):
|
171 |
with gr.Row():
|
172 |
gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
|
173 |
-
|
174 |
with gr.Column():
|
175 |
model_name_textbox = gr.Textbox(label="Название модели")
|
176 |
file_output = gr.File(label="Перетащите JSON файл с результатами сюда", type="filepath")
|
177 |
uploaded_file = gr.State()
|
178 |
file_path = gr.State()
|
179 |
-
|
180 |
with gr.Row():
|
181 |
with gr.Column():
|
182 |
out = gr.Textbox("Здесь будет показан статус отправки")
|
183 |
with gr.Column():
|
184 |
login_button = gr.LoginButton(elem_id="oauth-button")
|
185 |
-
|
186 |
-
submit_button = gr.Button("Отправить результаты", elem_id="submit_button", variant=
|
187 |
-
|
188 |
# Обработчики событий
|
189 |
-
file_output.upload(
|
190 |
-
handle_file_upload,
|
191 |
-
file_output,
|
192 |
-
[uploaded_file, file_path]
|
193 |
-
)
|
194 |
|
195 |
-
submit_button.click(
|
196 |
-
submit_file,
|
197 |
-
[uploaded_file, file_path, model_name_textbox],
|
198 |
-
[out]
|
199 |
-
)
|
200 |
|
201 |
# Вкладка с аналитикой
|
202 |
with gr.TabItem("📊 Аналитика", elem_id="analytics-tab", id=2):
|
@@ -205,9 +202,11 @@ def build_demo():
|
|
205 |
model_dropdown = gr.Dropdown(
|
206 |
choices=leaderboard_df["model"].tolist(),
|
207 |
label="Модели",
|
208 |
-
value=leaderboard_df["model"].tolist()[:5]
|
|
|
|
|
209 |
multiselect=True,
|
210 |
-
info="Выберите модели для сравнения"
|
211 |
)
|
212 |
else:
|
213 |
model_dropdown = gr.Dropdown(
|
@@ -215,31 +214,24 @@ def build_demo():
|
|
215 |
label="Модели",
|
216 |
value=["example/model-1", "example/model-2"],
|
217 |
multiselect=True,
|
218 |
-
info="Выберите модели для сравнения"
|
219 |
)
|
220 |
-
|
221 |
# Вкладки для разных типов визуализации
|
222 |
with gr.Tabs():
|
223 |
with gr.TabItem("Столбчатая диаграмма"):
|
224 |
bar_plot = gr.Plot(create_plot(model_dropdown.value))
|
225 |
-
|
226 |
with gr.TabItem("Радарная диаграмма"):
|
227 |
from src.radial.radial import create_radar_plot
|
|
|
228 |
radar_plot = gr.Plot(create_radar_plot(model_dropdown.value))
|
229 |
-
|
230 |
# Обновление графиков при изменении выбранных моделей
|
231 |
-
model_dropdown.change(
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
)
|
236 |
-
|
237 |
-
model_dropdown.change(
|
238 |
-
fn=create_radar_plot,
|
239 |
-
inputs=[model_dropdown],
|
240 |
-
outputs=[radar_plot]
|
241 |
-
)
|
242 |
-
|
243 |
return demo
|
244 |
|
245 |
|
@@ -252,58 +244,62 @@ def update_board():
|
|
252 |
logging.info("Updating the leaderboard: %s", need_reset)
|
253 |
if need_reset != "1":
|
254 |
return
|
255 |
-
|
256 |
os.environ[RESET_JUDGEMENT_ENV] = "0"
|
257 |
-
|
258 |
try:
|
259 |
# Загружаем актуальные данные из репозитория
|
260 |
download_dataset("Vikhrmodels/DeathMath-leaderboard-data", "m_data")
|
261 |
logging.info("Successfully downloaded model evaluation data")
|
262 |
-
|
263 |
# Собираем данные из всех файлов моделей
|
264 |
data_list = []
|
265 |
seen_models = set() # Для отслеживания дубликатов
|
266 |
-
|
267 |
for file in glob.glob("./m_data/model_data/external/*.json"):
|
268 |
try:
|
269 |
with open(file) as f:
|
270 |
data = json.load(f)
|
271 |
-
|
272 |
# Проверяем наличие необходимых полей
|
273 |
model_name = data.get("model_name", "")
|
274 |
if not model_name:
|
275 |
logging.error(f"Failed to parse {file}: 'model_name' not found")
|
276 |
continue
|
277 |
-
|
278 |
# Предотвращаем дублирование моделей
|
279 |
model_base_name = model_name.split("/")[-1].split("_v")[0]
|
280 |
if model_base_name in seen_models:
|
281 |
logging.info(f"Skipping duplicate model: {model_name}")
|
282 |
continue
|
283 |
-
|
284 |
seen_models.add(model_base_name)
|
285 |
-
|
286 |
# Добавляем модель в список
|
287 |
-
data_list.append(
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
"
|
296 |
-
|
297 |
-
|
|
|
|
|
|
|
|
|
298 |
except Exception as e:
|
299 |
logging.error(f"Failed to process file {file}: {e}")
|
300 |
continue
|
301 |
-
|
302 |
# Если есть данные, сортируем их по общему баллу и сохраняем
|
303 |
if data_list:
|
304 |
# Сортируем по общему баллу
|
305 |
data_list.sort(key=lambda x: x["score"], reverse=True)
|
306 |
-
|
307 |
# Сохраняем обновленный лидерборд
|
308 |
with open("genned.json", "w", encoding="utf-8") as f:
|
309 |
json.dump(data_list, f, ensure_ascii=False, indent=2)
|
@@ -316,10 +312,10 @@ def update_board():
|
|
316 |
repo_type="dataset",
|
317 |
)
|
318 |
logging.info(f"Updated leaderboard with {len(data_list)} models")
|
319 |
-
|
320 |
# Генерируем README с таблицей лидерборда
|
321 |
update_readme(data_list)
|
322 |
-
|
323 |
except Exception as e:
|
324 |
logging.error(f"Error updating leaderboard: {e}")
|
325 |
|
@@ -331,24 +327,24 @@ def update_readme(data_list):
|
|
331 |
try:
|
332 |
import pandas as pd
|
333 |
from datetime import datetime
|
334 |
-
|
335 |
# Создаем DataFrame для удобного форматирования таблицы
|
336 |
df = pd.DataFrame(data_list)
|
337 |
-
|
338 |
# Форматируем числовые колонки
|
339 |
for col in ["score", "math_score", "physics_score"]:
|
340 |
if col in df.columns:
|
341 |
df[col] = df[col].apply(lambda x: f"{x:.3f}")
|
342 |
-
|
343 |
if "total_tokens" in df.columns:
|
344 |
df["total_tokens"] = df["total_tokens"].apply(lambda x: f"{int(x):,}")
|
345 |
-
|
346 |
if "evaluation_time" in df.columns:
|
347 |
df["evaluation_time"] = df["evaluation_time"].apply(lambda x: f"{x:.1f}s")
|
348 |
-
|
349 |
# Создаем содержимое README
|
350 |
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
351 |
-
|
352 |
readme_content = f"""---
|
353 |
title: DeathMath Leaderboard
|
354 |
emoji: 🔢
|
@@ -416,9 +412,9 @@ DeathMath - это бенчмарк для оценки способности
|
|
416 |
repo_id="Vikhrmodels/DeathMath-leaderboard-metainfo",
|
417 |
repo_type="dataset",
|
418 |
)
|
419 |
-
|
420 |
logging.info("Updated README with leaderboard table")
|
421 |
-
|
422 |
except Exception as e:
|
423 |
logging.error(f"Failed to update README: {e}")
|
424 |
|
@@ -438,13 +434,14 @@ def update_board_():
|
|
438 |
logging.info(f"Removed old file: {old_file}")
|
439 |
except Exception as e:
|
440 |
logging.error(f"Error removing old file {old_file}: {e}")
|
441 |
-
|
442 |
# Вызываем основную функцию обновления
|
443 |
update_board()
|
444 |
-
|
445 |
except Exception as e:
|
446 |
logging.error(f"Error in update_board_(): {e}")
|
447 |
|
|
|
448 |
if __name__ == "__main__":
|
449 |
os.environ[RESET_JUDGEMENT_ENV] = "1"
|
450 |
|
|
|
1 |
import logging
|
2 |
import os
|
3 |
+
|
4 |
os.makedirs("tmp", exist_ok=True)
|
5 |
+
os.environ["TMP_DIR"] = "tmp"
|
6 |
import subprocess
|
7 |
import shutil
|
8 |
import glob
|
|
|
15 |
import json
|
16 |
from io import BytesIO
|
17 |
|
18 |
+
|
19 |
def handle_file_upload(file):
|
20 |
file_path = file.name.split("/")[-1] if "/" in file.name else file.name
|
21 |
logging.info("File uploaded: %s", file_path)
|
|
|
23 |
v = json.load(f)
|
24 |
return v, file_path
|
25 |
|
26 |
+
|
27 |
def submit_file(v, file_path, mn, profile: gr.OAuthProfile | None):
|
28 |
"""
|
29 |
Обрабатывает загрузку файлов с результатами пользовательских моделей
|
30 |
+
|
31 |
Args:
|
32 |
v: Загруженные данные результатов из JSON
|
33 |
file_path: Путь к загруженному файлу
|
34 |
mn: Имя модели, указанное пользователем
|
35 |
profile: Профиль пользователя HuggingFace
|
36 |
+
|
37 |
Returns:
|
38 |
str: Сообщение об успехе или ошибке
|
39 |
"""
|
40 |
if profile is None:
|
41 |
return "Hub Login Required: Войдите в HuggingFace, чтобы загрузить результаты"
|
42 |
+
|
43 |
try:
|
44 |
# Проверяем наличие обязательных полей
|
45 |
required_fields = ["score", "math_score", "physics_score"]
|
46 |
for field in required_fields:
|
47 |
if field not in v:
|
48 |
return f"Error: Отсутствует обязательное поле '{field}' в JSON файле"
|
49 |
+
|
50 |
# Создаем новый объект для сохранения в базе данных
|
51 |
new_file = {
|
52 |
"model_name": profile.username + "/" + mn,
|
|
|
55 |
"physics_score": float(v["physics_score"]),
|
56 |
"total_tokens": int(v.get("total_tokens", 0)),
|
57 |
"evaluation_time": float(v.get("evaluation_time", 0.0)),
|
58 |
+
"system_prompt": v.get(
|
59 |
+
"system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
60 |
+
),
|
61 |
}
|
62 |
+
|
63 |
# Проверка значений на корректность
|
64 |
+
if not (
|
65 |
+
0 <= new_file["score"] <= 1 and 0 <= new_file["math_score"] <= 1 and 0 <= new_file["physics_score"] <= 1
|
66 |
+
):
|
67 |
return "Error: Все значения оценок должны быть в диапазоне от 0 до 1"
|
68 |
+
|
69 |
# Создаем уникальное имя файла на основе username и имени модели
|
70 |
safe_filename = profile.username + "_" + mn.replace("/", "_").replace(" ", "_") + ".json"
|
71 |
+
|
72 |
# Создаем JSON в памяти и загружаем его в репозиторий
|
73 |
buf = BytesIO()
|
74 |
+
buf.write(json.dumps(new_file, ensure_ascii=False).encode("utf-8"))
|
75 |
+
|
76 |
# Загружаем файл в репозиторий
|
77 |
API.upload_file(
|
78 |
path_or_fileobj=buf,
|
|
|
80 |
repo_id="Vikhrmodels/DeathMath-leaderboard-data",
|
81 |
repo_type="dataset",
|
82 |
)
|
83 |
+
|
84 |
# Устанавливаем флаг для обновления лидерборда
|
85 |
os.environ[RESET_JUDGEMENT_ENV] = "1"
|
86 |
+
|
87 |
# Логируем успешную загрузку
|
88 |
logging.info(f"Successfully uploaded model results: {new_file['model_name']}")
|
89 |
+
|
90 |
return f"Success! Результаты модели '{mn}' успешно отправлены в лидерборд DeathMath."
|
91 |
+
|
92 |
except Exception as e:
|
93 |
logging.error(f"Error submitting file: {e}")
|
94 |
return f"Error: Произошла ошибка при отправке файла: {str(e)}"
|
95 |
|
96 |
+
|
97 |
+
from src.display.about import INTRODUCTION_TEXT, TITLE, LLM_BENCHMARKS_TEXT
|
|
|
|
|
|
|
98 |
from src.display.css_html_js import custom_css
|
99 |
from src.display.utils import (
|
100 |
AutoEvalColumn,
|
|
|
115 |
|
116 |
# download_openbench()
|
117 |
|
118 |
+
|
119 |
def restart_space():
|
120 |
API.restart_space(repo_id=REPO_ID)
|
121 |
download_openbench()
|
122 |
|
123 |
+
|
124 |
def update_plot(selected_models):
|
125 |
return create_plot(selected_models)
|
126 |
|
127 |
+
|
128 |
def build_demo():
|
129 |
"""
|
130 |
Строит интерфейс лидерборда DeathMath
|
131 |
"""
|
132 |
# Загружаем данные для лидерборда
|
133 |
download_openbench()
|
134 |
+
|
135 |
# Создаем интерфейс с настройками темы
|
136 |
demo = gr.Blocks(
|
137 |
+
title="DeathMath Leaderboard",
|
138 |
css=custom_css,
|
139 |
theme=gr.themes.Default(
|
140 |
primary_hue="indigo",
|
141 |
secondary_hue="purple",
|
142 |
+
),
|
143 |
)
|
144 |
+
|
145 |
# Получаем данные для лидерборда
|
146 |
leaderboard_df = build_leadearboard_df()
|
147 |
+
|
148 |
# Строим интерфейс
|
149 |
with demo:
|
150 |
# Заголовок и введение
|
|
|
156 |
# Вкладка лидерборда
|
157 |
with gr.TabItem("🏅 Лидерборд", elem_id="llm-benchmark-tab-table", id=0):
|
158 |
gr.Markdown("### Таблица результатов моделей DeathMath")
|
159 |
+
|
160 |
# Таблица с результатами
|
161 |
Leaderboard(
|
162 |
value=leaderboard_df,
|
|
|
175 |
with gr.TabItem("🚀 Отправить результаты", elem_id="submit-tab", id=1):
|
176 |
with gr.Row():
|
177 |
gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
|
178 |
+
|
179 |
with gr.Column():
|
180 |
model_name_textbox = gr.Textbox(label="Название модели")
|
181 |
file_output = gr.File(label="Перетащите JSON файл с результатами сюда", type="filepath")
|
182 |
uploaded_file = gr.State()
|
183 |
file_path = gr.State()
|
184 |
+
|
185 |
with gr.Row():
|
186 |
with gr.Column():
|
187 |
out = gr.Textbox("Здесь будет показан статус отправки")
|
188 |
with gr.Column():
|
189 |
login_button = gr.LoginButton(elem_id="oauth-button")
|
190 |
+
|
191 |
+
submit_button = gr.Button("Отправить результаты", elem_id="submit_button", variant="primary")
|
192 |
+
|
193 |
# Обработчики событий
|
194 |
+
file_output.upload(handle_file_upload, file_output, [uploaded_file, file_path])
|
|
|
|
|
|
|
|
|
195 |
|
196 |
+
submit_button.click(submit_file, [uploaded_file, file_path, model_name_textbox], [out])
|
|
|
|
|
|
|
|
|
197 |
|
198 |
# Вкладка с аналитикой
|
199 |
with gr.TabItem("📊 Аналитика", elem_id="analytics-tab", id=2):
|
|
|
202 |
model_dropdown = gr.Dropdown(
|
203 |
choices=leaderboard_df["model"].tolist(),
|
204 |
label="Модели",
|
205 |
+
value=leaderboard_df["model"].tolist()[:5]
|
206 |
+
if len(leaderboard_df) >= 5
|
207 |
+
else leaderboard_df["model"].tolist(),
|
208 |
multiselect=True,
|
209 |
+
info="Выберите модели для сравнения",
|
210 |
)
|
211 |
else:
|
212 |
model_dropdown = gr.Dropdown(
|
|
|
214 |
label="Модели",
|
215 |
value=["example/model-1", "example/model-2"],
|
216 |
multiselect=True,
|
217 |
+
info="Выберите модели для сравнения",
|
218 |
)
|
219 |
+
|
220 |
# Вкладки для разных типов визуализации
|
221 |
with gr.Tabs():
|
222 |
with gr.TabItem("Столбчатая диаграмма"):
|
223 |
bar_plot = gr.Plot(create_plot(model_dropdown.value))
|
224 |
+
|
225 |
with gr.TabItem("Радарная диаграмма"):
|
226 |
from src.radial.radial import create_radar_plot
|
227 |
+
|
228 |
radar_plot = gr.Plot(create_radar_plot(model_dropdown.value))
|
229 |
+
|
230 |
# Обновление графиков при изменении выбранных моделей
|
231 |
+
model_dropdown.change(fn=create_plot, inputs=[model_dropdown], outputs=[bar_plot])
|
232 |
+
|
233 |
+
model_dropdown.change(fn=create_radar_plot, inputs=[model_dropdown], outputs=[radar_plot])
|
234 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
235 |
return demo
|
236 |
|
237 |
|
|
|
244 |
logging.info("Updating the leaderboard: %s", need_reset)
|
245 |
if need_reset != "1":
|
246 |
return
|
247 |
+
|
248 |
os.environ[RESET_JUDGEMENT_ENV] = "0"
|
249 |
+
|
250 |
try:
|
251 |
# Загружаем актуальные данные из репозитория
|
252 |
download_dataset("Vikhrmodels/DeathMath-leaderboard-data", "m_data")
|
253 |
logging.info("Successfully downloaded model evaluation data")
|
254 |
+
|
255 |
# Собираем данные из всех файлов моделей
|
256 |
data_list = []
|
257 |
seen_models = set() # Для отслеживания дубликатов
|
258 |
+
|
259 |
for file in glob.glob("./m_data/model_data/external/*.json"):
|
260 |
try:
|
261 |
with open(file) as f:
|
262 |
data = json.load(f)
|
263 |
+
|
264 |
# Проверяем наличие необходимых полей
|
265 |
model_name = data.get("model_name", "")
|
266 |
if not model_name:
|
267 |
logging.error(f"Failed to parse {file}: 'model_name' not found")
|
268 |
continue
|
269 |
+
|
270 |
# Предотвращаем дублирование моделей
|
271 |
model_base_name = model_name.split("/")[-1].split("_v")[0]
|
272 |
if model_base_name in seen_models:
|
273 |
logging.info(f"Skipping duplicate model: {model_name}")
|
274 |
continue
|
275 |
+
|
276 |
seen_models.add(model_base_name)
|
277 |
+
|
278 |
# Добавляем модель в список
|
279 |
+
data_list.append(
|
280 |
+
{
|
281 |
+
"model_name": model_name,
|
282 |
+
"score": float(data.get("score", 0.0)),
|
283 |
+
"math_score": float(data.get("math_score", 0.0)),
|
284 |
+
"physics_score": float(data.get("physics_score", 0.0)),
|
285 |
+
"total_tokens": int(data.get("total_tokens", 0)),
|
286 |
+
"evaluation_time": float(data.get("evaluation_time", 0.0)),
|
287 |
+
"system_prompt": data.get(
|
288 |
+
"system_prompt",
|
289 |
+
"Вы - полезный помощник по математике и физике. Ответьте на русском языке.",
|
290 |
+
),
|
291 |
+
}
|
292 |
+
)
|
293 |
+
|
294 |
except Exception as e:
|
295 |
logging.error(f"Failed to process file {file}: {e}")
|
296 |
continue
|
297 |
+
|
298 |
# Если есть данные, сортируем их по общему баллу и сохраняем
|
299 |
if data_list:
|
300 |
# Сортируем по общему баллу
|
301 |
data_list.sort(key=lambda x: x["score"], reverse=True)
|
302 |
+
|
303 |
# Сохраняем обновленный лидерборд
|
304 |
with open("genned.json", "w", encoding="utf-8") as f:
|
305 |
json.dump(data_list, f, ensure_ascii=False, indent=2)
|
|
|
312 |
repo_type="dataset",
|
313 |
)
|
314 |
logging.info(f"Updated leaderboard with {len(data_list)} models")
|
315 |
+
|
316 |
# Генерируем README с таблицей лидерборда
|
317 |
update_readme(data_list)
|
318 |
+
|
319 |
except Exception as e:
|
320 |
logging.error(f"Error updating leaderboard: {e}")
|
321 |
|
|
|
327 |
try:
|
328 |
import pandas as pd
|
329 |
from datetime import datetime
|
330 |
+
|
331 |
# Создаем DataFrame для удобного форматирования таблицы
|
332 |
df = pd.DataFrame(data_list)
|
333 |
+
|
334 |
# Форматируем числовые колонки
|
335 |
for col in ["score", "math_score", "physics_score"]:
|
336 |
if col in df.columns:
|
337 |
df[col] = df[col].apply(lambda x: f"{x:.3f}")
|
338 |
+
|
339 |
if "total_tokens" in df.columns:
|
340 |
df["total_tokens"] = df["total_tokens"].apply(lambda x: f"{int(x):,}")
|
341 |
+
|
342 |
if "evaluation_time" in df.columns:
|
343 |
df["evaluation_time"] = df["evaluation_time"].apply(lambda x: f"{x:.1f}s")
|
344 |
+
|
345 |
# Создаем содержимое README
|
346 |
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
347 |
+
|
348 |
readme_content = f"""---
|
349 |
title: DeathMath Leaderboard
|
350 |
emoji: 🔢
|
|
|
412 |
repo_id="Vikhrmodels/DeathMath-leaderboard-metainfo",
|
413 |
repo_type="dataset",
|
414 |
)
|
415 |
+
|
416 |
logging.info("Updated README with leaderboard table")
|
417 |
+
|
418 |
except Exception as e:
|
419 |
logging.error(f"Failed to update README: {e}")
|
420 |
|
|
|
434 |
logging.info(f"Removed old file: {old_file}")
|
435 |
except Exception as e:
|
436 |
logging.error(f"Error removing old file {old_file}: {e}")
|
437 |
+
|
438 |
# Вызываем основную функцию обновления
|
439 |
update_board()
|
440 |
+
|
441 |
except Exception as e:
|
442 |
logging.error(f"Error in update_board_(): {e}")
|
443 |
|
444 |
+
|
445 |
if __name__ == "__main__":
|
446 |
os.environ[RESET_JUDGEMENT_ENV] = "1"
|
447 |
|
generate_initial_leaderboard.py
CHANGED
@@ -18,10 +18,7 @@ from datetime import datetime
|
|
18 |
logging.basicConfig(
|
19 |
level=logging.INFO,
|
20 |
format="%(asctime)s - %(levelname)s - %(message)s",
|
21 |
-
handlers=[
|
22 |
-
logging.FileHandler("leaderboard_generation.log"),
|
23 |
-
logging.StreamHandler()
|
24 |
-
]
|
25 |
)
|
26 |
logger = logging.getLogger(__name__)
|
27 |
|
@@ -29,15 +26,16 @@ logger = logging.getLogger(__name__)
|
|
29 |
REPO_ID = "Vikhrmodels/DeathMath-leaderboard-data"
|
30 |
METAINFO_REPO_ID = "Vikhrmodels/DeathMath-leaderboard-metainfo"
|
31 |
|
|
|
32 |
def setup_repositories(token):
|
33 |
"""
|
34 |
Создает необходимые репозитории на HuggingFace Hub, если они еще не существуют.
|
35 |
-
|
36 |
Args:
|
37 |
token (str): Токен для доступа к HuggingFace Hub
|
38 |
"""
|
39 |
api = HfApi(token=token)
|
40 |
-
|
41 |
try:
|
42 |
# Проверка и создание репозитория для данных лидерборда
|
43 |
try:
|
@@ -46,7 +44,7 @@ def setup_repositories(token):
|
|
46 |
except Exception:
|
47 |
logger.info(f"Создание репозитория для данных лидерборда: {REPO_ID}")
|
48 |
create_repo(repo_id=REPO_ID, repo_type="dataset", token=token)
|
49 |
-
|
50 |
# Проверка и создание репозитория для метаданных лидерборда
|
51 |
try:
|
52 |
api.repo_info(repo_id=METAINFO_REPO_ID, repo_type="dataset")
|
@@ -54,41 +52,42 @@ def setup_repositories(token):
|
|
54 |
except Exception:
|
55 |
logger.info(f"Создание репозитория для метаданных лидерборда: {METAINFO_REPO_ID}")
|
56 |
create_repo(repo_id=METAINFO_REPO_ID, repo_type="dataset", token=token)
|
57 |
-
|
58 |
return api
|
59 |
except Exception as e:
|
60 |
logger.error(f"Ошибка при создании репозиториев: {e}")
|
61 |
raise
|
62 |
|
|
|
63 |
def load_results(results_file):
|
64 |
"""
|
65 |
Загружает результаты из JSON файла и удаляет дубликаты.
|
66 |
-
|
67 |
Args:
|
68 |
results_file (str): Путь к файлу с результатами
|
69 |
-
|
70 |
Returns:
|
71 |
list: Список записей для лидерборда без дубликатов
|
72 |
"""
|
73 |
try:
|
74 |
with open(results_file, "r", encoding="utf-8") as f:
|
75 |
data = json.load(f)
|
76 |
-
|
77 |
leaderboard_entries = []
|
78 |
seen_models = set() # Множество для отслеживания уже обработанных моделей
|
79 |
-
|
80 |
for key, value in data.items():
|
81 |
if "_Combined_" in key: # берем только комбинированные результаты
|
82 |
model_name = value["model_name"]
|
83 |
-
|
84 |
# Пропускаем модель, если она уже была добавлена
|
85 |
if model_name in seen_models:
|
86 |
logger.info(f"Пропускаем дублирующуюся модель: {model_name}")
|
87 |
continue
|
88 |
-
|
89 |
# Добавляем модель во множество обработанных
|
90 |
seen_models.add(model_name)
|
91 |
-
|
92 |
leaderboard_entry = {
|
93 |
"model_name": model_name,
|
94 |
"score": value["score"],
|
@@ -96,113 +95,119 @@ def load_results(results_file):
|
|
96 |
"physics_score": value["physics_score"],
|
97 |
"total_tokens": value["total_tokens"],
|
98 |
"evaluation_time": value["evaluation_time"],
|
99 |
-
"system_prompt": value.get(
|
100 |
-
"Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
|
|
101 |
}
|
102 |
leaderboard_entries.append(leaderboard_entry)
|
103 |
-
|
104 |
# Сортировка по общему баллу
|
105 |
leaderboard_entries.sort(key=lambda x: x["score"], reverse=True)
|
106 |
logger.info(f"Загружено {len(leaderboard_entries)} уникальных моделей после удаления дубликатов")
|
107 |
return leaderboard_entries
|
108 |
-
|
109 |
except Exception as e:
|
110 |
logger.error(f"Ошибка при загрузке результатов: {e}")
|
111 |
raise
|
112 |
|
|
|
113 |
def prepare_directory_structure():
|
114 |
"""
|
115 |
Создает необходимую структуру директорий для внешних моделей.
|
116 |
-
|
117 |
Returns:
|
118 |
str: Путь к временной директории с подготовленной структурой
|
119 |
"""
|
120 |
temp_dir = Path("./temp_leaderboard")
|
121 |
model_data_dir = temp_dir / "model_data" / "external"
|
122 |
-
|
123 |
# Очистка и создание директорий
|
124 |
if temp_dir.exists():
|
125 |
import shutil
|
|
|
126 |
shutil.rmtree(temp_dir)
|
127 |
-
|
128 |
model_data_dir.mkdir(parents=True, exist_ok=True)
|
129 |
-
|
130 |
return str(temp_dir)
|
131 |
|
|
|
132 |
def upload_model_files(api, leaderboard_entries, temp_dir):
|
133 |
"""
|
134 |
Загружает файлы моделей в репозиторий данных лидерборда.
|
135 |
-
|
136 |
Args:
|
137 |
api (HfApi): Экземпляр API для взаимодействия с HuggingFace
|
138 |
leaderboard_entries (list): Список записей для лидерборда
|
139 |
temp_dir (str): Путь к временной директории
|
140 |
"""
|
141 |
model_data_dir = os.path.join(temp_dir, "model_data", "external")
|
142 |
-
|
143 |
for entry in leaderboard_entries:
|
144 |
model_name = entry["model_name"]
|
145 |
safe_filename = model_name.replace("/", "_").replace(" ", "_")
|
146 |
file_path = os.path.join(model_data_dir, f"{safe_filename}.json")
|
147 |
-
|
148 |
with open(file_path, "w", encoding="utf-8") as f:
|
149 |
json.dump(entry, f, ensure_ascii=False, indent=2)
|
150 |
-
|
151 |
# Загрузка файла модели в репозиторий
|
152 |
api.upload_file(
|
153 |
path_or_fileobj=file_path,
|
154 |
path_in_repo=f"model_data/external/{safe_filename}.json",
|
155 |
repo_id=REPO_ID,
|
156 |
-
repo_type="dataset"
|
157 |
)
|
158 |
logger.info(f"Загружен файл модели: {safe_filename}.json")
|
159 |
|
|
|
160 |
def generate_leaderboard_json(leaderboard_entries):
|
161 |
"""
|
162 |
Создает JSON файл с данными лидерборда.
|
163 |
-
|
164 |
Args:
|
165 |
leaderboard_entries (list): Список записей для лидерборда
|
166 |
-
|
167 |
Returns:
|
168 |
str: Путь к созданному JSON файлу
|
169 |
"""
|
170 |
leaderboard_file = "leaderboard.json"
|
171 |
-
|
172 |
with open(leaderboard_file, "w", encoding="utf-8") as f:
|
173 |
json.dump(leaderboard_entries, f, ensure_ascii=False, indent=2)
|
174 |
-
|
175 |
return leaderboard_file
|
176 |
|
|
|
177 |
def generate_readme(leaderboard_entries):
|
178 |
"""
|
179 |
Генерирует README.md с информацией о лидерборде.
|
180 |
-
|
181 |
Args:
|
182 |
leaderboard_entries (list): Список записей для лидерборда
|
183 |
-
|
184 |
Returns:
|
185 |
str: Путь к созданному README файлу
|
186 |
"""
|
187 |
readme_file = "README.md"
|
188 |
-
|
189 |
# Создаем DataFrame для удобного форматирования таблицы
|
190 |
df = pd.DataFrame(leaderboard_entries)
|
191 |
-
|
192 |
# Форматируем числовые колонки
|
193 |
for col in ["score", "math_score", "physics_score"]:
|
194 |
if col in df.columns:
|
195 |
df[col] = df[col].apply(lambda x: f"{x:.3f}")
|
196 |
-
|
197 |
if "total_tokens" in df.columns:
|
198 |
df["total_tokens"] = df["total_tokens"].apply(lambda x: f"{int(x):,}")
|
199 |
-
|
200 |
if "evaluation_time" in df.columns:
|
201 |
df["evaluation_time"] = df["evaluation_time"].apply(lambda x: f"{x:.1f}s")
|
202 |
-
|
203 |
# Создаем содержимое README
|
204 |
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
205 |
-
|
206 |
readme_content = f"""# DeathMath Leaderboard
|
207 |
|
208 |
DeathMath - это бенчмарк для оценки способности моделей решать сложные математические и физические задачи на русском языке.
|
@@ -249,13 +254,14 @@ DeathMath - это бенчмарк для оценки способности
|
|
249 |
|
250 |
with open(readme_file, "w", encoding="utf-8") as f:
|
251 |
f.write(readme_content)
|
252 |
-
|
253 |
return readme_file
|
254 |
|
|
|
255 |
def upload_leaderboard_files(api, leaderboard_file, readme_file):
|
256 |
"""
|
257 |
Загружает файлы лидерборда в репозиторий метаданных.
|
258 |
-
|
259 |
Args:
|
260 |
api (HfApi): Экземпляр API для взаимодействия с HuggingFace
|
261 |
leaderboard_file (str): Путь к JSON файлу лидерборда
|
@@ -263,67 +269,66 @@ def upload_leaderboard_files(api, leaderboard_file, readme_file):
|
|
263 |
"""
|
264 |
# Загрузка JSON лидерборда
|
265 |
api.upload_file(
|
266 |
-
path_or_fileobj=leaderboard_file,
|
267 |
-
path_in_repo="leaderboard.json",
|
268 |
-
repo_id=METAINFO_REPO_ID,
|
269 |
-
repo_type="dataset"
|
270 |
)
|
271 |
logger.info(f"Загружен файл лидерборда: leaderboard.json в {METAINFO_REPO_ID}")
|
272 |
-
|
273 |
# Загрузка README
|
274 |
api.upload_file(
|
275 |
-
path_or_fileobj=readme_file,
|
276 |
-
path_in_repo="README.md",
|
277 |
-
repo_id=METAINFO_REPO_ID,
|
278 |
-
repo_type="dataset"
|
279 |
)
|
280 |
logger.info(f"Загружен README: README.md в {METAINFO_REPO_ID}")
|
281 |
|
|
|
282 |
def main():
|
283 |
# Парсинг аргументов командной строки
|
284 |
parser = argparse.ArgumentParser(description="Генерация первоначального лидерборда DeathMath")
|
285 |
-
parser.add_argument(
|
286 |
-
|
|
|
|
|
|
|
287 |
parser.add_argument("--token", required=True, help="Токен для доступа к HuggingFace Hub")
|
288 |
-
|
289 |
args = parser.parse_args()
|
290 |
-
|
291 |
try:
|
292 |
logger.info("Начинаем генерацию лидерборда DeathMath")
|
293 |
-
|
294 |
# Настраиваем репозитории
|
295 |
api = setup_repositories(args.token)
|
296 |
logger.info("Репозитории успешно настроены")
|
297 |
-
|
298 |
# Загружаем результаты
|
299 |
leaderboard_entries = load_results(args.results)
|
300 |
logger.info(f"Загружено {len(leaderboard_entries)} записей для лидерборда")
|
301 |
-
|
302 |
# Подготавливаем структуру директорий
|
303 |
temp_dir = prepare_directory_structure()
|
304 |
logger.info(f"Создана временная директория: {temp_dir}")
|
305 |
-
|
306 |
# Загружаем файлы моделей
|
307 |
upload_model_files(api, leaderboard_entries, temp_dir)
|
308 |
logger.info("Файлы моделей успешно загружены")
|
309 |
-
|
310 |
# Генерируем JSON лидерборда
|
311 |
leaderboard_file = generate_leaderboard_json(leaderboard_entries)
|
312 |
logger.info(f"Создан файл лидерборда: {leaderboard_file}")
|
313 |
-
|
314 |
# Генерируем README
|
315 |
readme_file = generate_readme(leaderboard_entries)
|
316 |
logger.info(f"Создан README: {readme_file}")
|
317 |
-
|
318 |
# Загружаем файлы лидерборда
|
319 |
upload_leaderboard_files(api, leaderboard_file, readme_file)
|
320 |
logger.info("Файлы лидерборда успешно загружены")
|
321 |
-
|
322 |
logger.info("Генерация лидерборда успешно завершена!")
|
323 |
-
|
324 |
except Exception as e:
|
325 |
logger.error(f"Ошибка при генерации лидерборда: {e}")
|
326 |
raise
|
327 |
|
|
|
328 |
if __name__ == "__main__":
|
329 |
-
main()
|
|
|
18 |
logging.basicConfig(
|
19 |
level=logging.INFO,
|
20 |
format="%(asctime)s - %(levelname)s - %(message)s",
|
21 |
+
handlers=[logging.FileHandler("leaderboard_generation.log"), logging.StreamHandler()],
|
|
|
|
|
|
|
22 |
)
|
23 |
logger = logging.getLogger(__name__)
|
24 |
|
|
|
26 |
REPO_ID = "Vikhrmodels/DeathMath-leaderboard-data"
|
27 |
METAINFO_REPO_ID = "Vikhrmodels/DeathMath-leaderboard-metainfo"
|
28 |
|
29 |
+
|
30 |
def setup_repositories(token):
|
31 |
"""
|
32 |
Создает необходимые репозитории на HuggingFace Hub, если они еще не существуют.
|
33 |
+
|
34 |
Args:
|
35 |
token (str): Токен для доступа к HuggingFace Hub
|
36 |
"""
|
37 |
api = HfApi(token=token)
|
38 |
+
|
39 |
try:
|
40 |
# Проверка и создание репозитория для данных лидерборда
|
41 |
try:
|
|
|
44 |
except Exception:
|
45 |
logger.info(f"Создание репозитория для данных лидерборда: {REPO_ID}")
|
46 |
create_repo(repo_id=REPO_ID, repo_type="dataset", token=token)
|
47 |
+
|
48 |
# Проверка и создание репозитория для метаданных лидерборда
|
49 |
try:
|
50 |
api.repo_info(repo_id=METAINFO_REPO_ID, repo_type="dataset")
|
|
|
52 |
except Exception:
|
53 |
logger.info(f"Создание репозитория для метаданных лидерборда: {METAINFO_REPO_ID}")
|
54 |
create_repo(repo_id=METAINFO_REPO_ID, repo_type="dataset", token=token)
|
55 |
+
|
56 |
return api
|
57 |
except Exception as e:
|
58 |
logger.error(f"Ошибка при создании репозиториев: {e}")
|
59 |
raise
|
60 |
|
61 |
+
|
62 |
def load_results(results_file):
|
63 |
"""
|
64 |
Загружает результаты из JSON файла и удаляет дубликаты.
|
65 |
+
|
66 |
Args:
|
67 |
results_file (str): Путь к файлу с результатами
|
68 |
+
|
69 |
Returns:
|
70 |
list: Список записей для лидерборда без дубликатов
|
71 |
"""
|
72 |
try:
|
73 |
with open(results_file, "r", encoding="utf-8") as f:
|
74 |
data = json.load(f)
|
75 |
+
|
76 |
leaderboard_entries = []
|
77 |
seen_models = set() # Множество для отслеживания уже обработанных моделей
|
78 |
+
|
79 |
for key, value in data.items():
|
80 |
if "_Combined_" in key: # берем только комбинированные результаты
|
81 |
model_name = value["model_name"]
|
82 |
+
|
83 |
# Пропускаем модель, если она уже была добавлена
|
84 |
if model_name in seen_models:
|
85 |
logger.info(f"Пропускаем дублирующуюся модель: {model_name}")
|
86 |
continue
|
87 |
+
|
88 |
# Добавляем модель во множество обработанных
|
89 |
seen_models.add(model_name)
|
90 |
+
|
91 |
leaderboard_entry = {
|
92 |
"model_name": model_name,
|
93 |
"score": value["score"],
|
|
|
95 |
"physics_score": value["physics_score"],
|
96 |
"total_tokens": value["total_tokens"],
|
97 |
"evaluation_time": value["evaluation_time"],
|
98 |
+
"system_prompt": value.get(
|
99 |
+
"system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
100 |
+
),
|
101 |
}
|
102 |
leaderboard_entries.append(leaderboard_entry)
|
103 |
+
|
104 |
# Сортировка по общему баллу
|
105 |
leaderboard_entries.sort(key=lambda x: x["score"], reverse=True)
|
106 |
logger.info(f"Загружено {len(leaderboard_entries)} уникальных моделей после удаления дубликатов")
|
107 |
return leaderboard_entries
|
108 |
+
|
109 |
except Exception as e:
|
110 |
logger.error(f"Ошибка при загрузке результатов: {e}")
|
111 |
raise
|
112 |
|
113 |
+
|
114 |
def prepare_directory_structure():
|
115 |
"""
|
116 |
Создает необходимую структуру директорий для внешних моделей.
|
117 |
+
|
118 |
Returns:
|
119 |
str: Путь к временной директории с подготовленной структурой
|
120 |
"""
|
121 |
temp_dir = Path("./temp_leaderboard")
|
122 |
model_data_dir = temp_dir / "model_data" / "external"
|
123 |
+
|
124 |
# Очистка и создание директорий
|
125 |
if temp_dir.exists():
|
126 |
import shutil
|
127 |
+
|
128 |
shutil.rmtree(temp_dir)
|
129 |
+
|
130 |
model_data_dir.mkdir(parents=True, exist_ok=True)
|
131 |
+
|
132 |
return str(temp_dir)
|
133 |
|
134 |
+
|
135 |
def upload_model_files(api, leaderboard_entries, temp_dir):
|
136 |
"""
|
137 |
Загружает файлы моделей в репозиторий данных лидерборда.
|
138 |
+
|
139 |
Args:
|
140 |
api (HfApi): Экземпляр API для взаимодействия с HuggingFace
|
141 |
leaderboard_entries (list): Список записей для лидерборда
|
142 |
temp_dir (str): Путь к временной директории
|
143 |
"""
|
144 |
model_data_dir = os.path.join(temp_dir, "model_data", "external")
|
145 |
+
|
146 |
for entry in leaderboard_entries:
|
147 |
model_name = entry["model_name"]
|
148 |
safe_filename = model_name.replace("/", "_").replace(" ", "_")
|
149 |
file_path = os.path.join(model_data_dir, f"{safe_filename}.json")
|
150 |
+
|
151 |
with open(file_path, "w", encoding="utf-8") as f:
|
152 |
json.dump(entry, f, ensure_ascii=False, indent=2)
|
153 |
+
|
154 |
# Загрузка файла модели в репозиторий
|
155 |
api.upload_file(
|
156 |
path_or_fileobj=file_path,
|
157 |
path_in_repo=f"model_data/external/{safe_filename}.json",
|
158 |
repo_id=REPO_ID,
|
159 |
+
repo_type="dataset",
|
160 |
)
|
161 |
logger.info(f"Загружен файл модели: {safe_filename}.json")
|
162 |
|
163 |
+
|
164 |
def generate_leaderboard_json(leaderboard_entries):
|
165 |
"""
|
166 |
Создает JSON файл с данными лидерборда.
|
167 |
+
|
168 |
Args:
|
169 |
leaderboard_entries (list): Список записей для лидерборда
|
170 |
+
|
171 |
Returns:
|
172 |
str: Путь к созданному JSON файлу
|
173 |
"""
|
174 |
leaderboard_file = "leaderboard.json"
|
175 |
+
|
176 |
with open(leaderboard_file, "w", encoding="utf-8") as f:
|
177 |
json.dump(leaderboard_entries, f, ensure_ascii=False, indent=2)
|
178 |
+
|
179 |
return leaderboard_file
|
180 |
|
181 |
+
|
182 |
def generate_readme(leaderboard_entries):
|
183 |
"""
|
184 |
Генерирует README.md с информацией о лидерборде.
|
185 |
+
|
186 |
Args:
|
187 |
leaderboard_entries (list): Список записей для лидерборда
|
188 |
+
|
189 |
Returns:
|
190 |
str: Путь к созданному README файлу
|
191 |
"""
|
192 |
readme_file = "README.md"
|
193 |
+
|
194 |
# Создаем DataFrame для удобного форматирования таблицы
|
195 |
df = pd.DataFrame(leaderboard_entries)
|
196 |
+
|
197 |
# Форматируем числовые колонки
|
198 |
for col in ["score", "math_score", "physics_score"]:
|
199 |
if col in df.columns:
|
200 |
df[col] = df[col].apply(lambda x: f"{x:.3f}")
|
201 |
+
|
202 |
if "total_tokens" in df.columns:
|
203 |
df["total_tokens"] = df["total_tokens"].apply(lambda x: f"{int(x):,}")
|
204 |
+
|
205 |
if "evaluation_time" in df.columns:
|
206 |
df["evaluation_time"] = df["evaluation_time"].apply(lambda x: f"{x:.1f}s")
|
207 |
+
|
208 |
# Создаем содержимое README
|
209 |
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
210 |
+
|
211 |
readme_content = f"""# DeathMath Leaderboard
|
212 |
|
213 |
DeathMath - это бенчмарк для оценки способности моделей решать сложные математические и физические задачи на русском языке.
|
|
|
254 |
|
255 |
with open(readme_file, "w", encoding="utf-8") as f:
|
256 |
f.write(readme_content)
|
257 |
+
|
258 |
return readme_file
|
259 |
|
260 |
+
|
261 |
def upload_leaderboard_files(api, leaderboard_file, readme_file):
|
262 |
"""
|
263 |
Загружает файлы лидерборда в репозиторий метаданных.
|
264 |
+
|
265 |
Args:
|
266 |
api (HfApi): Экземпляр API для взаимодействия с HuggingFace
|
267 |
leaderboard_file (str): Путь к JSON файлу лидерборда
|
|
|
269 |
"""
|
270 |
# Загрузка JSON лидерборда
|
271 |
api.upload_file(
|
272 |
+
path_or_fileobj=leaderboard_file, path_in_repo="leaderboard.json", repo_id=METAINFO_REPO_ID, repo_type="dataset"
|
|
|
|
|
|
|
273 |
)
|
274 |
logger.info(f"Загружен файл лидерборда: leaderboard.json в {METAINFO_REPO_ID}")
|
275 |
+
|
276 |
# Загрузка README
|
277 |
api.upload_file(
|
278 |
+
path_or_fileobj=readme_file, path_in_repo="README.md", repo_id=METAINFO_REPO_ID, repo_type="dataset"
|
|
|
|
|
|
|
279 |
)
|
280 |
logger.info(f"Загружен README: README.md в {METAINFO_REPO_ID}")
|
281 |
|
282 |
+
|
283 |
def main():
|
284 |
# Парсинг аргументов командной строки
|
285 |
parser = argparse.ArgumentParser(description="Генерация первоначального лидерборда DeathMath")
|
286 |
+
parser.add_argument(
|
287 |
+
"--results",
|
288 |
+
default="../results/leaderboard_results.json",
|
289 |
+
help="Путь к файлу с результатами (по умолчанию: ../results/leaderboard_results.json)",
|
290 |
+
)
|
291 |
parser.add_argument("--token", required=True, help="Токен для доступа к HuggingFace Hub")
|
292 |
+
|
293 |
args = parser.parse_args()
|
294 |
+
|
295 |
try:
|
296 |
logger.info("Начинаем генерацию лидерборда DeathMath")
|
297 |
+
|
298 |
# Настраиваем репозитории
|
299 |
api = setup_repositories(args.token)
|
300 |
logger.info("Репозитории успешно настроены")
|
301 |
+
|
302 |
# Загружаем результаты
|
303 |
leaderboard_entries = load_results(args.results)
|
304 |
logger.info(f"Загружено {len(leaderboard_entries)} записей для лидерборда")
|
305 |
+
|
306 |
# Подготавливаем структуру директорий
|
307 |
temp_dir = prepare_directory_structure()
|
308 |
logger.info(f"Создана временная директория: {temp_dir}")
|
309 |
+
|
310 |
# Загружаем файлы моделей
|
311 |
upload_model_files(api, leaderboard_entries, temp_dir)
|
312 |
logger.info("Файлы моделей успешно загружены")
|
313 |
+
|
314 |
# Генерируем JSON лидерборда
|
315 |
leaderboard_file = generate_leaderboard_json(leaderboard_entries)
|
316 |
logger.info(f"Создан файл лидерборда: {leaderboard_file}")
|
317 |
+
|
318 |
# Генерируем README
|
319 |
readme_file = generate_readme(leaderboard_entries)
|
320 |
logger.info(f"Создан README: {readme_file}")
|
321 |
+
|
322 |
# Загружаем файлы лидерборда
|
323 |
upload_leaderboard_files(api, leaderboard_file, readme_file)
|
324 |
logger.info("Файлы лидерборда успешно загружены")
|
325 |
+
|
326 |
logger.info("Генерация лидерборда успешно завершена!")
|
327 |
+
|
328 |
except Exception as e:
|
329 |
logger.error(f"Ошибка при генерации лидерборда: {e}")
|
330 |
raise
|
331 |
|
332 |
+
|
333 |
if __name__ == "__main__":
|
334 |
+
main()
|
leaderboard.json
CHANGED
@@ -1,4 +1,13 @@
|
|
1 |
[
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
{
|
3 |
"model_name": "o3-mini-high",
|
4 |
"score": 0.600956937799043,
|
@@ -98,33 +107,6 @@
|
|
98 |
"evaluation_time": 1078.4077816009521,
|
99 |
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
100 |
},
|
101 |
-
{
|
102 |
-
"model_name": "GigaChat-2-Max",
|
103 |
-
"score": 0.24952153110047848,
|
104 |
-
"math_score": 0.3263157894736842,
|
105 |
-
"physics_score": 0.17272727272727273,
|
106 |
-
"total_tokens": 220487,
|
107 |
-
"evaluation_time": 1006.1656014919281,
|
108 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
109 |
-
},
|
110 |
-
{
|
111 |
-
"model_name": "GigaChat-2-Pro",
|
112 |
-
"score": 0.20861244019138758,
|
113 |
-
"math_score": 0.3263157894736842,
|
114 |
-
"physics_score": 0.09090909090909091,
|
115 |
-
"total_tokens": 212196,
|
116 |
-
"evaluation_time": 1002.5515208244324,
|
117 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
118 |
-
},
|
119 |
-
{
|
120 |
-
"model_name": "GigaChat-Max",
|
121 |
-
"score": 0.1394736842105263,
|
122 |
-
"math_score": 0.17894736842105263,
|
123 |
-
"physics_score": 0.1,
|
124 |
-
"total_tokens": 201090,
|
125 |
-
"evaluation_time": 978.7567253112793,
|
126 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
127 |
-
},
|
128 |
{
|
129 |
"model_name": "DeepSeek V3 0324",
|
130 |
"score": 0.13229665071770336,
|
@@ -142,14 +124,5 @@
|
|
142 |
"total_tokens": 572095,
|
143 |
"evaluation_time": 1682.6655840873718,
|
144 |
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
145 |
-
},
|
146 |
-
{
|
147 |
-
"model_name": "GigaChat-2",
|
148 |
-
"score": 0.0937799043062201,
|
149 |
-
"math_score": 0.14210526315789473,
|
150 |
-
"physics_score": 0.045454545454545456,
|
151 |
-
"total_tokens": 299747,
|
152 |
-
"evaluation_time": 834.6775443553925,
|
153 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
154 |
}
|
155 |
]
|
|
|
1 |
[
|
2 |
+
{
|
3 |
+
"model_name": "o3",
|
4 |
+
"score": 0.6205741626794259,
|
5 |
+
"math_score": 0.868421052631579,
|
6 |
+
"physics_score": 0.37272727272727274,
|
7 |
+
"total_tokens": 1251746,
|
8 |
+
"evaluation_time": 4609.068037748337,
|
9 |
+
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
10 |
+
},
|
11 |
{
|
12 |
"model_name": "o3-mini-high",
|
13 |
"score": 0.600956937799043,
|
|
|
107 |
"evaluation_time": 1078.4077816009521,
|
108 |
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
109 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
{
|
111 |
"model_name": "DeepSeek V3 0324",
|
112 |
"score": 0.13229665071770336,
|
|
|
124 |
"total_tokens": 572095,
|
125 |
"evaluation_time": 1682.6655840873718,
|
126 |
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
}
|
128 |
]
|
pyproject.toml
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
[tool.ruff]
|
2 |
line-length = 120
|
3 |
-
target-version = "
|
4 |
include = ["*.py", "*.pyi", "**/pyproject.toml", "*.ipynb"]
|
5 |
ignore=["I","EM","FBT","TRY003","S101","D101","D102","D103","D104","D105","G004","D107","FA102"]
|
6 |
fixable=["ALL"]
|
@@ -27,7 +27,7 @@ authors = []
|
|
27 |
readme = "README.md"
|
28 |
|
29 |
[tool.poetry.dependencies]
|
30 |
-
python = "3.
|
31 |
apscheduler = "3.10.1"
|
32 |
black = "23.11.0"
|
33 |
click = "8.1.3"
|
|
|
1 |
[tool.ruff]
|
2 |
line-length = 120
|
3 |
+
target-version = "py313"
|
4 |
include = ["*.py", "*.pyi", "**/pyproject.toml", "*.ipynb"]
|
5 |
ignore=["I","EM","FBT","TRY003","S101","D101","D102","D103","D104","D105","G004","D107","FA102"]
|
6 |
fixable=["ALL"]
|
|
|
27 |
readme = "README.md"
|
28 |
|
29 |
[tool.poetry.dependencies]
|
30 |
+
python = "3.13.3"
|
31 |
apscheduler = "3.10.1"
|
32 |
black = "23.11.0"
|
33 |
click = "8.1.3"
|
temp_leaderboard/model_data/external/Claude_3.5_Sonnet.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "Claude 3.5 Sonnet",
|
3 |
-
"score": 0.33851674641148327,
|
4 |
-
"math_score": 0.43157894736842106,
|
5 |
-
"physics_score": 0.24545454545454545,
|
6 |
-
"total_tokens": 222241,
|
7 |
-
"evaluation_time": 670.5163931846619,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/Claude_3.7_Sonnet.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "Claude 3.7 Sonnet",
|
3 |
-
"score": 0.36770334928229664,
|
4 |
-
"math_score": 0.5263157894736842,
|
5 |
-
"physics_score": 0.20909090909090908,
|
6 |
-
"total_tokens": 398016,
|
7 |
-
"evaluation_time": 1095.7695870399475,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/DeepSeek_V3_0324.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "DeepSeek V3 0324",
|
3 |
-
"score": 0.13229665071770336,
|
4 |
-
"math_score": 0.1736842105263158,
|
5 |
-
"physics_score": 0.09090909090909091,
|
6 |
-
"total_tokens": 359162,
|
7 |
-
"evaluation_time": 4257.714092254639,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/Gemini_2.0_Flash.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "Gemini 2.0 Flash",
|
3 |
-
"score": 0.4217703349282297,
|
4 |
-
"math_score": 0.5526315789473685,
|
5 |
-
"physics_score": 0.2909090909090909,
|
6 |
-
"total_tokens": 731337,
|
7 |
-
"evaluation_time": 857.6413371562958,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/Gemini_2.5_Pro_Preview.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "Gemini 2.5 Pro Preview",
|
3 |
-
"score": 0.5863636363636364,
|
4 |
-
"math_score": 0.8,
|
5 |
-
"physics_score": 0.37272727272727274,
|
6 |
-
"total_tokens": 1394299,
|
7 |
-
"evaluation_time": 4533.155055761337,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/Gemma_3_12B.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "Gemma 3 12B",
|
3 |
-
"score": 0.29832535885167466,
|
4 |
-
"math_score": 0.4421052631578947,
|
5 |
-
"physics_score": 0.15454545454545454,
|
6 |
-
"total_tokens": 441055,
|
7 |
-
"evaluation_time": 3916.2552330493927,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/Gemma_3_27B.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "Gemma 3 27B",
|
3 |
-
"score": 0.32057416267942584,
|
4 |
-
"math_score": 0.46842105263157896,
|
5 |
-
"physics_score": 0.17272727272727273,
|
6 |
-
"total_tokens": 357617,
|
7 |
-
"evaluation_time": 2030.33176279068,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/Gemma_3_4B.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "Gemma 3 4B",
|
3 |
-
"score": 0.12416267942583732,
|
4 |
-
"math_score": 0.22105263157894736,
|
5 |
-
"physics_score": 0.02727272727272727,
|
6 |
-
"total_tokens": 572095,
|
7 |
-
"evaluation_time": 1682.6655840873718,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/GigaChat-2-Max.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "GigaChat-2-Max",
|
3 |
-
"score": 0.24952153110047848,
|
4 |
-
"math_score": 0.3263157894736842,
|
5 |
-
"physics_score": 0.17272727272727273,
|
6 |
-
"total_tokens": 220487,
|
7 |
-
"evaluation_time": 1006.1656014919281,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/GigaChat-2-Pro.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "GigaChat-2-Pro",
|
3 |
-
"score": 0.20861244019138758,
|
4 |
-
"math_score": 0.3263157894736842,
|
5 |
-
"physics_score": 0.09090909090909091,
|
6 |
-
"total_tokens": 212196,
|
7 |
-
"evaluation_time": 1002.5515208244324,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/GigaChat-2.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "GigaChat-2",
|
3 |
-
"score": 0.0937799043062201,
|
4 |
-
"math_score": 0.14210526315789473,
|
5 |
-
"physics_score": 0.045454545454545456,
|
6 |
-
"total_tokens": 299747,
|
7 |
-
"evaluation_time": 834.6775443553925,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/GigaChat-Max.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "GigaChat-Max",
|
3 |
-
"score": 0.1394736842105263,
|
4 |
-
"math_score": 0.17894736842105263,
|
5 |
-
"physics_score": 0.1,
|
6 |
-
"total_tokens": 201090,
|
7 |
-
"evaluation_time": 978.7567253112793,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/Qwen2.5_72B_Instruct.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "Qwen2.5 72B Instruct",
|
3 |
-
"score": 0.2784688995215311,
|
4 |
-
"math_score": 0.38421052631578945,
|
5 |
-
"physics_score": 0.17272727272727273,
|
6 |
-
"total_tokens": 366729,
|
7 |
-
"evaluation_time": 2460.056980371475,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/gpt-4.1.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "gpt-4.1",
|
3 |
-
"score": 0.3861244019138756,
|
4 |
-
"math_score": 0.5631578947368421,
|
5 |
-
"physics_score": 0.20909090909090908,
|
6 |
-
"total_tokens": 405803,
|
7 |
-
"evaluation_time": 1918.7988040447235,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/gpt-4o.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "gpt-4o",
|
3 |
-
"score": 0.2617224880382775,
|
4 |
-
"math_score": 0.4052631578947368,
|
5 |
-
"physics_score": 0.11818181818181818,
|
6 |
-
"total_tokens": 468809,
|
7 |
-
"evaluation_time": 1078.4077816009521,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/o3-mini-high.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "o3-mini-high",
|
3 |
-
"score": 0.600956937799043,
|
4 |
-
"math_score": 0.8473684210526315,
|
5 |
-
"physics_score": 0.35454545454545455,
|
6 |
-
"total_tokens": 2455126,
|
7 |
-
"evaluation_time": 4015.4359402656555,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_leaderboard/model_data/external/o4-mini-high.json
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"model_name": "o4-mini-high",
|
3 |
-
"score": 0.5906698564593301,
|
4 |
-
"math_score": 0.8631578947368421,
|
5 |
-
"physics_score": 0.3181818181818182,
|
6 |
-
"total_tokens": 1898964,
|
7 |
-
"evaluation_time": 4623.6044108867645,
|
8 |
-
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|