MarvinRoque commited on
Commit
1e16f39
·
1 Parent(s): e73bf0e

filtro por embedding de prompt

Browse files
Files changed (1) hide show
  1. app.py +19 -48
app.py CHANGED
@@ -1,17 +1,10 @@
1
  import gradio as gr
2
- from huggingface_hub import login
3
- import os
4
  from transformers import AutoModelForCausalLM, AutoTokenizer
 
 
5
 
6
- # Login com token (via secrets do Hugging Face Spaces)
7
- hf_token = os.environ.get("HF_TOKEN")
8
- if hf_token:
9
- login(hf_token)
10
-
11
- # Modelo escolhido: Google Gemma 2B Instruct
12
  model_id = "google/gemma-2b-it"
13
-
14
- # Carregar tokenizer e modelo
15
  tokenizer = AutoTokenizer.from_pretrained(model_id)
16
  model = AutoModelForCausalLM.from_pretrained(
17
  model_id,
@@ -19,53 +12,32 @@ model = AutoModelForCausalLM.from_pretrained(
19
  torch_dtype="auto"
20
  )
21
 
 
 
 
 
 
 
 
22
  def responder(prompt):
23
- # Lista ampliada de palavras-chave fitness
24
- fitness_keywords = [
25
- # treino
26
- "treino", "treinos", "treinamento", "treinamentos",
27
-
28
- # exercício
29
- "exercício", "exercicio", "exercícios", "exercicios",
30
-
31
- # academia
32
- "academia", "musculação", "musculacao", "gym",
33
-
34
- # tipos de treino
35
- "hipertrofia", "força", "forca", "forças", "forcas",
36
- "resistência", "resistencia", "plyo", "pliométrico", "pliometrico",
37
-
38
- # partes do corpo
39
- "perna", "pernas", "braço", "braco", "braços", "bracos",
40
- "peito", "costas", "ombro", "ombros", "abdômen", "abdomen",
41
- "core", "glúteo", "gluteo", "glúteos", "gluteos",
42
-
43
- # nutrição
44
- "nutrição", "nutricao", "alimentação", "alimentacao", "dieta", "dietas",
45
- "proteína", "proteina", "proteínas", "proteinas",
46
- "carboidrato", "carboidratos", "gordura", "gorduras",
47
-
48
- # recuperação
49
- "recuperação", "recuperacao", "descanso", "sono", "alongamento", "stretching",
50
-
51
- # cardio
52
- "cardio", "corrida", "correr", "bike", "bicicleta", "ciclismo", "esteira"
53
- ]
54
 
55
- # Checar se o prompt contém algum termo fitness
56
- if not any(palavra in prompt.lower() for palavra in fitness_keywords):
 
 
 
57
  return "Desculpe, só respondo perguntas sobre treino, nutrição e fitness."
58
-
59
  # Prompt explícito
60
  system_message = (
61
  "Você é um personal trainer virtual. "
62
  "Sempre responda em PORTUGUÊS, de forma clara, curta e prática. "
63
  "Se o usuário pedir treino, forneça uma lista numerada de exercícios físicos reais. "
64
- "Se não for relacionado a treino/nutrição/fitness, responda 'Desculpe, só respondo perguntas sobre treino e fitness.'"
65
  )
66
 
67
  entrada = f"{system_message}\n\nUsuário: {prompt}\nAssistente:"
68
-
69
  inputs = tokenizer(entrada, return_tensors="pt").to(model.device)
70
 
71
  outputs = model.generate(
@@ -86,8 +58,7 @@ demo = gr.Interface(
86
  fn=responder,
87
  inputs=gr.Textbox(lines=3, label="Pergunta"),
88
  outputs=gr.Textbox(label="Resposta"),
89
- title="Personal Trainer AI"
90
  )
91
 
92
- # Ativa fila (compatível com versões antigas do Gradio no Spaces)
93
  demo.queue().launch()
 
1
  import gradio as gr
 
 
2
  from transformers import AutoModelForCausalLM, AutoTokenizer
3
+ from sentence_transformers import SentenceTransformer, util
4
+ import torch
5
 
6
+ # Modelo de linguagem (Gemma 2B IT)
 
 
 
 
 
7
  model_id = "google/gemma-2b-it"
 
 
8
  tokenizer = AutoTokenizer.from_pretrained(model_id)
9
  model = AutoModelForCausalLM.from_pretrained(
10
  model_id,
 
12
  torch_dtype="auto"
13
  )
14
 
15
+ # Modelo de embeddings (leve e rápido)
16
+ embedder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
17
+
18
+ # Embedding do domínio fitness
19
+ fitness_domain = "perguntas sobre treino, musculação, nutrição, hipertrofia, academia e recuperação física"
20
+ fitness_embedding = embedder.encode(fitness_domain, convert_to_tensor=True)
21
+
22
  def responder(prompt):
23
+ # Embedding do prompt
24
+ prompt_embedding = embedder.encode(prompt, convert_to_tensor=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
+ # Similaridade com o domínio fitness
27
+ similarity = util.cos_sim(prompt_embedding, fitness_embedding).item()
28
+
29
+ # Threshold ajustável (0.3–0.4 é bom para português)
30
+ if similarity < 0.35:
31
  return "Desculpe, só respondo perguntas sobre treino, nutrição e fitness."
32
+
33
  # Prompt explícito
34
  system_message = (
35
  "Você é um personal trainer virtual. "
36
  "Sempre responda em PORTUGUÊS, de forma clara, curta e prática. "
37
  "Se o usuário pedir treino, forneça uma lista numerada de exercícios físicos reais. "
 
38
  )
39
 
40
  entrada = f"{system_message}\n\nUsuário: {prompt}\nAssistente:"
 
41
  inputs = tokenizer(entrada, return_tensors="pt").to(model.device)
42
 
43
  outputs = model.generate(
 
58
  fn=responder,
59
  inputs=gr.Textbox(lines=3, label="Pergunta"),
60
  outputs=gr.Textbox(label="Resposta"),
61
+ title="Personal Trainer AI com Filtro Semântico"
62
  )
63
 
 
64
  demo.queue().launch()