InspiraLead / app.py
DHEIVER's picture
Update app.py
530192f verified
raw
history blame
10.8 kB
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()