DHEIVER commited on
Commit
d10af90
·
verified ·
1 Parent(s): 51347bf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +163 -167
app.py CHANGED
@@ -1,178 +1,174 @@
1
  import gradio as gr
2
- import pandas as pd
3
- import matplotlib.pyplot as plt
4
- import seaborn as sns
5
- from ctransformers import AutoModelForCausalLM
6
- import json
7
- import os
8
-
9
- # Arquivo para armazenar o contador
10
- COUNTER_FILE = "disc_usage_counter.json"
11
-
12
- # Função para gerenciar o contador
13
- def load_counter():
14
- if os.path.exists(COUNTER_FILE):
15
- with open(COUNTER_FILE, 'r') as f:
16
- return json.load(f)
17
- return {"total_uses": 0}
18
-
19
- def save_counter(counter):
20
- with open(COUNTER_FILE, 'w') as f:
21
- json.dump(counter, f)
22
-
23
- def increment_counter():
24
- counter = load_counter()
25
- counter["total_uses"] += 1
26
- save_counter(counter)
27
- return f"Total de avaliações realizadas: {counter['total_uses']}"
28
-
29
- def get_counter_text():
30
- counter = load_counter()
31
- return f"Total de avaliações realizadas: {counter['total_uses']}"
32
-
33
- # Configuração do modelo local
34
- def load_model():
35
- return AutoModelForCausalLM.from_pretrained(
36
- 'TheBloke/Mistral-7B-Instruct-v0.1-GGUF',
37
- model_file='mistral-7b-instruct-v0.1.Q4_K_M.gguf',
38
- model_type='mistral',
39
- gpu_layers=0
40
- )
41
-
42
- # Questões DISC (mantido igual)
43
- perguntas = {
44
- 'D': [
45
- "Eu sou direto e vou direto ao ponto",
46
- "Eu gosto de estar no controle",
47
- "Eu sou competitivo e gosto de vencer",
48
- "Eu tomo decisões rapidamente"
49
- ],
50
- 'I': [
51
- "Eu sou extrovertido e sociável",
52
- "Eu gosto de conhecer novas pessoas",
53
- "Eu sou entusiasta e otimista",
54
- "Eu gosto de trabalhar em equipe"
55
- ],
56
- 'S': [
57
- "Eu sou paciente e calmo",
58
- "Eu prefiro ambientes estáveis",
59
- "Eu sou bom ouvinte",
60
- "Eu ajudo os outros sempre que posso"
61
- ],
62
- 'C': [
63
- "Eu sou detalhista e preciso",
64
- "Eu sigo regras e procedimentos",
65
- "Eu analiso todas as opções antes de decidir",
66
- "Eu gosto de qualidade e excelência"
67
- ]
68
- }
69
-
70
- def calcular_disc(respostas):
71
- resultados = {'D': 0, 'I': 0, 'S': 0, 'C': 0}
72
-
73
- for tipo, valor in respostas.items():
74
- perfil = tipo[0]
75
- resultados[perfil] += valor
76
-
77
- total = sum(resultados.values())
78
- for perfil in resultados:
79
- resultados[perfil] = (resultados[perfil] / total) * 100
80
-
81
- return resultados
82
-
83
- def criar_grafico(resultados):
84
- plt.figure(figsize=(10, 6))
85
- sns.barplot(x=list(resultados.keys()), y=list(resultados.values()))
86
- plt.title('Seu Perfil DISC')
87
- plt.xlabel('Dimensões')
88
- plt.ylabel('Porcentagem')
89
-
90
- for i, v in enumerate(resultados.values()):
91
- plt.text(i, v, f'{v:.1f}%', ha='center', va='bottom')
92
-
93
- return plt
94
-
95
- def gerar_analise_llm(llm, resultados, respostas_brutas):
96
- prompt = f"""<s>[INST] Como um especialista em análise comportamental DISC, faça uma análise detalhada do seguinte perfil:
97
-
98
- Resultados percentuais:
99
- Dominância (D): {resultados['D']:.1f}%
100
- Influência (I): {resultados['I']:.1f}%
101
- Estabilidade (S): {resultados['S']:.1f}%
102
- Conformidade (C): {resultados['C']:.1f}%
103
-
104
- Respostas com pontuações mais altas:
105
- """
106
-
107
- for tipo, valor in respostas_brutas.items():
108
- if valor >= 4:
109
- dimensao = tipo[0]
110
- num_questao = int(tipo[1]) - 1
111
- questao = perguntas[dimensao][num_questao]
112
- prompt += f"- Pontuação {valor}/5 para: {questao}\n"
113
-
114
- prompt += """
115
- Forneça:
116
- 1. Análise geral do perfil
117
- 2. Pontos fortes e áreas de desenvolvimento
118
- 3. Sugestões de desenvolvimento profissional
119
- 4. Como este perfil pode interagir melhor com outros perfis
120
- 5. Ambientes de trabalho mais adequados
121
- [/INST]"""
122
-
123
- return llm(prompt, max_new_tokens=1024, temperature=0.7)
124
 
