DocUA's picture
Оновлено Пакетний режим тестування. Робочий варіант
ed124cc
raw
history blame
8.2 kB
import gradio as gr
import torch
import os
from classifier_app import ClassifierApp, config
from typing import Dict
def create_interface(app: ClassifierApp) -> gr.Blocks:
"""Створення веб-інтерфейсу"""
# Синхронізуємо інформацію перед створенням інтерфейсу
initial_info = app.sync_system_info()
with gr.Blocks() as demo:
gr.Markdown("# SDC Classifier")
with gr.Tabs():
# Вкладка 1: Тестування одного тексту
with gr.TabItem("Тестування одного тексту"):
with gr.Row():
with gr.Column():
text_input = gr.Textbox(
label="Введіть текст для аналізу",
lines=5,
placeholder="Введіть текст..."
)
threshold_slider = gr.Slider(
minimum=0.0,
maximum=1.0,
value=0.3,
step=0.05,
label="Поріг впевненості"
)
single_process_btn = gr.Button("Проаналізувати")
with gr.Column():
result_text = gr.JSON(label="Результати аналізу")
with gr.Accordion("Налаштування моделі", open=False):
with gr.Row():
model_type = gr.Radio(
choices=["OpenAI", "Local"],
value="OpenAI",
label="Тип моделі"
)
model_choice = gr.Dropdown(
choices=config.DEFAULT_OPENAI_MODELS,
value=config.DEFAULT_OPENAI_MODELS[0],
label="OpenAI model",
visible=True
)
local_model_path = gr.Textbox(
value=config.DEFAULT_LOCAL_MODEL,
label="Шлях до локальної моделі",
visible=False
)
device_choice = gr.Radio(
choices=["cuda", "cpu"],
value="cuda" if torch.cuda.is_available() else "cpu",
label="Пристрій для локальної моделі",
visible=False
)
with gr.Row():
json_file = gr.File(
label="Завантажити новий JSON з класами",
file_types=[".json"]
)
force_rebuild = gr.Checkbox(
label="Примусово перебудувати signatures",
value=False
)
with gr.Row():
build_btn = gr.Button("Оновити signatures")
build_out = gr.Label(label="Статус signatures")
cache_stats = gr.JSON(label="Статистика кешу", value={})
# Вкладка 2: Інформація про систему
with gr.TabItem("Інформація про систему"):
system_info = gr.JSON(
value=app.initial_info,
label="Статус системи"
)
system_md = gr.Markdown()
system_md.value = app.update_system_markdown(app.initial_info)
# Вкладка 3: Пакетна обробка
with gr.TabItem("Пакетна обробка"):
gr.Markdown("## Оцінка класифікації")
with gr.Row():
csv_input = gr.File(
label="CSV файл з колонками Category та Question",
file_types=[".csv"]
)
threshold_slider_batch = gr.Slider(
minimum=0.0,
maximum=1.0,
value=0.3,
step=0.05,
label="Поріг впевненості"
)
evaluate_btn = gr.Button("Оцінити класифікацію")
results_df = gr.DataFrame(
label="Результати класифікації"
)
stats_md = gr.Markdown("### Статистика класифікації")
save_results_btn = gr.Button("Завантажити результати")
download_file = gr.File(label="Завантажити файл з результатами")
save_status = gr.Markdown()
# Підключення обробників подій
model_type.change(
fn=app.update_model_inputs,
inputs=[
model_type,
model_choice,
local_model_path,
device_choice
],
outputs=[
model_choice,
local_model_path,
device_choice,
system_info,
system_md,
build_out,
cache_stats
]
)
build_btn.click(
fn=app.update_classifier_settings,
inputs=[
json_file,
model_type,
model_choice,
local_model_path,
device_choice,
force_rebuild
],
outputs=[build_out, cache_stats, system_info, system_md]
)
single_process_btn.click(
fn=app.process_single_text,
inputs=[text_input, threshold_slider],
outputs=result_text
)
evaluate_btn.click(
fn=app.evaluate_batch,
inputs=[csv_input, threshold_slider_batch],
outputs=[results_df, stats_md]
)
save_results_btn.click(
fn=app.save_evaluation_results,
outputs=[download_file, save_status]
)
return demo
def main():
try:
print("\nЗапуск програми...")
app = ClassifierApp()
print("\nПочаток ініціалізації середовища...")
init_result, classifier = app.initialize_environment()
print("\nРезультат ініціалізації:")
print(f"Статус: {init_result['status']}")
if init_result.get('errors'):
print("Помилки:", init_result['errors'])
if classifier is None or init_result["status"] != "success":
print("\nНе вдалося ініціалізувати середовище")
return
print(f"\nІнформація про систему:")
print(f"Кількість завантажених класів: {len(init_result['classes_info']['classes_list'])}")
print(f"Сигнатури: {'Завантажено' if os.path.exists(config.DEFAULT_SIGNATURES_FILE) else 'Створюються'}")
demo = create_interface(app)
demo.launch(server_name="0.0.0.0", server_port=7860, share=True)
except Exception as e:
print(f"\nКритична помилка в main(): {str(e)}")
import traceback
print("\nДетальний traceback:")
print(traceback.format_exc())
if __name__ == "__main__":
main()