Vilyam888 commited on
Commit
76fc70e
·
verified ·
1 Parent(s): 9560962

Upload folder using huggingface_hub

Browse files
Files changed (4) hide show
  1. README.md +73 -19
  2. README_SPACE.md +27 -0
  3. app.py +84 -37
  4. inference.py +39 -11
README.md CHANGED
@@ -21,11 +21,23 @@ widget:
21
 
22
  # Code Analyzer Model
23
 
24
- Fine-tuned версия модели Qwen2.5-Coder-3B-Instruct для анализа кода и ответов на вопросы о программировании.
25
 
26
  ## Описание модели
27
 
28
- Эта модель была обучена на датасете ITOG для анализа кода и предоставления ответов на вопросы, связанные с программированием. Модель основана на Qwen2.5-Coder-3B-Instruct и дообучена с использованием LoRA (Low-Rank Adaptation).
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
  ## Быстрый старт
31
 
@@ -40,13 +52,23 @@ Fine-tuned версия модели Qwen2.5-Coder-3B-Instruct для анали
40
 
41
  Если опция "Inference" не отображается в меню "Use this model", создайте интерактивный Gradio Space:
42
 
43
- 1. Перейдите на https://huggingface.co/spaces
44
- 2. Нажмите "Create new Space"
45
- 3. Выберите SDK: **Gradio**
46
- 4. Загрузите файлы `app.py` и `requirements.txt` из этой модели
47
- 5. Space автоматически создаст интерактивный интерфейс!
48
 
49
- Подробные инструкции в файле `README_SPACE.md`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
  ### Вариант 2: Использование локально (Python)
52
 
@@ -57,22 +79,54 @@ pip install transformers torch
57
 
58
  **Простой пример использования:**
59
  ```python
60
- from transformers import pipeline
 
 
61
 
62
- # Создаем pipeline для генерации текста
63
- generator = pipeline(
64
- "text-generation",
65
- model="Vilyam888/Code_analyze.1.0",
 
 
 
 
66
  trust_remote_code=True
67
  )
68
 
69
- # Задаем вопрос
70
- prompt = "Проанализируй этот код:\ndef hello():\n print('Hello, World!')"
71
- text = f"{prompt}\n\nОтвет:\n"
72
 
73
- # Генерируем ответ
74
- result = generator(text, max_new_tokens=512, temperature=0.7)
75
- print(result[0]["generated_text"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  ```
77
 
78
  **Или используйте готовые скрипты из репозитория:**
 
21
 
22
  # Code Analyzer Model
23
 
24
+ Fine-tuned версия модели Qwen2.5-Coder-3B-Instruct для анализа кода студента на основе условия задачи.
25
 
26
  ## Описание модели
27
 
28
+ Эта модель была обучена на датасете ITOG для анализа кода студента. Модель принимает:
29
+ - **Условие задачи** (текстовое описание)
30
+ - **Код решения студента** (Python код)
31
+
32
+ И возвращает детальный анализ в формате JSON, включающий:
33
+ - Оценку правильности решения
34
+ - Анализ соответствия требованиям задачи
35
+ - Оценку качества кода
36
+ - Сильные и слабые стороны решения
37
+ - Рекомендации по улучшению
38
+ - Детальный анализ с обоснованием
39
+
40
+ Модель основана на Qwen2.5-Coder-3B-Instruct и дообучена с использованием LoRA (Low-Rank Adaptation).
41
 
42
  ## Быстрый старт
43
 
 
52
 
53
  Если опция "Inference" не отображается в меню "Use this model", создайте интерактивный Gradio Space:
54
 
55
+ **Быстрая инструкция:**
 
 
 
 
56
 
57
+ 1. Перейдите на https://huggingface.co/spaces
58
+ 2. Нажмите **"Create new Space"**
59
+ 3. Заполните форму:
60
+ - **Space name**: `code-analyzer-demo` (или любое другое)
61
+ - **SDK**: выберите **Gradio**
62
+ - **Hardware**: **CPU Basic** (бесплатно)
63
+ - **Visibility**: **Public**
64
+ 4. Нажмите **"Create Space"**
65
+ 5. Загрузите файлы:
66
+ - `app.py` (из этой модели)
67
+ - `requirements_gradio.txt` → переименуйте в `requirements.txt`
68
+ 6. Дождитесь автоматического запуска (2-5 минут)
69
+ 7. Готово! Интерфейс будет доступен на странице Space
70
+
71
+ **Подробная инструкция:** См. файл `GRADIO_SPACE_INSTRUCTIONS.md` в корне проекта
72
 