125
  class DiscAnalyzer:
126
  def __init__(self):
127
- self.llm = load_model()
128
-
129
- def avaliar_disc(self, values):
130
- # Incrementa o contador
131
- counter_text = increment_counter()
 
132
 
133
- # Processamento normal
134
- respostas = {}
135
- for i, (tipo, perguntas_tipo) in enumerate(perguntas.items()):
136
- for j, pergunta in enumerate(perguntas_tipo):
137
- respostas[f"{tipo}{j+1}"] = values[i*4 + j]
 
 
 
 
 
 
 
 
 
 
 
 
138
 
139
- resultados = calcular_disc(respostas)
140
- fig = criar_grafico(resultados)
141
- analise = gerar_analise_llm(self.llm, resultados, respostas)
 
 
142
 
143
- return fig, analise, counter_text
144
 
145
- # Interface Gradio
146
- analyzer = DiscAnalyzer()
147
-
148
- with gr.Blocks(title="Avaliação DISC com LLM Local") as app:
149
- gr.Markdown("# Avaliação de Perfil DISC com Análise Avançada")
150
-
151
- # Contador de uso (corrigido)
152
- gr.Markdown(get_counter_text())
153
-
154
- gr.Markdown("### Avalie cada afirmação em uma escala de 1 a 5")
155
-
156
- sliders = []
157
- for tipo, perguntas_tipo in perguntas.items():
158
- with gr.Group():
159
- gr.Markdown(f"## Dimensão {tipo}")
160
- for pergunta in perguntas_tipo:
161
- sliders.append(gr.Slider(1, 5, value=3, label=pergunta))
162
-
163
- btn = gr.Button("Avaliar Perfil")
164
-
165
- with gr.Row():
166
- plot = gr.Plot()
167
-
168
- analise = gr.Markdown(label="Análise Detalhada do Perfil")
169
- uso = gr.Markdown(label="Contador de Uso")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
 
