healthtechbrasil commited on
Commit
be75c7f
·
1 Parent(s): 4e991ba
Files changed (1) hide show
  1. app.py +35 -34
app.py CHANGED
@@ -57,13 +57,14 @@ def get_model():
57
  return get_model.model_data
58
 
59
  def parse_model_output(response):
60
- pattern = r"Enunciado clínico: (.*?)\s*Alternativas: (.*?)\s*Gabarito: (.*?)\s*Explicação: (.*)"
 
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
- return {"question": response, "options": [], "answer": "", "explanation": "Erro no parsing"}
 
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
- f"Enunciado clínico: {example_question['question'].split('Considerando')[-1].strip()} "
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 gerada com sucesso: {result}")
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 gerar e exibir simulado
119
  def generate_simulado():
120
  logger.info("Iniciando geração de simulado...")
121
- simulado = []
 
 
 
 
 
 
 
 
 
 
 
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
- simulado.append(question_data)
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": 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) # Adiciona delay de 1 segundo para garantir estabilidade
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[_ % len(examples)] if examples else None
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}