Vtr100's picture
Update app.py
569e570 verified
import gradio as gr
import joblib
import numpy as np
import os
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM
# Caminho padrão do modelo de sentimentos
MODEL_PATH = os.getenv("MODEL_PATH", "baseline_pipe.pkl")
# Carrega o modelo de sentimentos (TF-IDF + Regressão Logística)
baseline = None
if os.path.exists(MODEL_PATH):
try:
baseline = joblib.load(MODEL_PATH)
print(f"✅ Modelo de sentimento carregado: {MODEL_PATH}")
except Exception as e:
print(f"⚠️ Erro ao carregar modelo: {e}")
else:
print("⚠️ baseline_pipe.pkl não encontrado. Usando modo simulado.")
# ================================================================
# 🔤 Carrega modelo generativo em português (T5-base da Unicamp)
# ================================================================
model_name = "unicamp-dl/ptt5-base-portuguese-vocab"
try:
print(f"🔄 Carregando modelo generativo: {model_name} ...")
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
generator = pipeline("text2text-generation", model=model, tokenizer=tokenizer)
print("✅ Modelo generativo carregado com sucesso!")
except Exception as e:
generator = None
print(f"⚠️ Erro ao carregar modelo T5: {e}")
print("⚠️ IA generativa será desativada.")
# ================================================================
# 🧩 Função principal: análise + resposta empática
# ================================================================
def predict_and_respond(text: str):
if not text or text.strip() == "":
return {"sentimento": "n/a", "resposta": "Por favor, digite uma avaliação válida."}
# --- Etapa 1: análise de sentimento ---
if baseline:
proba = baseline.predict_proba([text])[0]
pred = int(np.argmax(proba))
label = "positivo" if pred == 1 else "negativo"
conf = float(np.max(proba))
else:
label = "positivo" if "bom" in text.lower() else "negativo"
conf = 0.0
# --- Etapa 2: geração de resposta empática ---
if generator:
prompt = (
f"O cliente escreveu: '{text}'. "
f"O sentimento identificado é {label}. "
"Gere uma resposta curta, educada e empática em português, "
"como se fosse um atendente cordial da empresa."
)
try:
response = generator(prompt, max_new_tokens=80)[0]["generated_text"]
resposta = response.strip()
except Exception as e:
resposta = f"(Erro ao gerar resposta: {e})"
else:
# Fallback se o modelo T5 não carregar
if label == "positivo":
resposta = "Ficamos felizes em saber que você gostou! 😊"
else:
resposta = "Sentimos muito pela sua experiência 😞. Nossa equipe está à disposição para ajudar!"
return {
"sentimento": label,
"confiança": round(conf, 3),
"resposta": resposta
}
# ================================================================
# 🎨 Interface do Gradio
# ================================================================
demo = gr.Interface(
fn=predict_and_respond,
inputs=gr.Textbox(label="Digite uma avaliação de produto"),
outputs=gr.JSON(label="Resultado"),
title="🤖 Análise de Sentimentos + IA Generativa (Português - T5)",
description="Analisa o sentimento e gera uma resposta empática e natural com o modelo T5 em português (Unicamp).",
examples=[
["Gostei do produto, mas chegou com um pequeno defeito."],
["Horrível, o suporte não resolveu meu problema."],
["Entrega rápida e produto excelente!"]
],
theme="soft"
)
if __name__ == "__main__":
demo.launch()