MarvinRoque commited on
Commit
271d7ab
·
1 Parent(s): c5fd4e7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +10 -21
app.py CHANGED
@@ -38,10 +38,8 @@ def normalize_text(text: str) -> str:
38
  # -------------------------
39
  # Carregamento de modelos
40
  # -------------------------
41
- print("Carregando embedder:", EMBEDDING_MODEL)
42
  embedder = SentenceTransformer(EMBEDDING_MODEL)
43
 
44
- print("Carregando LLM:", LLM_MODEL)
45
  tokenizer = AutoTokenizer.from_pretrained(LLM_MODEL, use_fast=True)
46
  model = AutoModelForCausalLM.from_pretrained(
47
  LLM_MODEL,
@@ -278,11 +276,8 @@ def detectar_conceitos(prompt: str):
278
  """
279
  prompt_norm = normalize_text(prompt or "")
280
  if not prompt_norm:
281
- print("[detectar_conceitos] prompt vazio após normalização")
282
  return []
283
 
284
- print(f"\n🟢 [detectar_conceitos] Analisando prompt:\n{prompt_norm}\n")
285
-
286
  # ----------------------------------------
287
  # 0️⃣ Embedding base do prompt
288
  # ----------------------------------------
@@ -299,7 +294,6 @@ def detectar_conceitos(prompt: str):
299
  "source": source
300
  }
301
  conceitos_detectados.append(conceito)
302
- print(f"✅ [ADD_CONCEITO] {conceito}")
303
 
304
  # ----------------------------------------
305
  # 1️⃣ Regex base
@@ -553,8 +547,6 @@ def detectar_conceitos(prompt: str):
553
  max_score = float(sims[max_idx].item())
554
  domain_str = fitness_domains[max_idx].lower()
555
 
556
- print(f"🔹 [EMBEDDING] domain='{domain_str}' score={max_score:.3f}")
557
-
558
  if max_score >= THRESHOLD:
559
  tipo = None
560
  subtipo = "generico"
@@ -589,7 +581,6 @@ def detectar_conceitos(prompt: str):
589
  # 4️⃣ Fallback LLM
590
  # ----------------------------------------
591
  if not conceitos_detectados:
592
- print("⚠️ Nenhum conceito detectado via regex ou embedding, chamando LLM fallback...")
593
 
594
  prompt_llm = f"""
595
  Analise o texto abaixo e determine:
@@ -610,13 +601,11 @@ def detectar_conceitos(prompt: str):
610
  inputs = tokenizer(prompt_llm, return_tensors="pt")
611
  output = model.generate(**inputs, max_new_tokens=128, do_sample=False)
612
  resposta = tokenizer.decode(output[0], skip_special_tokens=True)
613
- print(f"🧠 [LLM RESPOSTA]:\n{resposta}\n")
614
 
615
  match = re.search(r"\{.*\}", resposta, re.S)
616
  if match:
617
  try:
618
  parsed = json.loads(match.group(0))
619
- print(f"🧩 [LLM PARSED] {parsed}")
620
  for tipo in ["treino", "nutricao"]:
621
  if parsed.get(tipo, False):
622
  subtipo = parsed.get(f"{tipo}_subtipo", "generico")
@@ -639,7 +628,6 @@ def detectar_conceitos(prompt: str):
639
 
640
  conceitos_detectados = filtrar_especificos(conceitos_detectados)
641
 
642
- print(f"🏁 [RESULTADO FINAL] {conceitos_detectados}\n")
643
  return conceitos_detectados
644
 
645
 
@@ -1246,7 +1234,6 @@ def extrair_dados_usuario(prompt_norm: str):
1246
  dados["alergias"] = list(set(alergias_encontradas))
1247
 
1248
  dados["lesoes"]=detectar_lesoes(prompt_norm)
1249
- print("lesoes: ", dados["lesoes"])
1250
 
1251
  return dados
1252
 
@@ -1298,21 +1285,23 @@ def formatar_resposta_humana(resposta_final: dict) -> str:
1298
  # -------------------------
1299
  def responder(prompt: str):
1300
  try:
1301
- prompt_text = prompt or ""
1302
- prompt_norm = normalize_text(prompt_text)
 
 
 
 
 
1303
 
1304
- # 1️⃣ Extrair dados do usuário
1305
- dados_usuario = extrair_dados_usuario(prompt_norm)
1306
  campos_obrigatorios = ["idade", "sexo", "peso", "altura", "atividade", "objetivo", "nivel_usuario"]
1307
  faltando = [c for c in campos_obrigatorios if c not in dados_usuario]
1308
 
1309
  if faltando:
1310
- return f"Preciso que você me diga também: {', '.join(faltando)}."
1311
 
1312
- # 2️⃣ Detectar conceitos e intenções
1313
- conceitos = detectar_conceitos(prompt_text)
1314
  if not conceitos:
1315
- return "Desculpe, mas o que você digitou não parece se encaixar nos objetivos do app (treino ou nutrição)."
1316
 
1317
  resposta_final = {}
1318
 
 
38
  # -------------------------
39
  # Carregamento de modelos
40
  # -------------------------
 
41
  embedder = SentenceTransformer(EMBEDDING_MODEL)
42
 
 
43
  tokenizer = AutoTokenizer.from_pretrained(LLM_MODEL, use_fast=True)
44
  model = AutoModelForCausalLM.from_pretrained(
45
  LLM_MODEL,
 
276
  """
277
  prompt_norm = normalize_text(prompt or "")
278
  if not prompt_norm:
 
279
  return []
280
 
 
 
281
  # ----------------------------------------
282
  # 0️⃣ Embedding base do prompt
283
  # ----------------------------------------
 
294
  "source": source
295
  }
296
  conceitos_detectados.append(conceito)
 
297
 
298
  # ----------------------------------------
299
  # 1️⃣ Regex base
 
547
  max_score = float(sims[max_idx].item())
548
  domain_str = fitness_domains[max_idx].lower()
549
 
 
 
550
  if max_score >= THRESHOLD:
551
  tipo = None
552
  subtipo = "generico"
 
581
  # 4️⃣ Fallback LLM
582
  # ----------------------------------------
583
  if not conceitos_detectados:
 
584
 
585
  prompt_llm = f"""
586
  Analise o texto abaixo e determine:
 
601
  inputs = tokenizer(prompt_llm, return_tensors="pt")
602
  output = model.generate(**inputs, max_new_tokens=128, do_sample=False)
603
  resposta = tokenizer.decode(output[0], skip_special_tokens=True)
 
604
 
605
  match = re.search(r"\{.*\}", resposta, re.S)
606
  if match:
607
  try:
608
  parsed = json.loads(match.group(0))
 
609
  for tipo in ["treino", "nutricao"]:
610
  if parsed.get(tipo, False):
611
  subtipo = parsed.get(f"{tipo}_subtipo", "generico")
 
628
 
629
  conceitos_detectados = filtrar_especificos(conceitos_detectados)
630
 
 
631
  return conceitos_detectados
632
 
633
 
 
1234
  dados["alergias"] = list(set(alergias_encontradas))
1235
 
1236
  dados["lesoes"]=detectar_lesoes(prompt_norm)
 
1237
 
1238
  return dados
1239
 
 
1285
  # -------------------------
1286
  def responder(prompt: str):
1287
  try:
1288
+ # Divide a prompt em duas partes: antes e depois da primeira quebra dupla de linha
1289
+ partes = prompt.split("# PROMPT_USUARIO", 1)
1290
+ dados_brutos = partes[0] if len(partes) > 0 else ""
1291
+ prompt_usuario = partes[1] if len(partes) > 1 else ""
1292
+
1293
+ dados_norm = normalize_text(dados_brutos)
1294
+ dados_usuario = extrair_dados_usuario(dados_norm)
1295
 
 
 
1296
  campos_obrigatorios = ["idade", "sexo", "peso", "altura", "atividade", "objetivo", "nivel_usuario"]
1297
  faltando = [c for c in campos_obrigatorios if c not in dados_usuario]
1298
 
1299
  if faltando:
1300
+ return f"Preciso que você configure os seguintes dados: {', '.join(faltando)} nas suas definições de perfil."
1301
 
1302
+ conceitos = detectar_conceitos(prompt_usuario)
 
1303
  if not conceitos:
1304
+ return "Desculpe, não entendi o contexto (treino ou nutrição)."
1305
 
1306
  resposta_final = {}
1307