SimrusDenuvo commited on
Commit
7efd387
·
verified ·
1 Parent(s): 70977e2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -70
app.py CHANGED
@@ -1,8 +1,10 @@
1
  import gradio as gr
2
  import numpy as np
3
  import matplotlib.pyplot as plt
 
 
4
 
5
- # Зададим фиктивные оценки (по шкале 0–10) для каждой модели, задачи и критерия
6
  metrics = {
7
  "Классификация обращений": {
8
  "ChatGPT": {"Точность": 8, "Интерпретируемость": 7, "Стабильность": 7, "Время отклика": 6, "Применимость": 8},
@@ -21,114 +23,121 @@ metrics = {
21
  }
22
  }
23
 
24
- # Функция-обработчик, обновляющая карточки и графики на основе выбранной задачи и критериев
 
 
 
 
 
 
 
 
25
  def update(task, selected_criteria):
26
- # Список моделей для обхода
27
  models = ["ChatGPT", "GigaChat", "DeepSeek"]
28
- # Формируем содержимое карточек (HTML) для каждой модели
29
  cards = []
 
30
  for model in models:
31
  vals = metrics[task][model]
32
- # Если выбраны фильтры, отфильтруем критерии; иначе используем все критерии
33
  criteria = selected_criteria if selected_criteria else list(vals.keys())
34
- # Создаём HTML-код списка критериев и оценок
35
  items_html = ""
36
  for crit in criteria:
37
  score = vals[crit]
38
- # Определяем краткое описание по значению (например, >=8 "Высокая", 5-7 "Средняя", <5 "Низкая")
39
- if score >= 8:
40
- desc = "Высокая"
41
- elif score >= 5:
42
- desc = "Средняя"
43
- else:
44
- desc = "Низкая"
45
  items_html += f"<li>{crit}: {score}/10 ({desc})</li>"
46
  card_html = f"""
47
- <div class="card">
48
  <h3>{model}</h3>
49
  <ul>{items_html}</ul>
50
  </div>
51
  """
52
  cards.append(card_html)
53
-
54
- # График 1: сравнение моделей по выбранным критериям
55
- fig1, ax1 = plt.subplots(figsize=(4.5, 3))
56
- # Если нет выбранных критериев — используем все по умолчанию
57
  criteria = selected_criteria if selected_criteria else list(metrics[task][models[0]].keys())
58
  x = np.arange(len(models))
59
  width = 0.8 / len(criteria)
 
 
 
60
  for i, crit in enumerate(criteria):
61
- # Соберём оценки для каждого модели по критерию
62
  values = [metrics[task][m][crit] for m in models]
63
- ax1.bar(x + i*width, values, width, label=crit)
64
- # Подписи и легенда
 
 
 
65
  ax1.set_xticks(x + width*(len(criteria)-1)/2)
66
  ax1.set_xticklabels(models)
67
- ax1.set_ylim(0, 10)
68
  ax1.set_ylabel("Оценка (0-10)")
69
- ax1.set_title("Сравнение моделей по критериям")
70
- ax1.legend(fontsize=8)
71
- ax1.grid(axis='y', linestyle='--', alpha=0.5)
72
- plt.tight_layout()
73
-
74
- # График 2: средняя оценка моделей по всем задачам (среднее по 5 критериям для каждой модели и задачи)
75
- # Рассчитаем средний балл каждой модели по текущей задаче
 
 
 
 
 
 
76
  avg_scores = []
77
  for model in models:
78
  vals = metrics[task][model]
79
- avg_score = np.mean(list(vals.values()))
80
- avg_scores.append(avg_score)
81
- fig2, ax2 = plt.subplots(figsize=(4.5, 3))
82
- ax2.bar(models, avg_scores, color=['#4c78a8','#f58518','#54a24b'])
83
- ax2.set_ylim(0, 10)
 
 
 
 
 
84
  ax2.set_ylabel("Средний балл")
85
  ax2.set_title("Средний балл моделей")
86
- ax2.grid(axis='y', linestyle='--', alpha=0.5)
87
- plt.tight_layout()
88
-
89
- # Определяем лидера: модель с максимальным суммой баллов по выбранным критериям
90
- if selected_criteria:
91
- sums = {model: sum(metrics[task][model][crit] for crit in selected_criteria) for model in models}
92
- else:
93
- sums = {model: sum(metrics[task][model].values()) for model in models}
 
 
94
  leader = max(sums, key=sums.get)
95
- result_text = f"Модель **{leader}** лидирует по выбранным критериям в задаче **{task}**."
96
-
97
- # Возвращаем HTML-карточки, два графика и текст результата
98
- # Gradio поддерживает возвращение нескольких компонентов: (str, str, str, fig, fig, str)
99
- return cards[0], cards[1], cards[2], fig1, fig2, result_text
100
 
101
- # CSS-стили для дашборда (единый шрифт, стилизация карточек и выравнивание)
 
 
102
  css = """
103
- .gradio-container { font-family: Arial, sans-serif; background-color: #f0f2f5; padding: 20px; }
104
- .card { background: white; border: 1px solid #ccc; border-radius: 8px; padding: 10px; margin: 10px; }
105
- .card h3 { text-align: center; margin: 0 0 5px 0; }
106
- .card ul { list-style: none; padding-left: 0; }
107
- .card li { margin: 4px 0; font-size: 14px; }
108
  """
109
 
110
- # Построение интерфейса с помощью Blocks
111
- with gr.Blocks(css=css) as demo:
112
  gr.Markdown("## Сравнение моделей ChatGPT, GigaChat и DeepSeek", elem_id="title")
113
  with gr.Row():
114
  with gr.Column(scale=2):
115
- task_dropdown = gr.Dropdown(label="Выбор задачи",
116
- choices=list(metrics.keys()),
117
- value="Классификация обращений")
118
- criteria_check = gr.CheckboxGroup(label="Фильтр критериев",
119
- choices=list(next(iter(metrics.values()))["ChatGPT"].keys()))
120
- # Три колонки для карточек моделей
121
- card1 = gr.HTML(elem_classes="card")
122
- card2 = gr.HTML(elem_classes="card")
123
- card3 = gr.HTML(elem_classes="card")
124
  with gr.Row():
125
- chart1 = gr.Plot(label="Сравнение по критериям")
126
- chart2 = gr.Plot(label="Средний балл")
127
- result_md = gr.Markdown(label="Лидер")
128
-
129
- # Привязываем обновление к изменениям выбора задачи и критериев
130
  task_dropdown.change(update, [task_dropdown, criteria_check], [card1, card2, card3, chart1, chart2, result_md])
131
  criteria_check.change(update, [task_dropdown, criteria_check], [card1, card2, card3, chart1, chart2, result_md])
132
 
133
- # Запуск приложения (локально)
134
  demo.launch()
 
1
  import gradio as gr
2
  import numpy as np
3
  import matplotlib.pyplot as plt
4
+ import io
5
+ from PIL import Image
6
 
7
+ # Данные
8
  metrics = {
9
  "Классификация обращений": {
10
  "ChatGPT": {"Точность": 8, "Интерпретируемость": 7, "Стабильность": 7, "Время отклика": 6, "Применимость": 8},
 
23
  }
24
  }
25
 
26
+ # Вспомогательная функция: сохраняем matplotlib-plot как изображение
27
+ def fig_to_image(fig):
28
+ buf = io.BytesIO()
29
+ fig.savefig(buf, format="png", bbox_inches="tight", dpi=150)
30
+ buf.seek(0)
31
+ img = Image.open(buf)
32
+ return img
33
+
34
+ # Главная функция обновления
35
  def update(task, selected_criteria):
 
36
  models = ["ChatGPT", "GigaChat", "DeepSeek"]
 
37
  cards = []
38
+
39
  for model in models:
40
  vals = metrics[task][model]
 
41
  criteria = selected_criteria if selected_criteria else list(vals.keys())
 
42
  items_html = ""
43
  for crit in criteria:
44
  score = vals[crit]
45
+ desc = "Высокая" if score >= 8 else "Средняя" if score >= 5 else "Низкая"
 
 
 
 
 
 
46
  items_html += f"<li>{crit}: {score}/10 ({desc})</li>"
47
  card_html = f"""
48
+ <div class="card dark-card">
49
  <h3>{model}</h3>
50
  <ul>{items_html}</ul>
51
  </div>
52
  """
53
  cards.append(card_html)
54
+
 
 
 
55
  criteria = selected_criteria if selected_criteria else list(metrics[task][models[0]].keys())
56
  x = np.arange(len(models))
57
  width = 0.8 / len(criteria)
58
+
59
+ # График 1: сравнение по критериям
60
+ fig1, ax1 = plt.subplots(figsize=(5, 3))
61
  for i, crit in enumerate(criteria):
 
62
  values = [metrics[task][m][crit] for m in models]
63
+ bars = ax1.bar(x + i * width, values, width, label=crit)
64
+ for bar in bars:
65
+ height = bar.get_height()
66
+ ax1.annotate(f'{height}', xy=(bar.get_x() + bar.get_width() / 2, height + 0.1),
67
+ ha='center', fontsize=8)
68
  ax1.set_xticks(x + width*(len(criteria)-1)/2)
69
  ax1.set_xticklabels(models)
70
+ ax1.set_ylim(0, 10.5)
71
  ax1.set_ylabel("Оценка (0-10)")
72
+ ax1.set_title(f"Сравнение моделей по критериям\nЗадача: {task}")
73
+ ax1.legend(fontsize=7)
74
+ ax1.grid(axis='y', linestyle='--', alpha=0.3)
75
+ fig1.patch.set_facecolor('#1e1e1e')
76
+ ax1.set_facecolor('#1e1e1e')
77
+ ax1.tick_params(colors='white')
78
+ ax1.yaxis.label.set_color('white')
79
+ ax1.xaxis.label.set_color('white')
80
+ ax1.title.set_color('white')
81
+ ax1.legend().get_frame().set_facecolor('#2e2e2e')
82
+ ax1.legend().get_frame().set_edgecolor('#444')
83
+
84
+ # График 2: средние оценки
85
  avg_scores = []
86
  for model in models:
87
  vals = metrics[task][model]
88
+ avg = np.mean([vals[crit] for crit in criteria])
89
+ avg_scores.append(avg)
90
+
91
+ fig2, ax2 = plt.subplots(figsize=(5, 3))
92
+ bars = ax2.bar(models, avg_scores, color=['#4c78a8','#f58518','#54a24b'])
93
+ for bar in bars:
94
+ height = bar.get_height()
95
+ ax2.annotate(f'{height:.1f}', xy=(bar.get_x() + bar.get_width() / 2, height + 0.1),
96
+ ha='center', fontsize=8)
97
+ ax2.set_ylim(0, 10.5)
98
  ax2.set_ylabel("Средний балл")
99
  ax2.set_title("Средний балл моделей")
100
+ ax2.grid(axis='y', linestyle='--', alpha=0.3)
101
+ fig2.patch.set_facecolor('#1e1e1e')
102
+ ax2.set_facecolor('#1e1e1e')
103
+ ax2.tick_params(colors='white')
104
+ ax2.yaxis.label.set_color('white')
105
+ ax2.xaxis.label.set_color('white')
106
+ ax2.title.set_color('white')
107
+
108
+ # Лидер по сумме выбранных критериев
109
+ sums = {model: sum(metrics[task][model][crit] for crit in criteria) for model in models}
110
  leader = max(sums, key=sums.get)
111
+ result = f"📌 **Модель `{leader}` лидирует** по выбранным критериям в задаче **{task}**."
 
 
 
 
112
 
113
+ return cards[0], cards[1], cards[2], fig_to_image(fig1), fig_to_image(fig2), result
114
+
115
+ # Тёмный стиль
116
  css = """
117
+ .gradio-container { font-family: Arial, sans-serif; background-color: #181818; color: white; }
118
+ .card.dark-card { background: #2e2e2e; border-radius: 8px; padding: 10px; margin: 10px; }
119
+ .card.dark-card h3 { text-align: center; color: #fff; margin-bottom: 6px; }
120
+ .card.dark-card ul { list-style: none; padding-left: 0; color: #ddd; font-size: 14px; }
121
+ .card.dark-card li { margin: 4px 0; }
122
  """
123
 
124
+ # Интерфейс
125
+ with gr.Blocks(css=css, theme=gr.themes.Base()) as demo:
126
  gr.Markdown("## Сравнение моделей ChatGPT, GigaChat и DeepSeek", elem_id="title")
127
  with gr.Row():
128
  with gr.Column(scale=2):
129
+ task_dropdown = gr.Dropdown(label="Выбор задачи", choices=list(metrics.keys()), value="Классификация обращений")
130
+ criteria_check = gr.CheckboxGroup(label="Фильтр критериев", choices=list(next(iter(metrics.values()))["ChatGPT"].keys()))
131
+ card1 = gr.HTML()
132
+ card2 = gr.HTML()
133
+ card3 = gr.HTML()
 
 
 
 
134
  with gr.Row():
135
+ chart1 = gr.Image(label="Сравнение по критериям", interactive=True)
136
+ chart2 = gr.Image(label="Средний балл", interactive=True)
137
+ result_md = gr.Markdown()
138
+
139
+ # Обновление при выборе
140
  task_dropdown.change(update, [task_dropdown, criteria_check], [card1, card2, card3, chart1, chart2, result_md])
141
  criteria_check.change(update, [task_dropdown, criteria_check], [card1, card2, card3, chart1, chart2, result_md])
142
 
 
143
  demo.launch()