File size: 6,301 Bytes
fcc1cf1 d10af90 fcc1cf1 d10af90 b33c70a d10af90 fcc1cf1 d10af90 fcc1cf1 d10af90 fcc1cf1 d10af90 fcc1cf1 d10af90 fcc1cf1 d10af90 |
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
import gradio as gr
import numpy as np
from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
import torch
class DiscAnalyzer:
def __init__(self):
self.disc_profiles = {
'D': 'Dominance',
'I': 'Influence',
'S': 'Steadiness',
'C': 'Compliance'
}
# Inicializar modelo do Hugging Face
# Usando BLOOM-560M que tem bom suporte para português
self.tokenizer = AutoTokenizer.from_pretrained("bigscience/bloom-560m")
self.model = AutoModelForCausalLM.from_pretrained("bigscience/bloom-560m")
self.generator = pipeline(
"text-generation",
model=self.model,
tokenizer=self.tokenizer,
device=0 if torch.cuda.is_available() else -1
)
def generate_llm_report(self, scores, perfil_principal):
"""
Gera relatório personalizado usando modelo do Hugging Face baseado nos scores DISC.
"""
prompt = f"""
Analise o seguinte perfil DISC e gere um relatório detalhado:
Perfil DISC:
- Dominância: {scores['D']:.1f}%
- Influência: {scores['I']:.1f}%
- Estabilidade: {scores['S']:.1f}%
- Conformidade: {scores['C']:.1f}%
Perfil Principal: {self.disc_profiles[perfil_principal]}
Relatório do Perfil:
"""
try:
# Gerar relatório
output = self.generator(
prompt,
max_length=1000,
num_return_sequences=1,
temperature=0.7,
top_p=0.9,
do_sample=True
)
return output[0]['generated_text'].replace(prompt, "").strip()
except Exception as e:
return f"Erro ao gerar relatório: {str(e)}"
def avaliar_disc(self,
q1, q2, q3, q4,
q5, q6, q7, q8,
q9, q10, q11, q12,
q13, q14, q15, q16):
"""
Avalia o perfil DISC baseado nas respostas do questionário.
"""
# Converter inputs para números
responses = [
int(q1), int(q2), int(q3), int(q4),
int(q5), int(q6), int(q7), int(q8),
int(q9), int(q10), int(q11), int(q12),
int(q13), int(q14), int(q15), int(q16)
]
# Calcular scores para cada dimensão DISC
d_score = sum([responses[i] for i in [0, 4, 8, 12]]) / 16 * 100
i_score = sum([responses[i] for i in [1, 5, 9, 13]]) / 16 * 100
s_score = sum([responses[i] for i in [2, 6, 10, 14]]) / 16 * 100
c_score = sum([responses[i] for i in [3, 7, 11, 15]]) / 16 * 100
# Encontrar o perfil dominante
scores = {
'D': d_score,
'I': i_score,
'S': s_score,
'C': c_score
}
perfil_principal = max(scores, key=scores.get)
# Gerar relatório LLM
relatorio_llm = self.generate_llm_report(scores, perfil_principal)
return (
f"Seu perfil principal é {self.disc_profiles[perfil_principal]} ({perfil_principal})",
relatorio_llm,
{
"Dimensão": list(scores.keys()),
"Score": list(scores.values())
}
)
def create_disc_interface():
"""
Cria a interface Gradio para o analisador DISC.
"""
analyzer = DiscAnalyzer()
with gr.Blocks(title="Análise de Perfil DISC") as interface:
gr.Markdown("# Analisador de Perfil DISC com IA")
gr.Markdown("""
Responda cada questão com valores de 1 a 4, onde:
- 1 = Discordo totalmente
- 2 = Discordo parcialmente
- 3 = Concordo parcialmente
- 4 = Concordo totalmente
""")
with gr.Row():
with gr.Column():
q1 = gr.Slider(1, 4, value=2, step=1, label="1. Sou direto e decisivo")
q2 = gr.Slider(1, 4, value=2, step=1, label="2. Sou sociável e entusiasta")
q3 = gr.Slider(1, 4, value=2, step=1, label="3. Sou paciente e cooperativo")
q4 = gr.Slider(1, 4, value=2, step=1, label="4. Sou preciso e analítico")
with gr.Column():
q5 = gr.Slider(1, 4, value=2, step=1, label="5. Gosto de assumir riscos")
q6 = gr.Slider(1, 4, value=2, step=1, label="6. Sou bom comunicador")
q7 = gr.Slider(1, 4, value=2, step=1, label="7. Sou bom ouvinte")
q8 = gr.Slider(1, 4, value=2, step=1, label="8. Sou organizado")
with gr.Column():
q9 = gr.Slider(1, 4, value=2, step=1, label="9. Tomo iniciativa")
q10 = gr.Slider(1, 4, value=2, step=1, label="10. Sou persuasivo")
q11 = gr.Slider(1, 4, value=2, step=1, label="11. Trabalho bem em equipe")
q12 = gr.Slider(1, 4, value=2, step=1, label="12. Sou detalhista")
with gr.Column():
q13 = gr.Slider(1, 4, value=2, step=1, label="13. Busco resultados")
q14 = gr.Slider(1, 4, value=2, step=1, label="14. Sou motivador")
q15 = gr.Slider(1, 4, value=2, step=1, label="15. Sou confiável")
q16 = gr.Slider(1, 4, value=2, step=1, label="16. Sou sistemático")
analyze_btn = gr.Button("Analisar Perfil")
with gr.Row():
perfil_output = gr.Textbox(label="Perfil Principal")
relatorio_output = gr.Markdown(label="Relatório Detalhado")
plot_output = gr.BarPlot(
x="Dimensão",
y="Score",
title="Scores DISC",
tooltip=["Dimensão", "Score"],
height=400,
width=600
)
analyze_btn.click(
fn=analyzer.avaliar_disc,
inputs=[q1, q2, q3, q4, q5, q6, q7, q8,
q9, q10, q11, q12, q13, q14, q15, q16],
outputs=[perfil_output, relatorio_output, plot_output]
)
return interface
if __name__ == "__main__":
interface = create_disc_interface()
interface.launch(
server_name="0.0.0.0",
server_port=7860,
share=True
) |