Vilyam888's picture
Update app.py
95b9705 verified
"""
Gradio Space для интерактивного использования модели Code Analyzer
Модель анализирует код студента на основе условия задачи
Поддерживает как веб-интерфейс, так и API endpoint
"""
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import json
# Загрузка модели (будет выполнена при первом запуске)
MODEL_NAME = "Vilyam888/Code_analyze.1.0"
def load_model():
"""Загружает модель один раз при старте и сохраняет в глобальные переменные"""
global model, tokenizer
if model is None or tokenizer is None:
print("Загрузка модели...")
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
)
print("Модель загружена успешно!")
# Глобальные переменные для модели
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=600, # Оптимизировано для CPU
temperature=0.7,
top_p=0.85,
top_k=20,
repetition_penalty=1.05,
do_sample=True,
pad_token_id=tokenizer.eos_token_id,
eos_token_id=tokenizer.eos_token_id
)
# Декодирование ответа
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Извлечение JSON ответа
if "Ответ:" in response:
json_str = response.split("Ответ:")[-1].strip()
else:
json_str = response
# Попытка распарсить JSON
try:
result = json.loads(json_str)
# Форматируем JSON для красивого отображения
return json.dumps(result, ensure_ascii=False, indent=2)
except json.JSONDecodeError:
# Если не JSON, возвращаем как есть
return json_str
except Exception as e:
return f"❌ Ошибка: {str(e)}"
# Создание Gradio интерфейса
with gr.Blocks(title="Code Analyzer Model") as demo:
gr.Markdown("""
# 🔍 Code Analyzer Model
Модель для анализа кода студента на основе условия задачи.
**Как использовать:**
1. Введите условие задачи в первое поле
2. Введите код решения студента во второе поле
3. Нажмите "Анализировать код"
4. Получите детальный анализ в формате JSON
**API Endpoint:** Используйте встроенный API Gradio через `/api/predict`
""")
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]
)
# Обработчик Enter в поле кода
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(), server_name="0.0.0.0")