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
    )