Spaces:
Runtime error
Runtime error
Commit
·
be75c7f
1
Parent(s):
4e991ba
app logs
Browse files
app.py
CHANGED
@@ -57,13 +57,14 @@ def get_model():
|
|
57 |
return get_model.model_data
|
58 |
|
59 |
def parse_model_output(response):
|
60 |
-
|
|
|
61 |
match = re.match(pattern, response, re.DOTALL)
|
62 |
if match:
|
63 |
-
question = match.group(1).strip()
|
64 |
-
options = [opt.strip() for opt in match.group(2).split(",")]
|
65 |
-
answer = match.group(3).strip()
|
66 |
-
explanation = match.group(4).strip()
|
67 |
if len(options) >= 4:
|
68 |
return {
|
69 |
"question": f"Enunciado clínico: {question}",
|
@@ -71,7 +72,8 @@ def parse_model_output(response):
|
|
71 |
"answer": answer,
|
72 |
"explanation": explanation
|
73 |
}
|
74 |
-
|
|
|
75 |
|
76 |
def generate_question_from_prompt(theme, difficulty, example_question=None):
|
77 |
model_data = get_model()
|
@@ -85,29 +87,17 @@ def generate_question_from_prompt(theme, difficulty, example_question=None):
|
|
85 |
logger.info(f"Gerando questão com tema: {theme}, dificuldade: {difficulty}")
|
86 |
|
87 |
if example_question:
|
88 |
-
example_text = (
|
89 |
-
|
90 |
-
f"Alternativas: {', '.join(example_question['options'])} "
|
91 |
-
f"Gabarito: {example_question['answer']} "
|
92 |
-
f"Explicação: {example_question['explanation']}"
|
93 |
-
)
|
94 |
-
prompt = (
|
95 |
-
f"Baseado no exemplo: '{example_text}', gere uma questão sobre '{theme}', dificuldade {difficulty}, "
|
96 |
-
f"estilo prova USP. Formato: 'Enunciado clínico: [texto]. Alternativas: A) [opção], B) [opção], C) [opção], D) [opção]. "
|
97 |
-
f"Gabarito: [letra]. Explicação: [texto].'"
|
98 |
-
)
|
99 |
else:
|
100 |
-
prompt =
|
101 |
-
f"Gere uma questão sobre '{theme}', dificuldade {difficulty}, estilo prova USP. Formato: "
|
102 |
-
f"'Enunciado clínico: [texto]. Alternativas: A) [opção], B) [opção], C) [opção], D) [opção]. "
|
103 |
-
f"Gabarito: [letra]. Explicação: [texto].'"
|
104 |
-
)
|
105 |
try:
|
106 |
inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True, max_length=512)
|
107 |
-
outputs = model.generate(**inputs, max_new_tokens=256, temperature=0.7, top_p=0.9)
|
108 |
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
|
|
109 |
result = parse_model_output(response)
|
110 |
-
logger.debug(f"Questão
|
111 |
gc.collect()
|
112 |
return result
|
113 |
except Exception as e:
|
@@ -115,22 +105,33 @@ def generate_question_from_prompt(theme, difficulty, example_question=None):
|
|
115 |
gc.collect()
|
116 |
return {"question": f"Erro na geração: {e}", "options": [], "answer": "", "explanation": "Tente novamente."}
|
117 |
|
118 |
-
# Função para
|
119 |
def generate_simulado():
|
120 |
logger.info("Iniciando geração de simulado...")
|
121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
for i in range(5):
|
|
|
123 |
example = examples[i % len(examples)] if examples else None
|
124 |
-
logger.debug(f"Processando questão {i + 1} com exemplo: {example is not None}")
|
125 |
question_data = generate_question_from_prompt("clinica medica", "medio", example)
|
126 |
-
|
127 |
-
logger.info(f"Questão {i + 1}: {question_data['question']}")
|
128 |
for opt in question_data['options']:
|
129 |
logger.info(f" {opt}")
|
130 |
logger.info(f" Gabarito: {question_data['answer']}")
|
131 |
logger.info(f" Explicação: {question_data['explanation']}")
|
|
|
132 |
logger.info("Geração de simulado concluída.")
|
133 |
-
return {"simulado":
|
134 |
|
135 |
# Força carregamento inicial
|
136 |
logger.info("Testando carregamento inicial do modelo...")
|
@@ -138,7 +139,7 @@ start_time = time.time()
|
|
138 |
model_data = get_model()
|
139 |
if model_data:
|
140 |
logger.info(f"Modelo e tokenizer inicializados em {time.time() - start_time:.2f} segundos.")
|
141 |
-
time.sleep(1) #
|
142 |
generate_simulado()
|
143 |
else:
|
144 |
logger.error("Falha na inicialização do modelo.")
|
@@ -153,9 +154,9 @@ async def generate_question(theme: str, difficulty: str):
|
|
153 |
|
154 |
@app.get("/simulado")
|
155 |
async def get_simulado(num_questions: int = 5):
|
156 |
-
simulado = []
|
157 |
-
for _ in range(num_questions):
|
158 |
-
example = examples[
|
159 |
question_data = generate_question_from_prompt("clinica medica", "medio", example)
|
160 |
simulado.append(question_data)
|
161 |
return {"simulado": simulado}
|
|
|
57 |
return get_model.model_data
|
58 |
|
59 |
def parse_model_output(response):
|
60 |
+
logger.debug(f"Saída bruta do modelo: {response}")
|
61 |
+
pattern = r"Enunciado clínico: (.*?)(?:\s*Alternativas: (.*?))?(?:\s*Gabarito: (.*?))?(?:\s*Explicação: (.*?))?"
|
62 |
match = re.match(pattern, response, re.DOTALL)
|
63 |
if match:
|
64 |
+
question = match.group(1).strip() if match.group(1) else response[:200]
|
65 |
+
options = [opt.strip() for opt in (match.group(2) or "").split(",") if opt.strip()] if match.group(2) else []
|
66 |
+
answer = match.group(3).strip() if match.group(3) else ""
|
67 |
+
explanation = match.group(4).strip() if match.group(4) else "Sem explicação ou parsing incompleto"
|
68 |
if len(options) >= 4:
|
69 |
return {
|
70 |
"question": f"Enunciado clínico: {question}",
|
|
|
72 |
"answer": answer,
|
73 |
"explanation": explanation
|
74 |
}
|
75 |
+
logger.warning(f"Parsing falhou para: {response[:200]}")
|
76 |
+
return {"question": response[:200] if len(response) > 200 else response, "options": [], "answer": "", "explanation": "Erro no parsing ou formato inválido"}
|
77 |
|
78 |
def generate_question_from_prompt(theme, difficulty, example_question=None):
|
79 |
model_data = get_model()
|
|
|
87 |
logger.info(f"Gerando questão com tema: {theme}, dificuldade: {difficulty}")
|
88 |
|
89 |
if example_question:
|
90 |
+
example_text = example_question.get("question", "") + " " + ", ".join(example_question.get("options", []))
|
91 |
+
prompt = f"Com base em: '{example_text[:100]}', gere uma questão curta sobre '{theme}', dificuldade '{difficulty}', estilo USP. Responda apenas: 'Enunciado clínico: [texto]. Alternativas: A) [opção], B) [opção], C) [opção], D) [opção]. Gabarito: [letra]. Explicação: [texto].'"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
else:
|
93 |
+
prompt = f"Gere uma questão curta sobre '{theme}', dificuldade '{difficulty}', estilo USP. Responda apenas: 'Enunciado clínico: [texto]. Alternativas: A) [opção], B) [opção], C) [opção], D) [opção]. Gabarito: [letra]. Explicação: [texto].'"
|
|
|
|
|
|
|
|
|
94 |
try:
|
95 |
inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True, max_length=512)
|
96 |
+
outputs = model.generate(**inputs, max_new_tokens=256, do_sample=True, temperature=0.7, top_p=0.9)
|
97 |
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
98 |
+
logger.debug(f"Resposta bruta: {response}")
|
99 |
result = parse_model_output(response)
|
100 |
+
logger.debug(f"Questão processada: {result}")
|
101 |
gc.collect()
|
102 |
return result
|
103 |
except Exception as e:
|
|
|
105 |
gc.collect()
|
106 |
return {"question": f"Erro na geração: {e}", "options": [], "answer": "", "explanation": "Tente novamente."}
|
107 |
|
108 |
+
# Função para exibir perguntas do JSON e gerar adicionais
|
109 |
def generate_simulado():
|
110 |
logger.info("Iniciando geração de simulado...")
|
111 |
+
|
112 |
+
# Exibe as 5 primeiras perguntas do JSON
|
113 |
+
max_json_questions = min(5, len(examples))
|
114 |
+
for i in range(max_json_questions):
|
115 |
+
question_data = examples[i]
|
116 |
+
logger.info(f"Questão do JSON {i + 1}: {question_data['question']}")
|
117 |
+
for opt in question_data['options']:
|
118 |
+
logger.info(f" {opt}")
|
119 |
+
logger.info(f" Gabarito: {question_data['answer']}")
|
120 |
+
logger.info(f" Explicação: {question_data['explanation']}")
|
121 |
+
|
122 |
+
# Gera 5 perguntas adicionais com o modelo
|
123 |
for i in range(5):
|
124 |
+
logger.debug(f"Gerando pergunta adicional {i + 1}")
|
125 |
example = examples[i % len(examples)] if examples else None
|
|
|
126 |
question_data = generate_question_from_prompt("clinica medica", "medio", example)
|
127 |
+
logger.info(f"Questão Gerada {max_json_questions + i + 1}: {question_data['question']}")
|
|
|
128 |
for opt in question_data['options']:
|
129 |
logger.info(f" {opt}")
|
130 |
logger.info(f" Gabarito: {question_data['answer']}")
|
131 |
logger.info(f" Explicação: {question_data['explanation']}")
|
132 |
+
|
133 |
logger.info("Geração de simulado concluída.")
|
134 |
+
return {"simulado": examples[:5] + [generate_question_from_prompt("clinica medica", "medio") for _ in range(5)]}
|
135 |
|
136 |
# Força carregamento inicial
|
137 |
logger.info("Testando carregamento inicial do modelo...")
|
|
|
139 |
model_data = get_model()
|
140 |
if model_data:
|
141 |
logger.info(f"Modelo e tokenizer inicializados em {time.time() - start_time:.2f} segundos.")
|
142 |
+
time.sleep(1) # Delay para estabilidade
|
143 |
generate_simulado()
|
144 |
else:
|
145 |
logger.error("Falha na inicialização do modelo.")
|
|
|
154 |
|
155 |
@app.get("/simulado")
|
156 |
async def get_simulado(num_questions: int = 5):
|
157 |
+
simulado = examples[:min(5, len(examples))] # Até 5 do JSON
|
158 |
+
for _ in range(min(5, num_questions - len(simulado))): # Gera até 5 adicionais
|
159 |
+
example = examples[0] if examples else None
|
160 |
question_data = generate_question_from_prompt("clinica medica", "medio", example)
|
161 |
simulado.append(question_data)
|
162 |
return {"simulado": simulado}
|