Vilyam888 commited on
Commit
effdbb9
·
verified ·
1 Parent(s): 73505e9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +176 -172
app.py CHANGED
@@ -1,172 +1,176 @@
1
- """
2
- Gradio Space для интерактивного использования модели Code Analyzer
3
- Модель анализирует код студента на основе условия задачи
4
- """
5
- import gradio as gr
6
- from transformers import AutoModelForCausalLM, AutoTokenizer
7
- import torch
8
- import json
9
-
10
- # Загрузка модели (будет выполнена при первом запуске)
11
- MODEL_NAME = "Vilyam888/Code_analyze.1.0"
12
-
13
- def load_model():
14
- """Загружает модель один раз при старте"""
15
- tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True)
16
- model = AutoModelForCausalLM.from_pretrained(
17
- MODEL_NAME,
18
- torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
19
- device_map="auto",
20
- trust_remote_code=True
21
- )
22
- return model, tokenizer
23
-
24
- # Глобальные переменные для модели
25
- model, tokenizer = None, None
26
-
27
- def build_input(task, code):
28
- """Форматирует вход в том же формате, что использовался при обучении"""
29
- parts = []
30
- if task.strip():
31
- parts.append(f"Задача:\n{task.strip()}")
32
- if code.strip():
33
- parts.append(f"Решение (код):\n```python\n{code.strip()}\n```")
34
- return "\n\n".join(parts)
35
-
36
- def analyze_code(task, code):
37
- """Анализирует код студента и возвращает результат в формате JSON"""
38
- global model, tokenizer
39
-
40
- if model is None or tokenizer is None:
41
- return " Загрузка модели... Пожалуйста, подождите."
42
-
43
- if not task.strip():
44
- return "❌ Пожалуйста, введите условие задачи."
45
-
46
- if not code.strip():
47
- return "❌ Пожалуйста, введите код решения студента."
48
-
49
- try:
50
- # Форматирование входа в стиле обучения
51
- input_text = build_input(task, code)
52
- prompt = f"{input_text}\n\nОтвет:\n"
53
-
54
- # Токенизация
55
- inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
56
-
57
- # Генерация ответа
58
- with torch.no_grad():
59
- outputs = model.generate(
60
- **inputs,
61
- max_new_tokens=1024, # Увеличено для JSON ответа
62
- temperature=0.7,
63
- top_p=0.8,
64
- top_k=20,
65
- repetition_penalty=1.05,
66
- do_sample=True,
67
- pad_token_id=tokenizer.eos_token_id
68
- )
69
-
70
- # Декодирование ответа
71
- response = tokenizer.decode(outputs[0], skip_special_tokens=True)
72
-
73
- # Извлечение JSON ответа
74
- if "Ответ:" in response:
75
- json_str = response.split("Ответ:")[-1].strip()
76
- else:
77
- json_str = response
78
-
79
- # Попытка распарсить JSON
80
- try:
81
- result = json.loads(json_str)
82
- # Форматируем JSON для красивого отображения
83
- return json.dumps(result, ensure_ascii=False, indent=2)
84
- except json.JSONDecodeError:
85
- # Если не JSON, возвращаем как есть
86
- return json_str
87
-
88
- except Exception as e:
89
- return f"❌ Ошибка: {str(e)}"
90
-
91
- # Создание Gradio интерфейса
92
- with gr.Blocks(title="Code Analyzer Model") as demo:
93
- gr.Markdown("""
94
- # 🔍 Code Analyzer Model
95
-
96
- Модель для анализа кода студента на основе условия задачи.
97
-
98
- **Как использовать:**
99
- 1. Введите условие задачи в первое поле
100
- 2. Введите код решения студента во второе поле
101
- 3. Нажмите "Анализировать код"
102
- 4. Получите детальный анализ в формате JSON
103
- """)
104
-
105
- with gr.Row():
106
- with gr.Column():
107
- task_input = gr.Textbox(
108
- label="Условие задачи",
109
- placeholder="Введите условие задачи...",
110
- lines=5
111
- )
112
- code_input = gr.Textbox(
113
- label="Код решения студента",
114
- placeholder="Введите код решения...",
115
- lines=10
116
- )
117
- submit_btn = gr.Button("Анализировать код", variant="primary", size="lg")
118
-
119
- with gr.Column():
120
- result_output = gr.JSON(
121
- label="Результат анализа"
122
- )
123
- # Также показываем как текст для удобства копирования
124
- result_text = gr.Textbox(
125
- label="Результат (JSON текст)",
126
- lines=15,
127
- interactive=False
128
- )
129
-
130
- # Примеры
131
- gr.Examples(
132
- examples=[
133
- [
134
- "Напишите функцию, которая принимает список чисел и возвращает сумму всех элементов.",
135
- "def sum_list(numbers):\n total = 0\n for num in numbers:\n total += num\n return total"
136
- ],
137
- [
138
- "Создайте функцию для вычисления факториала числа.",
139
- "def factorial(n):\n if n <= 1:\n return 1\n return n * factorial(n-1)"
140
- ],
141
- ],
142
- inputs=[task_input, code_input]
143
- )
144
-
145
- def analyze_and_format(task, code):
146
- """Анализирует код и форматирует результат"""
147
- result_str = analyze_code(task, code)
148
- try:
149
- result_json = json.loads(result_str)
150
- return result_json, result_str
151
- except:
152
- return None, result_str
153
-
154
- # Загрузка модели при старте
155
- demo.load(load_model, outputs=None)
156
-
157
- # Обработчик кнопки
158
- submit_btn.click(
159
- fn=analyze_and_format,
160
- inputs=[task_input, code_input],
161
- outputs=[result_output, result_text]
162
- )
163
-
164
- # Обработчик Enter в поле кода
165
- code_input.submit(
166
- fn=analyze_and_format,
167
- inputs=[task_input, code_input],
168
- outputs=[result_output, result_text]
169
- )
170
-
171
- if __name__ == "__main__":
172
- demo.launch(theme=gr.themes.Soft())
 
 
 
 
 
