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('all-MiniLM-L6-v2') | |
# Define questions with categories and context | |
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", | |
} | |
] | |
# Add tone categories with associated words/phrases | |
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"] | |
} | |
# Enhanced response system with more context and situation-specific feedback | |
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 = [] | |
def analisar_tom(self, texto: str) -> Tuple[str, float]: | |
"""Analisa o tom predominante na resposta usando TextBlob e padrões lexicais.""" | |
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: | |
"""Analisa o sentimento geral da resposta.""" | |
positive_words = ["consegui", "superei", "aprendi", "melhorei", "efetivo"] | |
negative_words = ["difícil", "desafiador", "complicado", "problema", "falha"] | |
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: | |
"""Extrai uma ação específica mencionada na resposta.""" | |
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: | |
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.pergunta_atual += 1 | |
self.historico_respostas.append({ | |
"pergunta": pergunta_atual["pergunta"], | |
"resposta": texto_usuario, | |
"sentimento": self.analisar_sentimento(texto_usuario), | |
"tom": tom_predominante | |
}) | |
feedback = self.encontrar_melhor_resposta(texto_usuario, pergunta_atual["categoria"]) | |
return f"Resposta analisada: {feedback}\n\nPróxima pergunta: {PERGUNTAS[self.pergunta_atual]['pergunta']}" if self.pergunta_atual < len(PERGUNTAS) else feedback | |
def gerar_sumario_final(self, tempo_total: int) -> str: | |
summary = [f"Tonalidade predominante da sessão: {max(set(self.tone_history), key=self.tone_history.count)}."] | |
for resposta in self.historico_respostas: | |
summary.append(f"- Pergunta: {resposta['pergunta']}\n Resposta: {resposta['resposta']}\n Sentimento: {resposta['sentimento']}\n Tom: {resposta['tom']}\n") | |
summary.append(f"Tempo total da sessão: {tempo_total} minutos.") | |
self.sessao_completa = True | |
return "\n".join(summary) | |
# Interface Gradio | |
coach = EnhancedCoach() | |
def interface_chat(texto_usuario): | |
return coach.gerar_resposta(texto_usuario) | |
demo = gr.Interface( | |
fn=interface_chat, | |
inputs="text", | |
outputs="text", | |
title="Coaching Inteligente", | |
description="Receba perguntas personalizadas e feedback em tempo real para desenvolvimento pessoal e profissional." | |
) | |
if __name__ == "__main__": | |
demo.launch() | |