Spaces:
Sleeping
Sleeping
import gradio as gr | |
from datetime import datetime | |
from sentence_transformers import SentenceTransformer | |
import numpy as np | |
from typing import Dict, List, Tuple | |
from textblob import TextBlob | |
# Load embeddings model | |
model = SentenceTransformer('neuralmind/bert-large-portuguese-vocab') | |
PERGUNTAS = [ | |
{ | |
"categoria": "autoconhecimento", | |
"pergunta": "Qual foi seu maior desafio como líder e como você o superou?", | |
"contexto": "desafios liderança superação aprendizado desenvolvimento", | |
}, | |
{ | |
"categoria": "comunicacao", | |
"pergunta": "Como você adapta seu estilo de comunicação para diferentes membros da equipe?", | |
"contexto": "comunicação adaptação equipe feedback clareza", | |
}, | |
{ | |
"categoria": "decisao", | |
"pergunta": "Descreva uma decisão difícil recente e como você a tomou.", | |
"contexto": "decisão análise processo resultado impacto", | |
}, | |
{ | |
"categoria": "autoconhecimento", | |
"pergunta": "Como você identificou e desenvolveu seus pontos fortes como líder?", | |
"contexto": "fortalezas desenvolvimento crescimento reconhecimento", | |
}, | |
{ | |
"categoria": "comunicacao", | |
"pergunta": "Descreva uma situação em que você precisou dar feedback difícil. Como conduziu?", | |
"contexto": "feedback difícil comunicação empatia resolução", | |
} | |
] | |
TONE_PATTERNS = { | |
"confiante": ["certamente", "sem dúvida", "confio", "tenho certeza", "definitivamente"], | |
"reflexivo": ["penso que", "considero", "reflito", "analiso", "pondero"], | |
"hesitante": ["talvez", "pode ser", "não tenho certeza", "possivelmente", "acho que"], | |
"pragmatico": ["na prática", "concretamente", "efetivamente", "resultado", "implementei"], | |
"emocional": ["sinto", "emocionalmente", "impactado", "motivado", "frustrado"] | |
} | |
RESPOSTAS_COACH = { | |
"autoconhecimento": { | |
"positive": [ | |
{ | |
"context": "superacao_clara", | |
"response": "Sua capacidade de superar esse desafio demonstra resiliência. Especialmente interessante foi como você {specific_action}. Como você pode usar essa experiência para orientar outros líderes em situações similares?", | |
"keywords": ["superei", "consegui", "aprendi", "mudei", "cresci"] | |
}, | |
{ | |
"context": "aprendizado_continuo", | |
"response": "Sua jornada de autodesenvolvimento é notável. O fato de você {specific_action} mostra maturidade. Que outros aspectos de liderança essa experiência te motivou a explorar?", | |
"keywords": ["desenvolvimento", "estudo", "aprendo", "busco", "evoluo"] | |
} | |
], | |
"neutral": [ | |
{ | |
"context": "em_processo", | |
"response": "Você está no caminho certo ao identificar esse desafio. Considerando que você {specific_action}, que recursos ou apoio adicional seriam úteis nesse momento?", | |
"keywords": ["tentando", "buscando", "desenvolvendo", "praticando"] | |
} | |
], | |
"improvement": [ | |
{ | |
"context": "dificuldade_identificada", | |
"response": "É importante reconhecer áreas de desenvolvimento. Sua menção sobre {specific_action} sugere autoconsciência. Vamos explorar estratégias específicas para fortalecer esse aspecto?", | |
"keywords": ["difícil", "complicado", "desafiador", "preciso melhorar"] | |
} | |
] | |
}, | |
"comunicacao": { | |
"positive": [ | |
{ | |
"context": "adaptacao_efetiva", | |
"response": "Sua abordagem adaptativa é exemplar. O exemplo de como você {specific_action} demonstra sensibilidade às diferentes necessidades. Como você avalia a efetividade dessas adaptações?", | |
"keywords": ["adapto", "personalizo", "ajusto", "observo"] | |
} | |
], | |
"neutral": [ | |
{ | |
"context": "desenvolvendo_estilo", | |
"response": "Você está desenvolvendo um repertório interessante de estilos de comunicação. Sua estratégia de {specific_action} tem potencial. Que outros métodos você gostaria de experimentar?", | |
"keywords": ["testando", "experimentando", "tentando diferentes"] | |
} | |
], | |
"improvement": [ | |
{ | |
"context": "desafios_comunicacao", | |
"response": "Reconhecer desafios na comunicação é o primeiro passo. Considerando sua experiência com {specific_action}, que aspectos específicos você gostaria de desenvolver primeiro?", | |
"keywords": ["difícil comunicar", "não consegui", "preciso melhorar"] | |
} | |
] | |
}, | |
"decisao": { | |
"positive": [ | |
{ | |
"context": "processo_estruturado", | |
"response": "Seu processo decisório é bem estruturado. A forma como você {specific_action} demonstra pensamento sistêmico. Como você poderia documentar essas práticas para futuras referências?", | |
"keywords": ["analisei", "considerei", "planejei", "estruturei"] | |
} | |
], | |
"neutral": [ | |
{ | |
"context": "balanceando_fatores", | |
"response": "Você está equilibrando diferentes fatores em suas decisões. Sua menção sobre {specific_action} mostra consciência. Que frameworks de decisão você conhece que poderiam complementar sua abordagem?", | |
"keywords": ["pesando", "considerando", "avaliando"] | |
} | |
], | |
"improvement": [ | |
{ | |
"context": "decisao_desafiadora", | |
"response": "Decisões complexas exigem coragem. Sua experiência com {specific_action} oferece aprendizados valiosos. Que apoio ou recursos adicionais teriam sido úteis nesse momento?", | |
"keywords": ["hesitei", "demorei", "incerto"] | |
} | |
] | |
} | |
} | |
class EnhancedCoach: | |
def __init__(self): | |
self.pergunta_atual = 0 | |
self.inicio = datetime.now() | |
self.historico_respostas = [] | |
self.sessao_completa = False | |
self.tone_history = [] | |
self.response_quality_metrics = [] | |
def analyze_response_quality(self, text: str) -> Dict[str, float]: | |
sentences = [s.strip() for s in text.split('.') if s.strip()] | |
words = text.lower().split() | |
metrics = { | |
"depth": self._calculate_depth(text, words), | |
"clarity": self._calculate_clarity(sentences), | |
"specificity": self._calculate_specificity(text, words), | |
"actionability": self._calculate_actionability(sentences) | |
} | |
self.response_quality_metrics.append(metrics) | |
return metrics | |
def _calculate_depth(self, text: str, words: List[str]) -> float: | |
if not words: | |
return 0.0 | |
unique_words = len(set(words)) | |
word_length_avg = sum(len(word) for word in words) / len(words) | |
sentences = [s.strip() for s in text.split('.') if s.strip()] | |
word_variety = unique_words / len(words) | |
sentence_length = len(sentences) | |
complexity = word_length_avg / 5 | |
depth_score = (word_variety * 0.4 + | |
min(sentence_length / 3, 1.0) * 0.4 + | |
complexity * 0.2) | |
return min(1.0, depth_score) | |
def _calculate_clarity(self, sentences: List[str]) -> float: | |
if not sentences: | |
return 0.0 | |
avg_length = sum(len(s.split()) for s in sentences) / len(sentences) | |
return 1.0 if 10 <= avg_length <= 20 else 0.7 | |
def _calculate_specificity(self, text: str, words: List[str]) -> float: | |
specific_indicators = [ | |
"exemplo", "especificamente", "concretamente", | |
"situação", "caso", "quando", "onde", "como", | |
"projeto", "equipe", "reunião", "feedback", | |
"resultado", "impacto", "mudança", "melhoria", | |
"implementei", "desenvolvi", "criei", "estabeleci", | |
"eu", "minha", "nosso", "realizei", "fiz" | |
] | |
indicator_count = sum(text.lower().count(ind) for ind in specific_indicators) | |
response_length_factor = min(len(words) / 20, 1.0) | |
return min(1.0, (indicator_count * 0.7 + response_length_factor * 0.3)) | |
def _calculate_actionability(self, sentences: List[str]) -> float: | |
action_verbs = [ | |
"implementar", "fazer", "criar", "desenvolver", "estabelecer", | |
"planejar", "executar", "medir", "avaliar", "iniciar", | |
"construir", "liderar", "coordenar", "definir", "ajustar" | |
] | |
if not sentences: | |
return 0.0 | |
actionable = sum(1 for s in sentences | |
if any(verb in s.lower() for verb in action_verbs)) | |
return min(1.0, actionable / len(sentences)) | |
def analisar_tom(self, texto: str) -> Tuple[str, float]: | |
texto_lower = texto.lower() | |
blob = TextBlob(texto) | |
tone_scores = {} | |
for tone, patterns in TONE_PATTERNS.items(): | |
score = sum(texto_lower.count(pattern) for pattern in patterns) | |
tone_scores[tone] = score * (1 + abs(blob.sentiment.polarity)) | |
predominant_tone = max(tone_scores.items(), key=lambda x: x[1]) | |
return predominant_tone[0], predominant_tone[1] | |
def analisar_sentimento(self, texto: str) -> str: | |
positive_words = [ | |
"consegui", "superei", "aprendi", "melhorei", "efetivo", | |
"cresci", "evoluí", "realizei", "alcancei", "progresso" | |
] | |
negative_words = [ | |
"difícil", "desafiador", "complicado", "problema", "falha", | |
"obstáculo", "limitação", "erro", "confuso", "inseguro" | |
] | |
texto_lower = texto.lower() | |
positive_count = sum(1 for word in positive_words if word in texto_lower) | |
negative_count = sum(1 for word in negative_words if word in texto_lower) | |
if positive_count > negative_count: | |
return "positive" | |
elif negative_count > positive_count: | |
return "improvement" | |
return "neutral" | |
def extrair_acao_especifica(self, texto: str) -> str: | |
sentences = texto.split('.') | |
for sentence in sentences: | |
if any(action in sentence.lower() for action in ["eu", "minha", "realizei", "fiz"]): | |
return sentence.strip() | |
return texto.split('.')[0].strip() | |
def encontrar_melhor_resposta(self, texto_usuario: str, categoria: str) -> str: | |
sentimento = self.analisar_sentimento(texto_usuario) | |
acao_especifica = self.extrair_acao_especifica(texto_usuario) | |
respostas_categoria = RESPOSTAS_COACH[categoria][sentimento] | |
user_embedding = model.encode(texto_usuario) | |
melhor_resposta = None | |
maior_similaridade = -1 | |
for template in respostas_categoria: | |
context_embedding = model.encode(template["context"]) | |
similaridade = np.dot(user_embedding, context_embedding) | |
if similaridade > maior_similaridade: | |
maior_similaridade = similaridade | |
melhor_resposta = template["response"] | |
return melhor_resposta.format(specific_action=acao_especifica.lower()) | |
def gerar_resposta(self, texto_usuario: str) -> str: | |
quality_metrics = self.analyze_response_quality(texto_usuario) | |
if quality_metrics["depth"] < 0.15 and quality_metrics["specificity"] < 0.1: | |
return """### Feedback Inicial 💭 | |
Para oferecer um feedback mais valioso, poderia compartilhar mais detalhes específicos sobre sua experiência? | |
Alguns aspectos que enriqueceriam sua reflexão: | |
- Exemplos concretos da situação | |
- Ações específicas tomadas | |
- Resultados observados""" | |
if self.sessao_completa: | |
self.__init__() | |
if self.pergunta_atual >= len(PERGUNTAS): | |
tempo = (datetime.now() - self.inicio).seconds // 60 | |
return self.gerar_sumario_final(tempo) | |
tom_predominante, intensidade = self.analisar_tom(texto_usuario) | |
self.tone_history.append(tom_predominante) | |
pergunta_atual = PERGUNTAS[self.pergunta_atual] | |
self.historico_respostas.append(texto_usuario) | |
feedback = self.encontrar_melhor_resposta( | |
texto_usuario, | |
pergunta_atual["categoria"] | |
) | |
tom_insight = self._gerar_insight_tom(tom_predominante, intensidade) | |
padrao_identificado = self._analisar_padroes() | |
resposta = f"""### Feedback Personalizado 💭\n\n{feedback}{padrao_identificado}\n\n{tom_insight}""" | |
resposta += self._gerar_pontos_aprofundamento() | |
self.pergunta_atual += 1 | |
if self.pergunta_atual < len(PERGUNTAS): | |
resposta += self._gerar_proxima_pergunta() | |
else: | |
self.sessao_completa = True | |
tempo = (datetime.now() - self.inicio).seconds // 60 | |
resposta += self.gerar_sumario_final(tempo) | |
return resposta | |
def _gerar_insight_tom(self, tom: str, intensidade: float) -> str: | |
insights = { | |
"confiante": "Sua confiança ao abordar este tema é notável. Como você construiu esta segurança?", | |
"reflexivo": "Sua abordagem reflexiva traz profundidade à análise. Continue explorando diferentes perspectivas.", | |
"hesitante": "Percebo algumas incertezas naturais do processo. Que apoio ajudaria a fortalecer sua confiança?", | |
"pragmatico": "Seu foco em resultados práticos é valioso. Como você equilibra isso com visão de longo prazo?", | |
"emocional": "Sua conexão emocional com a liderança demonstra comprometimento genuíno." | |
} | |
if intensidade > 2: | |
return f"\n\n💡 {insights[tom]} Sua expressão é particularmente intensa neste aspecto." | |
return f"\n\n💡 {insights[tom]}" | |
def _analisar_padroes(self) -> str: | |
if len(self.historico_respostas) <= 1: | |
return "" | |
sentimento_atual = self.analisar_sentimento(self.historico_respostas[-1]) | |
sentimento_anterior = self.analisar_sentimento(self.historico_respostas[-2]) | |
if sentimento_atual == sentimento_anterior == "positive": | |
return "\n\n💡 Observo um padrão consistente de confiança em suas respostas. Continue desenvolvendo esses pontos fortes!" | |
elif sentimento_atual == sentimento_anterior == "improvement": | |
return "\n\n💡 Percebo que você está identificando áreas de desenvolvimento. Vamos focar em estratégias práticas para esses desafios." | |
return "" | |
def _gerar_pontos_aprofundamento(self) -> str: | |
return """ | |
#### Pontos para Aprofundamento: | |
1. Como essa experiência se conecta com seus valores de liderança? | |
2. Que recursos específicos você identificou como necessários? | |
3. Qual seria o próximo marco de desenvolvimento nessa área?""" | |
def _gerar_proxima_pergunta(self) -> str: | |
proxima = PERGUNTAS[self.pergunta_atual] | |
return f"""\n\n### Próxima Reflexão: {proxima['categoria'].title()} 🎯\n\n{proxima['pergunta']}\n\nTome um momento para refletir e conectar com suas experiências...""" | |
def gerar_sumario_final(self, tempo: int) -> str: | |
sentimentos = [self.analisar_sentimento(resp) for resp in self.historico_respostas] | |
predominante = max(set(sentimentos), key=sentimentos.count) | |
tone_pattern = max(set(self.tone_history), key=self.tone_history.count) | |
tone_insight = f"\n\n#### Padrão de Comunicação:\nSeu estilo predominante é {tone_pattern}, o que sugere {self._interpretar_padrao_tom(tone_pattern)}" | |
avg_metrics = { | |
key: sum(m[key] for m in self.response_quality_metrics) / len(self.response_quality_metrics) | |
for key in ["depth", "clarity", "specificity", "actionability"] | |
} | |
quality_insights = "\n\n#### Insights de Qualidade das Respostas:" | |
if avg_metrics["depth"] > 0.7: | |
quality_insights += "\n- Suas reflexões demonstram profundidade significativa" | |
if avg_metrics["specificity"] > 0.7: | |
quality_insights += "\n- Você fornece exemplos concretos e detalhados" | |
if avg_metrics["actionability"] > 0.7: | |
quality_insights += "\n- Suas respostas são orientadas para ação" | |
if predominante == "positive": | |
perfil = "Você demonstra forte autoconhecimento e confiança em sua liderança." | |
elif predominante == "improvement": | |
perfil = "Você demonstra excelente capacidade de identificar oportunidades de desenvolvimento." | |
else: | |
perfil = "Você demonstra uma abordagem equilibrada entre conquistas e desafios." | |
return f""" | |
### 🎉 Jornada de Desenvolvimento Concluída! | |
⏱️ Tempo de reflexão: {tempo} minutos | |
📝 Temas explorados: {len(PERGUNTAS)} | |
#### Perfil de Liderança Observado: | |
{perfil}{tone_insight}{quality_insights} | |
#### Recomendações Personalizadas: | |
1. Implemente uma ação específica mencionada em suas reflexões esta semana | |
2. Mantenha um diário de liderança focado nos temas discutidos | |
3. Estabeleça checkpoints mensais para revisar seu progresso | |
Deseja iniciar uma nova jornada de desenvolvimento com outros temas?""" | |
def _interpretar_padrao_tom(self, tom: str) -> str: | |
interpretacoes = { | |
"confiante": "uma base sólida para influenciar e liderar equipes.", | |
"reflexivo": "uma capacidade valiosa de considerar múltiplas perspectivas.", | |
"hesitante": "uma oportunidade para fortalecer sua confiança através da prática.", | |
"pragmatico": "um foco valioso em resultados e implementação.", | |
"emocional": "uma forte conexão com o impacto humano da liderança." | |
} | |
return interpretacoes.get(tom, "um estilo único de liderança.") | |
def primeira_pergunta(self): | |
return f"""### 👋 Bem-vindo à sua Jornada de Desenvolvimento! | |
Vamos explorar aspectos importantes da sua liderança através de reflexões guiadas. | |
{PERGUNTAS[0]['pergunta']} | |
Tome um momento para conectar com suas experiências e compartilhe sua perspectiva...""" | |
def criar_interface(): | |
coach = EnhancedCoach() | |
with gr.Blocks(title="Coach de Liderança", theme=gr.themes.Soft()) as app: | |
gr.Markdown("""# 🚀 Coach de Liderança | |
Desenvolva sua liderança através de reflexão guiada e feedback personalizado.""") | |
chat = gr.Chatbot( | |
value=[[None, coach.primeira_pergunta()]], | |
height=600, | |
show_label=False | |
) | |
with gr.Row(): | |
txt = gr.Textbox( | |
placeholder="Compartilhe sua reflexão aqui...", | |
lines=4, | |
label="Sua Resposta" | |
) | |
btn = gr.Button("Enviar", variant="primary") | |
def responder(mensagem, historico): | |
if not mensagem.strip(): | |
return "", historico | |
resposta = coach.gerar_resposta(mensagem) | |
historico.append([mensagem, resposta]) | |
return "", historico | |
txt.submit(responder, [txt, chat], [txt, chat]) | |
btn.click(responder, [txt, chat], [txt, chat]) | |
return app | |
if __name__ == "__main__": | |
app = criar_interface() | |
app.launch() |