Spaces:
Sleeping
Sleeping
File size: 3,828 Bytes
569e570 45c67fb 569e570 45c67fb 1dc9b4b 45c67fb 1dc9b4b be7a1c5 883f887 63173b0 1dc9b4b 45c67fb 569e570 5f51158 569e570 5f51158 45c67fb 883f887 5f51158 569e570 5f51158 883f887 5f51158 883f887 5f51158 569e570 5f51158 883f887 569e570 5f51158 45c67fb 569e570 45c67fb 5f51158 45c67fb 883f887 8290b89 883f887 8290b89 883f887 5f51158 45c67fb 0c6ecd1 63173b0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
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()
|