初始化项目,由ModelHub XC社区提供模型
Model: Vilyam888/Code_analyze.1.0 Source: Original Platform
This commit is contained in:
187
app.py
Normal file
187
app.py
Normal file
@@ -0,0 +1,187 @@
|
||||
"""
|
||||
Gradio Space для интерактивного использования модели Code Analyzer
|
||||
Модель анализирует код студента на основе условия задачи
|
||||
Поддерживает как веб-интерфейс, так и API endpoint
|
||||
"""
|
||||
import gradio as gr
|
||||
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||||
import torch
|
||||
import json
|
||||
from pydantic import BaseModel
|
||||
from typing import Optional
|
||||
|
||||
# Загрузка модели (будет выполнена при первом запуске)
|
||||
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/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]
|
||||
)
|
||||
|
||||
# Gradio автоматически создает API endpoint на /api/predict
|
||||
# Для использования из других проектов:
|
||||
# POST https://YOUR_SPACE_URL.hf.space/api/predict
|
||||
# Body: {"data": ["task", "code"]}
|
||||
|
||||
if __name__ == "__main__":
|
||||
demo.launch(theme=gr.themes.Soft(), server_name="0.0.0.0")
|
||||
Reference in New Issue
Block a user