Vtr100 commited on
Commit
569e570
·
verified ·
1 Parent(s): e3bb601

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -25
app.py CHANGED
@@ -1,8 +1,9 @@
 
1
  import gradio as gr
2
  import joblib
3
  import numpy as np
4
  import os
5
- from transformers import pipeline
6
 
7
  # Caminho padrão do modelo de sentimentos
8
  MODEL_PATH = os.getenv("MODEL_PATH", "baseline_pipe.pkl")
@@ -18,18 +19,30 @@ if os.path.exists(MODEL_PATH):
18
  else:
19
  print("⚠️ baseline_pipe.pkl não encontrado. Usando modo simulado.")
20
 
21
- # Carrega modelo generativo em português (T5-base da Unicamp)
22
- # Esse modelo entende instruções e responde em linguagem natural.
23
- generator = pipeline("text2text-generation", model="unicamp-dl/ptt5-base-portuguese-vocab")
 
 
 
 
 
 
 
 
 
 
 
 
24
 
 
 
 
25
  def predict_and_respond(text: str):
26
- """
27
- Analisa o sentimento do texto e gera uma resposta automática empática em português.
28
- """
29
  if not text or text.strip() == "":
30
  return {"sentimento": "n/a", "resposta": "Por favor, digite uma avaliação válida."}
31
 
32
- # Etapa 1 Predição de sentimento
33
  if baseline:
34
  proba = baseline.predict_proba([text])[0]
35
  pred = int(np.argmax(proba))
@@ -39,28 +52,35 @@ def predict_and_respond(text: str):
39
  label = "positivo" if "bom" in text.lower() else "negativo"
40
  conf = 0.0
41
 
42
- # Etapa 2 Geração de resposta empática com T5
43
- prompt = (
44
- f"O cliente escreveu: '{text}'. "
45
- f"O sentimento identificado é {label}. "
46
- "Gere uma resposta curta, empática e em português natural, "
47
- "como se fosse um atendente cordial da empresa."
48
- )
49
-
50
- try:
51
- response = generator(prompt, max_new_tokens=80)[0]["generated_text"]
52
- resposta_limpa = response.strip()
53
- except Exception as e:
54
- resposta_limpa = f"(Erro ao gerar resposta com o modelo T5: {e})"
55
-
56
- # Retorna resultado final
 
 
 
 
 
57
  return {
58
  "sentimento": label,
59
  "confiança": round(conf, 3),
60
- "resposta": resposta_limpa
61
  }
62
 
63
- # Interface Gradio
 
 
64
  demo = gr.Interface(
65
  fn=predict_and_respond,
66
  inputs=gr.Textbox(label="Digite uma avaliação de produto"),
 
1
+
2
  import gradio as gr
3
  import joblib
4
  import numpy as np
5
  import os
6
+ from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM
7
 
8
  # Caminho padrão do modelo de sentimentos
9
  MODEL_PATH = os.getenv("MODEL_PATH", "baseline_pipe.pkl")
 
19
  else:
20
  print("⚠️ baseline_pipe.pkl não encontrado. Usando modo simulado.")
21
 
22
+ # ================================================================
23
+ # 🔤 Carrega modelo generativo em português (T5-base da Unicamp)
24
+ # ================================================================
25
+ model_name = "unicamp-dl/ptt5-base-portuguese-vocab"
26
+
27
+ try:
28
+ print(f"🔄 Carregando modelo generativo: {model_name} ...")
29
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
30
+ model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
31
+ generator = pipeline("text2text-generation", model=model, tokenizer=tokenizer)
32
+ print("✅ Modelo generativo carregado com sucesso!")
33
+ except Exception as e:
34
+ generator = None
35
+ print(f"⚠️ Erro ao carregar modelo T5: {e}")
36
+ print("⚠️ IA generativa será desativada.")
37
 
38
+ # ================================================================
39
+ # 🧩 Função principal: análise + resposta empática
40
+ # ================================================================
41
  def predict_and_respond(text: str):
 
 
 
42
  if not text or text.strip() == "":
43
  return {"sentimento": "n/a", "resposta": "Por favor, digite uma avaliação válida."}
44
 
45
+ # --- Etapa 1: análise de sentimento ---
46
  if baseline:
47
  proba = baseline.predict_proba([text])[0]
48
  pred = int(np.argmax(proba))
 
52
  label = "positivo" if "bom" in text.lower() else "negativo"
53
  conf = 0.0
54
 
55
+ # --- Etapa 2: geração de resposta empática ---
56
+ if generator:
57
+ prompt = (
58
+ f"O cliente escreveu: '{text}'. "
59
+ f"O sentimento identificado é {label}. "
60
+ "Gere uma resposta curta, educada e empática em português, "
61
+ "como se fosse um atendente cordial da empresa."
62
+ )
63
+ try:
64
+ response = generator(prompt, max_new_tokens=80)[0]["generated_text"]
65
+ resposta = response.strip()
66
+ except Exception as e:
67
+ resposta = f"(Erro ao gerar resposta: {e})"
68
+ else:
69
+ # Fallback se o modelo T5 não carregar
70
+ if label == "positivo":
71
+ resposta = "Ficamos felizes em saber que você gostou! 😊"
72
+ else:
73
+ resposta = "Sentimos muito pela sua experiência 😞. Nossa equipe está à disposição para ajudar!"
74
+
75
  return {
76
  "sentimento": label,
77
  "confiança": round(conf, 3),
78
+ "resposta": resposta
79
  }
80
 
81
+ # ================================================================
82
+ # 🎨 Interface do Gradio
83
+ # ================================================================
84
  demo = gr.Interface(
85
  fn=predict_and_respond,
86
  inputs=gr.Textbox(label="Digite uma avaliação de produto"),