73
  ### Вариант 2: Использование локально (Python)
74
 
 
79
 
80
  **Простой пример использования:**
81
  ```python
82
+ from transformers import AutoModelForCausalLM, AutoTokenizer
83
+ import torch
84
+ import json
85
 
86
+ model_name = "Vilyam888/Code_analyze.1.0"
87
+
88
+ # Загрузка модели
89
+ tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
90
+ model = AutoModelForCausalLM.from_pretrained(
91
+ model_name,
92
+ torch_dtype=torch.bfloat16,
93
+ device_map="auto",
94
  trust_remote_code=True
95
  )
96
 
97
+ # Условие задачи
98
+ task = "Напишите функцию, которая принимает список чисел и возвращает сумму всех элементов."
 
99
 
100
+ # Код студента
101
+ code = """def sum_list(numbers):
102
+ total = 0
103
+ for num in numbers:
104
+ total += num
105
+ return total"""
106
+
107
+ # Форматирование входа
108
+ input_text = f"Задача:\n{task}\n\nРешение (код):\n```python\n{code}\n```"
109
+ prompt = f"{input_text}\n\nОтвет:\n"
110
+
111
+ # Генерация анализа
112
+ inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
113
+ with torch.no_grad():
114
+ outputs = model.generate(
115
+ **inputs,
116
+ max_new_tokens=1024,
117
+ temperature=0.7,
118
+ top_p=0.8,
119
+ top_k=20,
120
+ repetition_penalty=1.05,
121
+ do_sample=True
122
+ )
123
+
124
+ # Декодирование и парсинг JSON
125
+ response = tokenizer.decode(outputs[0], skip_special_tokens=True)
126
+ result = response.split("Ответ:")[-1].strip()
127
+ analysis = json.loads(result)
128
+
129
+ print(json.dumps(analysis, ensure_ascii=False, indent=2))
130
  ```
131
 
132
  **Или используйте готовые скрипты из репозитория:**
README_SPACE.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Как создать Gradio Space для интерактивного использования
2
+
3
+ Если опция "Inference" не появляется в меню "Use this model", создайте Gradio Space:
4
+
5
+ ## Шаг 1: Создайте новый Space на Hugging Face
6
+
7
+ 1. Перейдите на https://huggingface.co/spaces
8
+ 2. Нажмите "Create new Space"
9
+ 3. Заполните:
10
+ - **Space name**: `code-analyzer-demo` (или любое другое имя)
11
+ - **SDK**: выберите **Gradio**
12
+ - **Hardware**: выберите **CPU Basic** (бесплатно) или **GPU** (если доступно)
13
+ - **Visibility**: Public
14
+
15
+ ## Шаг 2: Загрузите файлы
16
+
17
+ Загрузите в Space следующие файлы:
18
+ - `app.py` (из этой папки)
19
+ - `requirements_gradio.txt` (переименуйте в `requirements.txt`)
20
+
21
+ ## Шаг 3: Дождитесь запуска
22
+
23
+ Space автоматически запустится и создаст интерактивный интерфейс для вашей модели!
24
+
25
+ ## Альтернатива: Используйте виджет на странице модели
26
+
27
+ На странице модели должен быть виджет внизу страницы, даже если опция "Inference" не в меню.
app.py CHANGED
@@ -1,10 +1,11 @@
1
  """
2
  Gradio Space для интерактивного использования модели Code Analyzer
3
- Загрузите этот файл в Hugging Face Space для создания интерактивного интерфейса
4
  """
5
  import gradio as gr
6
  from transformers import AutoModelForCausalLM, AutoTokenizer
7
  import torch
 
8
 
9
  # Загрузка модели (будет выполнена при первом запуске)
10
  MODEL_NAME = "Vilyam888/Code_analyze.1.0"
@@ -23,28 +24,41 @@ def load_model():
23
  # Глобальные переменные для модели
24
  model, tokenizer = None, None
25
 
26
- def analyze_code(question):
27
- """Генерирует ответ на вопрос"""
 
 
 
 
 
 
 
 
 
28
  global model, tokenizer
29
 
30
  if model is None or tokenizer is None:
31
  return "⏳ Загрузка модели... Пожалуйста, подождите."
32
 
