Spaces:
Build error
Build error
Update app.py
Browse files
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 |
-
#
|
| 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 |
-
|
| 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=
|
| 71 |
-
ax1.grid(axis='y', linestyle='--', alpha=0.
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
avg_scores = []
|
| 77 |
for model in models:
|
| 78 |
vals = metrics[task][model]
|
| 79 |
-
|
| 80 |
-
avg_scores.append(
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
ax2.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
ax2.set_ylabel("Средний балл")
|
| 85 |
ax2.set_title("Средний балл моделей")
|
| 86 |
-
ax2.grid(axis='y', linestyle='--', alpha=0.
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
|
|
|
|
|
|
| 94 |
leader = max(sums, key=sums.get)
|
| 95 |
-
|
| 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 |
-
|
|
|
|
|
|
|
| 102 |
css = """
|
| 103 |
-
.gradio-container { font-family: Arial, sans-serif; background-color: #
|
| 104 |
-
.card { background:
|
| 105 |
-
.card h3 { text-align: center;
|
| 106 |
-
.card ul { list-style: none; padding-left: 0; }
|
| 107 |
-
.card li { margin: 4px 0;
|
| 108 |
"""
|
| 109 |
|
| 110 |
-
#
|
| 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 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 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.
|
| 126 |
-
chart2 = gr.
|
| 127 |
-
result_md = gr.Markdown(
|
| 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()
|