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"
  • {crit}: {score}/5 ({desc})
  • " card_html = f"""

    {model}

    """ 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"### 📌 **Модель `{leader}` лидирует** по выбранным критериям в задаче **{task}**." # Общий анализ по всем задачам 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"""

    ### 🔎 **Общий анализ моделей:** - ChatGPT — средняя оценка: **{avg_all["ChatGPT"]}/5** - GigaChat — средняя оценка: **{avg_all["GigaChat"]}/5** - DeepSeek — средняя оценка: **{avg_all["DeepSeek"]}/5** 📊 **Лидирует модель `{overall_leader}`** по суммарным показателям в выбранных задачах. """ 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()