33
- if not question.strip():
34
- return "Пожалуйста, введите вопрос."
 
 
 
35
 
36
  try:
37
- # Форматирование в стиле обучения
38
- text = f"{question}\n\nОтвет:\n"
 
39
 
40
  # Токенизация
41
- inputs = tokenizer(text, return_tensors="pt").to(model.device)
42
 
43
  # Генерация ответа
44
  with torch.no_grad():
45
  outputs = model.generate(
46
  **inputs,
47
- max_new_tokens=512,
48
  temperature=0.7,
49
  top_p=0.8,
50
  top_k=20,
@@ -56,13 +70,21 @@ def analyze_code(question):
56
  # Декодирование ответа
57
  response = tokenizer.decode(outputs[0], skip_special_tokens=True)
58
 
59
- # Извлечение только ответа
60
  if "Ответ:" in response:
61
- answer = response.split("Ответ:")[-1].strip()
62
  else:
63
- answer = response
 
 
 
 
 
 
 
 
 
64
 
65
- return answer
66
  except Exception as e:
67
  return f"❌ Ошибка: {str(e)}"
68
 
@@ -71,55 +93,80 @@ with gr.Blocks(title="Code Analyzer Model", theme=gr.themes.Soft()) as demo:
71
  gr.Markdown("""
72
  # 🔍 Code Analyzer Model
73
 
74
- Fine-tuned модель для анализа кода и ответов на вопросы о программировании.
75
 
76
- **Примеры вопросов:**
77
- - Проанализируй этот код: `def hello(): print('Hello, World!')`
78
- - Объясни, что делает эта функция: `def factorial(n): ...`
79
- - Найди ошибку в коде: `def divide(a, b): return a / b`
 
80
  """)
81
 
82
  with gr.Row():
83
  with gr.Column():
84
- question_input = gr.Textbox(
85
- label="Ваш вопрос",
86
- placeholder="Введите вопрос о коде...",
87
  lines=5
88
  )
89
- submit_btn = gr.Button("Анализировать", variant="primary")
 
 
 
 
 
90
 
91
  with gr.Column():
92
- answer_output = gr.Textbox(
93
- label="Ответ модели",
94
- lines=10,
 
 
 
 
 
95
  interactive=False
96
  )
97
 
98
  # Примеры
99
  gr.Examples(
100
  examples=[
101
- ["Проанализируй этот код:\ndef hello():\n print('Hello, World!')"],
102
- ["Объясни, что делает эта функция:\ndef factorial(n):\n if n <= 1:\n return 1\n return n * factorial(n-1)"],
103
- ["Найди ошибку в коде:\ndef divide(a, b):\n return a / b\n\nresult = divide(10, 0)"],
 
 
 
 
 
104
  ],
105
- inputs=question_input
106
  )
107
 
 
 
 
 
 
 
 
 
 
108
  # Загрузка модели при старте
109
  demo.load(load_model, outputs=None)
110
 
111
  # Обработчик кнопки
112
  submit_btn.click(
113
- fn=analyze_code,
114
- inputs=question_input,
115
- outputs=answer_output
116
  )
117
 
118
- # Обработчик Enter
119
- question_input.submit(
120
- fn=analyze_code,
121
- inputs=question_input,
122
- outputs=answer_output
123
  )
124
 
125
  if __name__ == "__main__":
 
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"
 
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,
 
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
 
 
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
+ label_visibility="visible"
123
+ )
124
+ # Также показываем как текст для удобства копирования
125
+ result_text = gr.Textbox(
126
+ label="Результат (JSON текст)",
127
+ lines=15,
128
  interactive=False
129
  )
130
 
131
  # Примеры
132
  gr.Examples(
133
  examples=[
134
+ [
135
+ "Напишите функцию, которая принимает список чисел и возвращает сумму всех элементов.",
136
+ "def sum_list(numbers):\n total = 0\n for num in numbers:\n total += num\n return total"
137
+ ],
138
+ [
139
+ "Создайте функцию для вычисления факториала числа.",
140
+ "def factorial(n):\n if n <= 1:\n return 1\n return n * factorial(n-1)"
141
+ ],
142
  ],
143
+ inputs=[task_input, code_input]
144
  )
145
 
146
+ def analyze_and_format(task, code):
147
+ """Анализирует код и форматирует результат"""
148
+ result_str = analyze_code(task, code)
149
+ try:
150
+ result_json = json.loads(result_str)
151
+ return result_json, result_str
152
+ except:
153
+ return None, result_str
154
+
155
  # Загрузка модели при старте
