|
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' |
|
} |
|
|
|
|
|
|
|
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: |
|
|
|
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. |
|
""" |
|
|
|
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) |
|
] |
|
|
|
|
|
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 |
|
|
|
|
|
scores = { |
|
'D': d_score, |
|
'I': i_score, |
|
'S': s_score, |
|
'C': c_score |
|
} |
|
perfil_principal = max(scores, key=scores.get) |
|
|
|
|
|
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 |
|
) |