171
- btn.click(
172
- fn=analyzer.avaliar_disc,
173
- inputs=sliders,
174
- outputs=[plot, analise, uso]
175
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
 
177
  if __name__ == "__main__":
178
- app.launch()
 
 
 
 
 
 
1
  import gradio as gr
2
+ import numpy as np
3
+ from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
4
+ import torch
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  class DiscAnalyzer:
7
  def __init__(self):
8
+ self.disc_profiles = {
9
+ 'D': 'Dominance',
10
+ 'I': 'Influence',
11
+ 'S': 'Steadiness',
12
+ 'C': 'Compliance'
13
+ }
14
 
15
+ # Inicializar modelo do Hugging Face
16
+ # Usando BLOOM-560M que tem bom suporte para português
17
+ self.tokenizer = AutoTokenizer.from_pretrained("bigscience/bloom-560m")
18
+ self.model = AutoModelForCausalLM.from_pretrained("bigscience/bloom-560m")
19
+ self.generator = pipeline(
20
+ "text-generation",
21
+ model=self.model,
22
+ tokenizer=self.tokenizer,
23
+ device=0 if torch.cuda.is_available() else -1
24
+ )
25
+
26
+ def generate_llm_report(self, scores, perfil_principal):
27
+ """
28
+ Gera relatório personalizado usando modelo do Hugging Face baseado nos scores DISC.
29
+ """
30
+ prompt = f"""
31
+ Analise o seguinte perfil DISC e gere um relatório detalhado:
32
 
33
+ Perfil DISC:
34
+ - Dominância: {scores['D']:.1f}%
35
+ - Influência: {scores['I']:.1f}%
36
+ - Estabilidade: {scores['S']:.1f}%
37
+ - Conformidade: {scores['C']:.1f}%
38
 
39
+ Perfil Principal: {self.disc_profiles[perfil_principal]}
40
 
41
+ Relatório do Perfil:
42
+ """
43
+
44
+ try:
45
+ # Gerar relatório
46
+ output = self.generator(
47
+ prompt,
48
+ max_length=1000,
49
+ num_return_sequences=1,
50
+ temperature=0.7,
51
+ top_p=0.9,
52
+ do_sample=True
53
+ )
54
+
55
+ return output[0]['generated_text'].replace(prompt, "").strip()
56
+
57
+ except Exception as e:
58
+ return f"Erro ao gerar relatório: {str(e)}"
59
+
60
+ def avaliar_disc(self,
61
+ q1, q2, q3, q4,
62
+ q5, q6, q7, q8,
63
+ q9, q10, q11, q12,
64
+ q13, q14, q15, q16):
65
+ """
66
+ Avalia o perfil DISC baseado nas respostas do questionário.
67
+ """
68
+ # Converter inputs para números
69
+ responses = [
70
+ int(q1), int(q2), int(q3), int(q4),
71
+ int(q5), int(q6), int(q7), int(q8),
72
+ int(q9), int(q10), int(q11), int(q12),
73
+ int(q13), int(q14), int(q15), int(q16)
74
+ ]
75
+
76
+ # Calcular scores para cada dimensão DISC
77
+ d_score = sum([responses[i] for i in [0, 4, 8, 12]]) / 16 * 100
78
+ i_score = sum([responses[i] for i in [1, 5, 9, 13]]) / 16 * 100
79
+ s_score = sum([responses[i] for i in [2, 6, 10, 14]]) / 16 * 100
80
+ c_score = sum([responses[i] for i in [3, 7, 11, 15]]) / 16 * 100
81
+
82
+ # Encontrar o perfil dominante
83
+ scores = {
84
+ 'D': d_score,
85
+ 'I': i_score,
86
+ 'S': s_score,
87
+ 'C': c_score
88
+ }
89
+ perfil_principal = max(scores, key=scores.get)
90
+
91
+ # Gerar relatório LLM
92
+ relatorio_llm = self.generate_llm_report(scores, perfil_principal)
93
+
94
+ return (
95
+ f"Seu perfil principal é {self.disc_profiles[perfil_principal]} ({perfil_principal})",
96
+ relatorio_llm,
97
+ {
98
+ "Dimensão": list(scores.keys()),
99
+ "Score": list(scores.values())
100
+ }
101
+ )
102
+
103
+ def create_disc_interface():
104
+ """
105
+ Cria a interface Gradio para o analisador DISC.
106
+ """
107
+ analyzer = DiscAnalyzer()
108
 
109
+ with gr.Blocks(title="Análise de Perfil DISC") as interface:
110
+ gr.Markdown("# Analisador de Perfil DISC com IA")
111
+ gr.Markdown("""
112
+ Responda cada questão com valores de 1 a 4, onde:
113
+ - 1 = Discordo totalmente
114
+ - 2 = Discordo parcialmente
115
+ - 3 = Concordo parcialmente
116
+ - 4 = Concordo totalmente
117
+ """)
118
+
119
+ with gr.Row():
120
+ with gr.Column():
121
+ q1 = gr.Slider(1, 4, value=2, step=1, label="1. Sou direto e decisivo")
122
+ q2 = gr.Slider(1, 4, value=2, step=1, label="2. Sou sociável e entusiasta")
123
+ q3 = gr.Slider(1, 4, value=2, step=1, label="3. Sou paciente e cooperativo")
124
+ q4 = gr.Slider(1, 4, value=2, step=1, label="4. Sou preciso e analítico")
125
+
126
+ with gr.Column():
127
+ q5 = gr.Slider(1, 4, value=2, step=1, label="5. Gosto de assumir riscos")
128
+ q6 = gr.Slider(1, 4, value=2, step=1, label="6. Sou bom comunicador")
129
+ q7 = gr.Slider(1, 4, value=2, step=1, label="7. Sou bom ouvinte")
130
+ q8 = gr.Slider(1, 4, value=2, step=1, label="8. Sou organizado")
131
+
132
+ with gr.Column():
133
+ q9 = gr.Slider(1, 4, value=2, step=1, label="9. Tomo iniciativa")
134
+ q10 = gr.Slider(1, 4, value=2, step=1, label="10. Sou persuasivo")
135
+ q11 = gr.Slider(1, 4, value=2, step=1, label="11. Trabalho bem em equipe")
136
+ q12 = gr.Slider(1, 4, value=2, step=1, label="12. Sou detalhista")
137
+
138
+ with gr.Column():
139
+ q13 = gr.Slider(1, 4, value=2, step=1, label="13. Busco resultados")
140
+ q14 = gr.Slider(1, 4, value=2, step=1, label="14. Sou motivador")
141
+ q15 = gr.Slider(1, 4, value=2, step=1, label="15. Sou confiável")
142
+ q16 = gr.Slider(1, 4, value=2, step=1, label="16. Sou sistemático")
143
+
144
+ analyze_btn = gr.Button("Analisar Perfil")
145
+
146
+ with gr.Row():
147
+ perfil_output = gr.Textbox(label="Perfil Principal")
148
+ relatorio_output = gr.Markdown(label="Relatório Detalhado")
149
+
150
+ plot_output = gr.BarPlot(
151
+ x="Dimensão",
152
+ y="Score",
153
+ title="Scores DISC",
154
+ tooltip=["Dimensão", "Score"],
155
+ height=400,
156
+ width=600
157
+ )
158
+
159
+ analyze_btn.click(
160
+ fn=analyzer.avaliar_disc,
161
+ inputs=[q1, q2, q3, q4, q5, q6, q7, q8,
162
+ q9, q10, q11, q12, q13, q14, q15, q16],
163
+ outputs=[perfil_output, relatorio_output, plot_output]
164
+ )
165
+
166
+ return interface
167
 
168
  if __name__ == "__main__":
169
+ interface = create_disc_interface()
170
+ interface.launch(
171
+ server_name="0.0.0.0",
172
+ server_port=7860,
173
+ share=True
174
+ )