Spaces:
Sleeping
Sleeping
Commit
·
271d7ab
1
Parent(s):
c5fd4e7
Update app.py
Browse files
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 |
-
|
| 1302 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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ê
|
| 1311 |
|
| 1312 |
-
|
| 1313 |
-
conceitos = detectar_conceitos(prompt_text)
|
| 1314 |
if not conceitos:
|
| 1315 |
-
return "Desculpe,
|
| 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 |
|