giga / app.py
SimrusDenuvo's picture
Update app.py
19b9e57 verified
import gradio as gr
import numpy as np
import matplotlib.pyplot as plt
import io
from PIL import Image
# Оценки от 1 до 5
metrics = {
"Классификация обращений": {
"ChatGPT": {"Точность": 5, "Интерпретируемость": 4, "Стабильность": 4, "Время отклика": 4, "Применимость": 4},
"GigaChat": {"Точность": 4, "Интерпретируемость": 3, "Стабильность": 4, "Время отклика": 5, "Применимость": 4},
"DeepSeek": {"Точность": 3, "Интерпретируемость": 4, "Стабильность": 3, "Время отклика": 4, "Применимость": 4},
},
"Антифрод": {
"ChatGPT": {"Точность": 4, "Интерпретируемость": 3, "Стабильность": 5, "Время отклика": 3, "Применимость": 3},
"GigaChat": {"Точность": 5, "Интерпретируемость": 4, "Стабильность": 4, "Время отклика": 3, "Применимость": 4},
"DeepSeek": {"Точность": 3, "Интерпретируемость": 3, "Стабильность": 4, "Время отклика": 5, "Применимость": 4},
},
"Генерация SQL": {
"ChatGPT": {"Точность": 5, "Интерпретируемость": 4, "Стабильность": 4, "Время отклика": 3, "Применимость": 4},
"GigaChat": {"Точность": 3, "Интерпретируемость": 3, "Стабильность": 3, "Время отклика": 4, "Применимость": 3},
"DeepSeek": {"Точность": 4, "Интерпретируемость": 3, "Стабильность": 5, "Время отклика": 5, "Применимость": 4},
}
}
def fig_to_image(fig):
buf = io.BytesIO()
fig.savefig(buf, format="png", bbox_inches="tight", dpi=150)
buf.seek(0)
return Image.open(buf)
def update(task, selected_criteria):
models = ["ChatGPT", "GigaChat", "DeepSeek"]
cards = []
for model in models:
vals = metrics[task][model]
criteria = selected_criteria if selected_criteria else list(vals.keys())
items_html = ""
for crit in criteria:
score = vals[crit]
desc = "Высокая" if score == 5 else "Средняя" if score >= 3 else "Низкая"
items_html += f"<li>{crit}: {score}/5 ({desc})</li>"
card_html = f"""
<div class="card dark-card">
<h3>{model}</h3>
<ul>{items_html}</ul>
</div>
"""
cards.append(card_html)
criteria = selected_criteria if selected_criteria else list(metrics[task][models[0]].keys())
x = np.arange(len(models))
width = 0.8 / len(criteria)
# График 1
fig1, ax1 = plt.subplots(figsize=(5, 3))
for i, crit in enumerate(criteria):
values = [metrics[task][m][crit] for m in models]
bars = ax1.bar(x + i * width, values, width, label=crit)
for bar in bars:
height = bar.get_height()
ax1.annotate(f'{height}', xy=(bar.get_x() + bar.get_width() / 2, height + 0.15),
ha='center', fontsize=9, color='white')
ax1.set_xticks(x + width*(len(criteria)-1)/2)
ax1.set_xticklabels(models)
ax1.set_ylim(0, 5.5)
ax1.set_ylabel("Оценка (1–5)")
ax1.set_title(f"Сравнение моделей по критериям\nЗадача: {task}")
ax1.grid(axis='y', linestyle='--', alpha=0.3)
# Стили
fig1.patch.set_facecolor('#1e1e1e')
ax1.set_facecolor('#1e1e1e')
ax1.tick_params(colors='white')
ax1.yaxis.label.set_color('white')
ax1.xaxis.label.set_color('white')
ax1.title.set_color('white')
# Легенда (сверху, вне графика)
ax1.legend(
fontsize=8,
loc='lower center',
bbox_to_anchor=(0.5, 1.05),
ncol=3,
frameon=True
)
ax1.legend().get_frame().set_facecolor('#2e2e2e')
ax1.legend().get_frame().set_edgecolor('#444')
ax1.xaxis.labelpad = 10
fig1.subplots_adjust(top=0.85, bottom=0.25)
# График 2
avg_scores = []
for model in models:
vals = metrics[task][model]
avg = np.mean([vals[crit] for crit in criteria])
avg_scores.append(avg)
fig2, ax2 = plt.subplots(figsize=(5, 3))
bars = ax2.bar(models, avg_scores, color=['#4c78a8','#f58518','#54a24b'])
for bar in bars:
height = bar.get_height()
ax2.annotate(f'{height:.2f}', xy=(bar.get_x() + bar.get_width() / 2, height + 0.15),
ha='center', fontsize=9, color='white')
ax2.set_ylim(0, 5.5)
ax2.set_ylabel("Средний балл (1–5)")
ax2.set_title("Средний балл моделей")
ax2.grid(axis='y', linestyle='--', alpha=0.3)
fig2.patch.set_facecolor('#1e1e1e')
ax2.set_facecolor('#1e1e1e')
ax2.tick_params(colors='white')
ax2.yaxis.label.set_color('white')
ax2.xaxis.label.set_color('white')
ax2.title.set_color('white')
ax2.xaxis.labelpad = 10
fig2.subplots_adjust(bottom=0.25)
# Лидер в текущей задаче
sums = {model: sum(metrics[task][model][crit] for crit in criteria) for model in models}
leader = max(sums, key=sums.get)
result = f"### 📌 <span style='font-size: 18px;'>**Модель `{leader}` лидирует** по выбранным критериям в задаче **{task}**.</span>"
# Общий анализ по всем задачам
model_scores = {model: [] for model in models}
for tsk in metrics:
for model in models:
vals = metrics[tsk][model]
selected = selected_criteria if selected_criteria else vals.keys()
model_scores[model].extend([vals[c] for c in selected])
avg_all = {model: round(np.mean(scores), 2) for model, scores in model_scores.items()}
overall_leader = max(avg_all, key=avg_all.get)
analysis_text = f"""
<br><br>
### 🔎 <span style='font-size: 17px;'>**Общий анализ моделей:**</span>
- ChatGPT — средняя оценка: **{avg_all["ChatGPT"]}/5**
- GigaChat — средняя оценка: **{avg_all["GigaChat"]}/5**
- DeepSeek — средняя оценка: **{avg_all["DeepSeek"]}/5**
📊 <span style='font-size: 18px;'>**Лидирует модель `{overall_leader}`** по суммарным показателям в выбранных задачах.</span>
"""
return cards[0], cards[1], cards[2], fig_to_image(fig1), fig_to_image(fig2), result + analysis_text
# CSS
css = """
.gradio-container { font-family: Arial, sans-serif; background-color: #181818; color: white; }
.card.dark-card { background: #2e2e2e; border-radius: 8px; padding: 10px; margin: 10px; }
.card.dark-card h3 { text-align: center; color: #fff; margin-bottom: 6px; }
.card.dark-card ul { list-style: none; padding-left: 0; color: #ddd; font-size: 14px; }
.card.dark-card li { margin: 4px 0; }
"""
# Интерфейс
with gr.Blocks(css=css) as demo:
gr.Markdown("## Сравнение моделей ChatGPT, GigaChat и DeepSeek", elem_id="title")
with gr.Row():
with gr.Column(scale=2):
task_dropdown = gr.Dropdown(label="Выбор задачи", choices=list(metrics.keys()), value="Классификация обращений")
criteria_check = gr.CheckboxGroup(label="Фильтр критериев", choices=list(next(iter(metrics.values()))["ChatGPT"].keys()))
card1 = gr.HTML()
card2 = gr.HTML()
card3 = gr.HTML()
with gr.Row():
chart1 = gr.Image(label="Сравнение по критериям", interactive=True)
chart2 = gr.Image(label="Средний балл", interactive=True)
result_md = gr.Markdown()
task_dropdown.change(update, [task_dropdown, criteria_check], [card1, card2, card3, chart1, chart2, result_md])
criteria_check.change(update, [task_dropdown, criteria_check], [card1, card2, card3, chart1, chart2, result_md])
demo.launch()