File size: 5,154 Bytes
fcc1cf1
 
 
 
bd448aa
b33c70a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fcc1cf1
 
 
bd448aa
 
 
 
 
fcc1cf1
 
bd448aa
fcc1cf1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bd448aa
fcc1cf1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bd448aa
fcc1cf1
 
 
bd448aa
fcc1cf1
 
b33c70a
 
 
 
fcc1cf1
 
 
 
 
 
 
bd448aa
fcc1cf1
b33c70a
fcc1cf1
 
 
 
 
 
b33c70a
 
 
 
fcc1cf1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b33c70a
fcc1cf1
 
 
 
b33c70a
fcc1cf1
 
 
 
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 pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from ctransformers import AutoModelForCausalLM
import json
import os

# Arquivo para armazenar o contador
COUNTER_FILE = "disc_usage_counter.json"

# Função para gerenciar o contador
def load_counter():
    if os.path.exists(COUNTER_FILE):
        with open(COUNTER_FILE, 'r') as f:
            return json.load(f)
    return {"total_uses": 0}

def save_counter(counter):
    with open(COUNTER_FILE, 'w') as f:
        json.dump(counter, f)

def increment_counter():
    counter = load_counter()
    counter["total_uses"] += 1
    save_counter(counter)
    return f"Total de avaliações realizadas: {counter['total_uses']}"

# Configuração do modelo local
def load_model():
    return AutoModelForCausalLM.from_pretrained(
        'TheBloke/Mistral-7B-Instruct-v0.1-GGUF',
        model_file='mistral-7b-instruct-v0.1.Q4_K_M.gguf',
        model_type='mistral',
        gpu_layers=0  # CPU only
    )

# Questões DISC
perguntas = {
    'D': [
        "Eu sou direto e vou direto ao ponto",
        "Eu gosto de estar no controle",
        "Eu sou competitivo e gosto de vencer",
        "Eu tomo decisões rapidamente"
    ],
    'I': [
        "Eu sou extrovertido e sociável",
        "Eu gosto de conhecer novas pessoas",
        "Eu sou entusiasta e otimista",
        "Eu gosto de trabalhar em equipe"
    ],
    'S': [
        "Eu sou paciente e calmo",
        "Eu prefiro ambientes estáveis",
        "Eu sou bom ouvinte",
        "Eu ajudo os outros sempre que posso"
    ],
    'C': [
        "Eu sou detalhista e preciso",
        "Eu sigo regras e procedimentos",
        "Eu analiso todas as opções antes de decidir",
        "Eu gosto de qualidade e excelência"
    ]
}

def calcular_disc(respostas):
    resultados = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
    
    for tipo, valor in respostas.items():
        perfil = tipo[0]
        resultados[perfil] += valor
    
    total = sum(resultados.values())
    for perfil in resultados:
        resultados[perfil] = (resultados[perfil] / total) * 100
    
    return resultados

def criar_grafico(resultados):
    plt.figure(figsize=(10, 6))
    sns.barplot(x=list(resultados.keys()), y=list(resultados.values()))
    plt.title('Seu Perfil DISC')
    plt.xlabel('Dimensões')
    plt.ylabel('Porcentagem')
    
    for i, v in enumerate(resultados.values()):
        plt.text(i, v, f'{v:.1f}%', ha='center', va='bottom')
    
    return plt

def gerar_analise_llm(llm, resultados, respostas_brutas):
    prompt = f"""<s>[INST] Como um especialista em análise comportamental DISC, faça uma análise detalhada do seguinte perfil:

Resultados percentuais:
Dominância (D): {resultados['D']:.1f}%
Influência (I): {resultados['I']:.1f}%
Estabilidade (S): {resultados['S']:.1f}%
Conformidade (C): {resultados['C']:.1f}%

Respostas com pontuações mais altas:
"""

    for tipo, valor in respostas_brutas.items():
        if valor >= 4:
            dimensao = tipo[0]
            num_questao = int(tipo[1]) - 1
            questao = perguntas[dimensao][num_questao]
            prompt += f"- Pontuação {valor}/5 para: {questao}\n"

    prompt += """
Forneça:
1. Análise geral do perfil
2. Pontos fortes e áreas de desenvolvimento
3. Sugestões de desenvolvimento profissional
4. Como este perfil pode interagir melhor com outros perfis
5. Ambientes de trabalho mais adequados
[/INST]"""

    return llm(prompt, max_new_tokens=1024, temperature=0.7)

class DiscAnalyzer:
    def __init__(self):
        self.llm = load_model()
    
    def avaliar_disc(self, values):
        # Incrementa o contador
        counter_text = increment_counter()
        
        # Processamento normal
        respostas = {}
        for i, (tipo, perguntas_tipo) in enumerate(perguntas.items()):
            for j, pergunta in enumerate(perguntas_tipo):
                respostas[f"{tipo}{j+1}"] = values[i*4 + j]
        
        resultados = calcular_disc(respostas)
        fig = criar_grafico(resultados)
        analise = gerar_analise_llm(self.llm, resultados, respostas)
        
        return fig, analise, counter_text

# Interface Gradio
analyzer = DiscAnalyzer()

with gr.Blocks(title="Avaliação DISC com LLM Local") as app:
    gr.Markdown("# Avaliação de Perfil DISC com Análise Avançada")
    
    # Contador de uso
    counter_text = gr.Markdown(load_counter()["total_uses"])
    
    gr.Markdown("### Avalie cada afirmação em uma escala de 1 a 5")
    
    sliders = []
    for tipo, perguntas_tipo in perguntas.items():
        with gr.Group():
            gr.Markdown(f"## Dimensão {tipo}")
            for pergunta in perguntas_tipo:
                sliders.append(gr.Slider(1, 5, value=3, label=pergunta))
    
    btn = gr.Button("Avaliar Perfil")
    
    with gr.Row():
        plot = gr.Plot()
    
    analise = gr.Markdown(label="Análise Detalhada do Perfil")
    uso = gr.Markdown(label="Contador de Uso")
    
    btn.click(
        fn=analyzer.avaliar_disc,
        inputs=sliders,
        outputs=[plot, analise, uso]
    )

if __name__ == "__main__":
    app.launch()