| """
|
| Gradio Space для интерактивного использования модели Code Analyzer
|
| Модель анализирует код студента на основе условия задачи
|
| """
|
| import gradio as gr
|
| from transformers import AutoModelForCausalLM, AutoTokenizer
|
| import torch
|
| import json
|
|
|
|
|
| MODEL_NAME = "Vilyam888/Code_analyze.1.0"
|
|
|
| def load_model():
|
| """Загружает модель один раз при старте"""
|
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True)
|
| model = AutoModelForCausalLM.from_pretrained(
|
| MODEL_NAME,
|
| torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
|
| device_map="auto",
|
| trust_remote_code=True
|
| )
|
| return model, tokenizer
|
|
|
|
|
| model, tokenizer = None, None
|
|
|
| def build_input(task, code):
|
| """Форматирует вход в том же формате, что использовался при обучении"""
|
| parts = []
|
| if task.strip():
|
| parts.append(f"Задача:\n{task.strip()}")
|
| if code.strip():
|
| parts.append(f"Решение (код):\n```python\n{code.strip()}\n```")
|
| return "\n\n".join(parts)
|
|
|
| def analyze_code(task, code):
|
| """Анализирует код студента и возвращает результат в формате JSON"""
|
| global model, tokenizer
|
|
|
| if model is None or tokenizer is None:
|
| return "⏳ Загрузка модели... Пожалуйста, подождите."
|
|
|
| if not task.strip():
|
| return "❌ Пожалуйста, введите условие задачи."
|
|
|
| if not code.strip():
|
| return "❌ Пожалуйста, введите код решения студента."
|
|
|
| try:
|
|
|
| input_text = build_input(task, code)
|
| prompt = f"{input_text}\n\nОтвет:\n"
|
|
|
|
|
| inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
|
|
|
|
| with torch.no_grad():
|
| outputs = model.generate(
|
| **inputs,
|
| max_new_tokens=1024,
|
| temperature=0.7,
|
| top_p=0.8,
|
| top_k=20,
|
| repetition_penalty=1.05,
|
| do_sample=True,
|
| pad_token_id=tokenizer.eos_token_id
|
| )
|
|
|
|
|
| response = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
|
|
|
|
| if "Ответ:" in response:
|
| json_str = response.split("Ответ:")[-1].strip()
|
| else:
|
| json_str = response
|
|
|
|
|
| try:
|
| result = json.loads(json_str)
|
|
|
| return json.dumps(result, ensure_ascii=False, indent=2)
|
| except json.JSONDecodeError:
|
|
|
| return json_str
|
|
|
| except Exception as e:
|
| return f"❌ Ошибка: {str(e)}"
|
|
|
|
|
| with gr.Blocks(title="Code Analyzer Model") as demo:
|
| gr.Markdown("""
|
| # 🔍 Code Analyzer Model
|
|
|
| Модель для анализа кода студента на основе условия задачи.
|
|
|
| **Как использовать:**
|
| 1. Введите условие задачи в первое поле
|
| 2. Введите код решения студента во второе поле
|
| 3. Нажмите "Анализировать код"
|
| 4. Получите детальный анализ в формате JSON
|
| """)
|
|
|
| with gr.Row():
|
| with gr.Column():
|
| task_input = gr.Textbox(
|
| label="Условие задачи",
|
| placeholder="Введите условие задачи...",
|
| lines=5
|
| )
|
| code_input = gr.Textbox(
|
| label="Код решения студента",
|
| placeholder="Введите код решения...",
|
| lines=10
|
| )
|
| submit_btn = gr.Button("Анализировать код", variant="primary", size="lg")
|
|
|
| with gr.Column():
|
| result_output = gr.JSON(
|
| label="Результат анализа"
|
| )
|
|
|
| result_text = gr.Textbox(
|
| label="Результат (JSON текст)",
|
| lines=15,
|
| interactive=False
|
| )
|
|
|
|
|
| gr.Examples(
|
| examples=[
|
| [
|
| "Напишите функцию, которая принимает список чисел и возвращает сумму всех элементов.",
|
| "def sum_list(numbers):\n total = 0\n for num in numbers:\n total += num\n return total"
|
| ],
|
| [
|
| "Создайте функцию для вычисления факториала числа.",
|
| "def factorial(n):\n if n <= 1:\n return 1\n return n * factorial(n-1)"
|
| ],
|
| ],
|
| inputs=[task_input, code_input]
|
| )
|
|
|
| def analyze_and_format(task, code):
|
| """Анализирует код и форматирует результат"""
|
| result_str = analyze_code(task, code)
|
| try:
|
| result_json = json.loads(result_str)
|
| return result_json, result_str
|
| except:
|
| return None, result_str
|
|
|
|
|
| demo.load(load_model, outputs=None)
|
|
|
|
|
| submit_btn.click(
|
| fn=analyze_and_format,
|
| inputs=[task_input, code_input],
|
| outputs=[result_output, result_text]
|
| )
|
|
|
|
|
| code_input.submit(
|
| fn=analyze_and_format,
|
| inputs=[task_input, code_input],
|
| outputs=[result_output, result_text]
|
| )
|
|
|
| if __name__ == "__main__":
|
| demo.launch(theme=gr.themes.Soft())
|
|
|