Spaces:
Build error
Build error
| 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() | |