| """
|
| Inference code for Code Analyzer Model
|
| This file enables the "Use this model" button on Hugging Face.
|
| """
|
|
|
| from transformers import AutoModelForCausalLM, AutoTokenizer
|
| import torch
|
|
|
|
|
| def load_model_and_tokenizer(model_name: str):
|
| """Load model and tokenizer"""
|
| 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
|
|
|
|
|
| def build_input(task, code):
|
| """Build input in the same format as used during training"""
|
| 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 generate_response(
|
| model,
|
| tokenizer,
|
| task: str,
|
| code: str,
|
| max_new_tokens: int = 1024,
|
| temperature: float = 0.7,
|
| top_p: float = 0.8,
|
| top_k: int = 20,
|
| repetition_penalty: float = 1.05,
|
| ):
|
| """Generate analysis response for task and student code"""
|
|
|
| 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=max_new_tokens,
|
| temperature=temperature,
|
| top_p=top_p,
|
| top_k=top_k,
|
| repetition_penalty=repetition_penalty,
|
| do_sample=True,
|
| pad_token_id=tokenizer.eos_token_id
|
| )
|
|
|
| response = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
|
|
| if "Ответ:" in response:
|
| response = response.split("Ответ:")[-1].strip()
|
|
|
| return response
|
|
|
|
|
| if __name__ == "__main__":
|
|
|
| import json
|
|
|
| model_name = "Vilyam888/Code_analyze.1.0"
|
|
|
| print("Loading model...")
|
| model, tokenizer = load_model_and_tokenizer(model_name)
|
|
|
|
|
| task = "Напишите функцию, которая принимает список чисел и возвращает сумму всех элементов."
|
| code = """def sum_list(numbers):
|
| total = 0
|
| for num in numbers:
|
| total += num
|
| return total"""
|
|
|
| print(f"\nЗадача: {task}")
|
| print(f"\nКод студента:\n{code}\n")
|
| print("Generating analysis...")
|
|
|
| response = generate_response(model, tokenizer, task, code)
|
|
|
|
|
| try:
|
| result = json.loads(response)
|
| print(f"\nРезультат анализа (JSON):")
|
| print(json.dumps(result, ensure_ascii=False, indent=2))
|
| except json.JSONDecodeError:
|
| print(f"\nРезультат анализа:\n{response}")
|
|
|