DHEIVER commited on
Commit
fcc1cf1
·
verified ·
1 Parent(s): a439422

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +166 -0
app.py ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ import matplotlib.pyplot as plt
4
+ import seaborn as sns
5
+ from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
6
+
7
+ # Configuração do modelo local
8
+ def load_model():
9
+ model_name = "TheBloke/Mistral-7B-Instruct-v0.1-GGUF"
10
+ model = AutoModelForCausalLM.from_quantized(
11
+ model_name,
12
+ model_file="mistral-7b-instruct-v0.1.Q4_K_M.gguf",
13
+ device="cpu",
14
+ trust_remote_code=True
15
+ )
16
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
17
+ return pipeline('text-generation', model=model, tokenizer=tokenizer)
18
+
19
+ # Questões DISC
20
+ perguntas = {
21
+ 'D': [
22
+ "Eu sou direto e vou direto ao ponto",
23
+ "Eu gosto de estar no controle",
24
+ "Eu sou competitivo e gosto de vencer",
25
+ "Eu tomo decisões rapidamente"
26
+ ],
27
+ 'I': [
28
+ "Eu sou extrovertido e sociável",
29
+ "Eu gosto de conhecer novas pessoas",
30
+ "Eu sou entusiasta e otimista",
31
+ "Eu gosto de trabalhar em equipe"
32
+ ],
33
+ 'S': [
34
+ "Eu sou paciente e calmo",
35
+ "Eu prefiro ambientes estáveis",
36
+ "Eu sou bom ouvinte",
37
+ "Eu ajudo os outros sempre que posso"
38
+ ],
39
+ 'C': [
40
+ "Eu sou detalhista e preciso",
41
+ "Eu sigo regras e procedimentos",
42
+ "Eu analiso todas as opções antes de decidir",
43
+ "Eu gosto de qualidade e excelência"
44
+ ]
45
+ }
46
+
47
+ def calcular_disc(respostas):
48
+ resultados = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
49
+
50
+ for tipo, valor in respostas.items():
51
+ perfil = tipo[0]
52
+ resultados[perfil] += valor
53
+
54
+ total = sum(resultados.values())
55
+ for perfil in resultados:
56
+ resultados[perfil] = (resultados[perfil] / total) * 100
57
+
58
+ return resultados
59
+
60
+ def criar_grafico(resultados):
61
+ plt.figure(figsize=(10, 6))
62
+ sns.barplot(x=list(resultados.keys()), y=list(resultados.values()))
63
+ plt.title('Seu Perfil DISC')
64
+ plt.xlabel('Dimensões')
65
+ plt.ylabel('Porcentagem')
66
+
67
+ for i, v in enumerate(resultados.values()):
68
+ plt.text(i, v, f'{v:.1f}%', ha='center', va='bottom')
69
+
70
+ return plt
71
+
72
+ def gerar_analise_llm(pipe, resultados, respostas_brutas):
73
+ # Prepara o prompt para o LLM
74
+ prompt = f"""<s>[INST] Como um especialista em análise comportamental DISC, faça uma análise detalhada do seguinte perfil:
75
+
76
+ Resultados percentuais:
77
+ Dominância (D): {resultados['D']:.1f}%
78
+ Influência (I): {resultados['I']:.1f}%
79
+ Estabilidade (S): {resultados['S']:.1f}%
80
+ Conformidade (C): {resultados['C']:.1f}%
81
+
82
+ Respostas com pontuações mais altas:
83
+ """
84
+
85
+ # Adiciona respostas com pontuações altas ao prompt
86
+ for tipo, valor in respostas_brutas.items():
87
+ if valor >= 4:
88
+ dimensao = tipo[0]
89
+ num_questao = int(tipo[1]) - 1
90
+ questao = perguntas[dimensao][num_questao]
91
+ prompt += f"- Pontuação {valor}/5 para: {questao}\n"
92
+
93
+ prompt += """
94
+ Forneça:
95
+ 1. Análise geral do perfil
96
+ 2. Pontos fortes e áreas de desenvolvimento
97
+ 3. Sugestões de desenvolvimento profissional
98
+ 4. Como este perfil pode interagir melhor com outros perfis
99
+ 5. Ambientes de trabalho mais adequados
100
+ [/INST]"""
101
+
102
+ # Gera a análise usando o modelo local
103
+ resposta = pipe(
104
+ prompt,
105
+ max_new_tokens=1024,
106
+ temperature=0.7,
107
+ top_p=0.95,
108
+ repetition_penalty=1.15
109
+ )[0]['generated_text']
110
+
111
+ # Remove o prompt da resposta
112
+ analise = resposta.split("[/INST]")[1].strip()
113
+
114
+ return analise
115
+
116
+ class DiscAnalyzer:
117
+ def __init__(self):
118
+ self.pipe = load_model()
119
+
120
+ def avaliar_disc(self, values):
121
+ # Converte os valores do slider para um dicionário
122
+ respostas = {}
123
+ for i, (tipo, perguntas_tipo) in enumerate(perguntas.items()):
124
+ for j, pergunta in enumerate(perguntas_tipo):
125
+ respostas[f"{tipo}{j+1}"] = values[i*4 + j]
126
+
127
+ # Calcula os resultados
128
+ resultados = calcular_disc(respostas)
129
+
130
+ # Cria o gráfico
131
+ fig = criar_grafico(resultados)
132
+
133
+ # Gera a análise detalhada
134
+ analise = gerar_analise_llm(self.pipe, resultados, respostas)
135
+
136
+ return fig, analise
137
+
138
+ # Interface Gradio
139
+ analyzer = DiscAnalyzer()
140
+
141
+ with gr.Blocks(title="Avaliação DISC com LLM Local") as app:
142
+ gr.Markdown("# Avaliação de Perfil DISC com Análise Avançada")
143
+ gr.Markdown("### Avalie cada afirmação em uma escala de 1 a 5")
144
+
145
+ sliders = []
146
+ for tipo, perguntas_tipo in perguntas.items():
147
+ with gr.Group():
148
+ gr.Markdown(f"## Dimensão {tipo}")
149
+ for pergunta in perguntas_tipo:
150
+ sliders.append(gr.Slider(1, 5, value=3, label=pergunta))
151
+
152
+ btn = gr.Button("Avaliar Perfil")
153
+
154
+ with gr.Row():
155
+ plot = gr.Plot()
156
+
157
+ analise = gr.Markdown(label="Análise Detalhada do Perfil")
158
+
159
+ btn.click(
160
+ fn=analyzer.avaliar_disc,
161
+ inputs=sliders,
162
+ outputs=[plot, analise]
163
+ )
164
+
165
+ if __name__ == "__main__":
166
+ app.launch()