156
  demo.load(load_model, outputs=None)
157
 
158
  # Обработчик кнопки
159
  submit_btn.click(
160
+ fn=analyze_and_format,
161
+ inputs=[task_input, code_input],
162
+ outputs=[result_output, result_text]
163
  )
164
 
165
+ # Обработчик Enter в поле кода
166
+ code_input.submit(
167
+ fn=analyze_and_format,
168
+ inputs=[task_input, code_input],
169
+ outputs=[result_output, result_text]
170
  )
171
 
172
  if __name__ == "__main__":
inference.py CHANGED
@@ -19,21 +19,33 @@ def load_model_and_tokenizer(model_name: str):
19
  return model, tokenizer
20
 
21
 
 
 
 
 
 
 
 
 
 
 
22
  def generate_response(
23
  model,
24
  tokenizer,
25
- prompt: str,
26
- max_new_tokens: int = 512,
 
27
  temperature: float = 0.7,
28
  top_p: float = 0.8,
29
  top_k: int = 20,
30
  repetition_penalty: float = 1.05,
31
  ):
32
- """Generate response for a given prompt"""
33
- # Format prompt in training style
34
- text = f"{prompt}\n\nОтвет:\n"
 
35
 
36
- inputs = tokenizer(text, return_tensors="pt").to(model.device)
37
 
38
  with torch.no_grad():
39
  outputs = model.generate(
@@ -57,15 +69,31 @@ def generate_response(
57
 
58
  if __name__ == "__main__":
59
  # Example usage
 
 
60
  model_name = "Vilyam888/Code_analyze.1.0"
61
 
62
  print("Loading model...")
63
  model, tokenizer = load_model_and_tokenizer(model_name)
64
 
65
- prompt = "Проанализируй этот код:\ndef hello():\n print('Hello, World!')"
 
 
 
 
 
 
 
 
 
 
66
 
67
- print(f"\nPrompt: {prompt}\n")
68
- print("Generating response...")
69
 
70
- response = generate_response(model, tokenizer, prompt)
71
- print(f"\nResponse: {response}")
 
 
 
 
 
 
19
  return model, tokenizer
20
 
21
 
22
+ def build_input(task, code):
23
+ """Build input in the same format as used during training"""
24
+ parts = []
25
+ if task.strip():
26
+ parts.append(f"Задача:\n{task.strip()}")
27
+ if code.strip():
28
+ parts.append(f"Решение (код):\n```python\n{code.strip()}\n```")
29
+ return "\n\n".join(parts)
30
+
31
+
32
  def generate_response(
33
  model,
34
  tokenizer,
35
+ task: str,
36
+ code: str,
37
+ max_new_tokens: int = 1024,
38
  temperature: float = 0.7,
39
  top_p: float = 0.8,
40
  top_k: int = 20,
41
  repetition_penalty: float = 1.05,
42
  ):
43
+ """Generate analysis response for task and student code"""
44
+ # Format input in training style
45
+ input_text = build_input(task, code)
46
+ prompt = f"{input_text}\n\nОтвет:\n"
47
 
48
+ inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
49
 
50
  with torch.no_grad():
51
  outputs = model.generate(
 
69
 
70
  if __name__ == "__main__":
71
  # Example usage
72
+ import json
73
+
74
  model_name = "Vilyam888/Code_analyze.1.0"
75
 
76
  print("Loading model...")
77
  model, tokenizer = load_model_and_tokenizer(model_name)
78
 
79
+ # Example: task and student code
80
+ task = "Напишите функцию, которая принимает список чисел и возвращает сумму всех элементов."
81
+ code = """def sum_list(numbers):
82
+ total = 0
83
+ for num in numbers:
84
+ total += num
85
+ return total"""
86
+
87
+ print(f"\nЗадача: {task}")
88
+ print(f"\nКод студента:\n{code}\n")
89
+ print("Generating analysis...")
90
 
91
+ response = generate_response(model, tokenizer, task, code)
 
92
 
93
+ # Try to parse as JSON
94
+ try:
95
+ result = json.loads(response)
96
+ print(f"\nРезультат анализа (JSON):")
97
+ print(json.dumps(result, ensure_ascii=False, indent=2))
98
+ except json.JSONDecodeError:
99
+ print(f"\nРезультат анализа:\n{response}")