1
+ """
2
+ Gradio Space для интерактивного использования модели Code Analyzer
3
+ Модель анализирует код студента на основе условия задачи
4
+ """
5
+ import gradio as gr
6
+ from transformers import AutoModelForCausalLM, AutoTokenizer
7
+ import torch
8
+ import json
9
+
10
+ # Загрузка модели (будет выполнена при первом запуске)
11
+ MODEL_NAME = "Vilyam888/Code_analyze.1.0"
12
+
13
+ def load_model():
14
+ """Загружает модель один раз при старте и сохраняет в глобальные переменные"""
15
+ global model, tokenizer
16
+
17
+ if model is None or tokenizer is None:
18
+ print("Загрузка модели...")
19
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True)
20
+ model = AutoModelForCausalLM.from_pretrained(
21
+ MODEL_NAME,
22
+ torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
23
+ device_map="auto",
24
+ trust_remote_code=True
25
+ )
26
+ print("Модель загружена успешно!")
27
+
28
+ # Глобальные переменные для модели
29
+ model, tokenizer = None, None
30
+
31
+ def build_input(task, code):
32
+ """Форматирует вход в том же формате, что использовался при обучении"""
33
+ parts = []
34
+ if task.strip():
35
+ parts.append(f"Задача:\n{task.strip()}")
36
+ if code.strip():
37
+ parts.append(f"Решение (код):\n```python\n{code.strip()}\n```")
38
+ return "\n\n".join(parts)
39
+
40
+ def analyze_code(task, code):
41
+ """Анализирует код студента и возвращает результат в формате JSON"""
42
+ global model, tokenizer
43
+
44
+ if model is None or tokenizer is None:
45
+ return "⏳ Загрузка модели... Пожалуйста, подождите."
46
+
47
+ if not task.strip():
48
+ return "❌ Пожалуйста, введите условие задачи."
49
+
50
+ if not code.strip():
51
+ return "❌ Пожалуйста, введите код решения студента."
52
+
53
+ try:
54
+ # Форматирование входа в стиле обучения
55
+ input_text = build_input(task, code)
56
+ prompt = f"{input_text}\n\nОтвет:\n"
57
+
58
+ # Токенизация
59
+ inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
60
+
61
+ # Генерация ответа
62
+ with torch.no_grad():
63
+ outputs = model.generate(
64
+ **inputs,
65
+ max_new_tokens=1024, # Увеличено для JSON ответа
66
+ temperature=0.7,
67
+ top_p=0.8,
68
+ top_k=20,
69
+ repetition_penalty=1.05,
70
+ do_sample=True,
71
+ pad_token_id=tokenizer.eos_token_id
72
+ )
73
+
74
+ # Декодирование ответа
75
+ response = tokenizer.decode(outputs[0], skip_special_tokens=True)
76
+
77
+ # Извлечение JSON ответа
78
+ if "Ответ:" in response:
79
+ json_str = response.split("Ответ:")[-1].strip()
80
+ else:
81
+ json_str = response
82
+
83
+ # Попытка распарсить JSON
84
+ try:
85
+ result = json.loads(json_str)
86
+ # Форматируем JSON для красивого отображения
87
+ return json.dumps(result, ensure_ascii=False, indent=2)
88
+ except json.JSONDecodeError:
89
+ # Если не JSON, возвращаем как есть
90
+ return json_str
91
+
92
+ except Exception as e:
93
+ return f"❌ Ошибка: {str(e)}"
94
+
95
+ # Создание Gradio интерфейса
96
+ with gr.Blocks(title="Code Analyzer Model") as demo:
97
+ gr.Markdown("""
98
+ # 🔍 Code Analyzer Model
99
+
100
+ Модель для анализа кода студента на основе условия задачи.
101
+
102
+ **Как использовать:**
103
+ 1. Введите условие задачи в первое поле
104
+ 2. Введите код решения студента во второе поле
105
+ 3. Нажмите "Анализировать код"
106
+ 4. Получите детальный анализ в формате JSON
107
+ """)
108
+
109
+ with gr.Row():
110
+ with gr.Column():
111
+ task_input = gr.Textbox(
112
+ label="Условие задачи",
113
+ placeholder="Введите условие задачи...",
114
+ lines=5
115
+ )
116
+ code_input = gr.Textbox(
117
+ label="Код решения студента",
118
+ placeholder="Введите код решения...",
119
+ lines=10
120
+ )
121
+ submit_btn = gr.Button("Анализировать код", variant="primary", size="lg")
122
+
123
+ with gr.Column():
124
+ result_output = gr.JSON(
125
+ label="Результат анализа"
126
+ )
127
+ # Также показываем как текст для удобства копирования
128
+ result_text = gr.Textbox(
129
+ label="Результат (JSON текст)",
130
+ lines=15,
131
+ interactive=False
132
+ )
133
+
134
+ # Примеры
135
+ gr.Examples(
136
+ examples=[
137
+ [
138
+ "Напишите функцию, которая принимает список чисел и возвращает сумму всех элементов.",
139
+ "def sum_list(numbers):\n total = 0\n for num in numbers:\n total += num\n return total"
140
+ ],
141
+ [
142
+ "Создайте функцию для вычисления факториала числа.",
143
+ "def factorial(n):\n if n <= 1:\n return 1\n return n * factorial(n-1)"
144
+ ],
145
+ ],
146
+ inputs=[task_input, code_input]
147
+ )
148
+
149
+ def analyze_and_format(task, code):
150
+ """Анализирует код и форматирует результат"""
151
+ result_str = analyze_code(task, code)
152
+ try:
153
+ result_json = json.loads(result_str)
154
+ return result_json, result_str
155
+ except:
156
+ return None, result_str
157
+
158
+ # Загрузка модели при старте
159
+ demo.load(load_model, outputs=None)
160
+
161
+ # Обработчик кнопки
162
+ submit_btn.click(
163
+ fn=analyze_and_format,
164
+ inputs=[task_input, code_input],
165
+ outputs=[result_output, result_text]
166
+ )
167
+
168
+ # Обработчик Enter в поле кода
169
+ code_input.submit(
170
+ fn=analyze_and_format,
171
+ inputs=[task_input, code_input],
172
+ outputs=[result_output, result_text]
173
+ )
174
+
175
+ if __name__ == "__main__":
176
+ demo.launch(theme=gr.themes.Soft())