Finish-him commited on
Commit
e58486a
·
verified ·
1 Parent(s): 2c863d8

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +52 -229
app.py CHANGED
@@ -1,103 +1,49 @@
1
  """
2
  Prometheus - Academy Builder AI Assistant
3
  =========================================
4
- Assistente híbrido de vendas + educacional com sistema RAG
5
- para a plataforma Academy Builder de academias corporativas gamificadas.
6
-
7
- Desenvolvido para Hugging Face Spaces com Gradio.
8
  """
9
 
10
  import gradio as gr
11
  import json
12
- import os
13
- from typing import List, Tuple, Optional
14
  from pathlib import Path
15
 
16
  # ============================================================================
17
- # SISTEMA DE CONHECIMENTO (RAG Simplificado)
18
  # ============================================================================
19
 
20
  class KnowledgeBase:
21
- """Base de conhecimento do Prometheus com busca semântica simplificada."""
22
-
23
  def __init__(self):
24
  self.chunks = []
25
- self.conversations = []
26
- self.faqs = []
27
  self.loaded = False
28
  self.load_data()
29
 
30
  def load_data(self):
31
- """Carrega os dados do dataset."""
32
  try:
33
- # Carregar chunks
34
  chunks_path = Path("data/chunks.json")
35
  if chunks_path.exists():
36
  with open(chunks_path, "r", encoding="utf-8") as f:
37
  self.chunks = json.load(f)
 
38
  print(f"✅ Carregados {len(self.chunks)} chunks")
39
-
40
- # Carregar conversas sintéticas
41
- conv_path = Path("data/conversations.json")
42
- if conv_path.exists():
43
- with open(conv_path, "r", encoding="utf-8") as f:
44
- data = json.load(f)
45
- self.conversations = data.get("conversations", [])
46
- print(f"✅ Carregadas {len(self.conversations)} conversas")
47
-
48
- # Carregar FAQs
49
- faqs_path = Path("data/faqs.json")
50
- if faqs_path.exists():
51
- with open(faqs_path, "r", encoding="utf-8") as f:
52
- data = json.load(f)
53
- self.faqs = data.get("faqs", [])
54
- print(f"✅ Carregadas {len(self.faqs)} FAQs")
55
-
56
- self.loaded = True
57
-
58
  except Exception as e:
59
  print(f"⚠️ Erro ao carregar dados: {e}")
60
  self.loaded = False
61
 
62
- def search(self, query: str, top_k: int = 5) -> List[dict]:
63
- """Busca por similaridade simples baseada em palavras-chave."""
64
  if not self.chunks:
65
  return []
66
-
67
  query_lower = query.lower()
68
  query_words = set(query_lower.split())
69
-
70
- scored_chunks = []
71
  for chunk in self.chunks:
72
  text_lower = chunk.get("text", "").lower()
73
- # Score baseado em palavras encontradas
74
  score = sum(1 for word in query_words if word in text_lower)
75
  if score > 0:
76
- scored_chunks.append((score, chunk))
77
-
78
- # Ordenar por score e retornar top_k
79
- scored_chunks.sort(key=lambda x: x[0], reverse=True)
80
- return [chunk for _, chunk in scored_chunks[:top_k]]
81
-
82
- def get_relevant_context(self, query: str) -> str:
83
- """Retorna contexto relevante para a query."""
84
- chunks = self.search(query, top_k=3)
85
- if not chunks:
86
- return ""
87
-
88
- context_parts = []
89
- for chunk in chunks:
90
- text = chunk.get("text", "")
91
- section = chunk.get("section_title", "")
92
- if section:
93
- context_parts.append(f"**{section}**\n{text}")
94
- else:
95
- context_parts.append(text)
96
-
97
- return "\n\n---\n\n".join(context_parts)
98
-
99
-
100
- # Instância global da base de conhecimento
101
  kb = KnowledgeBase()
102
 
103
  # ============================================================================
@@ -140,13 +86,6 @@ A gamificação é o coração da nossa plataforma! Transformamos treinamentos e
140
  - **Leaderboards**: Rankings que estimulam competição saudável
141
  - **Missões Diárias**: Microlearning gamificado para engajamento constante
142
 
143
- ### Por que funciona?
144
- A gamificação melhora a retenção através de:
145
- 1. **Dopamina**: Recompensas liberam dopamina, criando associações positivas
146
- 2. **Repetição Espaçada**: Desafios diários reforçam o aprendizado
147
- 3. **Recall Ativo**: Quizzes e desafios fortalecem conexões neurais
148
- 4. **Aprendizado Social**: Leaderboards e equipes motivam através de pares
149
-
150
  ### Resultados Comprovados
151
  - **60%** aumento nas taxas de conclusão
152
  - **40%** redução no tempo de treinamento
@@ -163,10 +102,6 @@ O ROI típico de uma academia corporativa gamificada varia de **200% a 500%**.
163
  - 👥 **34%** menor turnover de colaboradores
164
  - 📉 **40%** menos erros de compliance
165
 
166
- ### Ganhos de Produtividade
167
- - 🚀 Novos colaboradores produtivos **50% mais rápido**
168
- - 📊 **23%** maior produtividade pós-treinamento
169
-
170
  ### Exemplo (500 colaboradores)
171
  | Item | Valor |
172
  |------|-------|
@@ -182,31 +117,23 @@ Quer uma análise de ROI personalizada para sua empresa?""",
182
  ### SSO/Identidade
183
  - SAML 2.0 e OAuth 2.0
184
  - Azure AD, Okta, OneLogin, Google Workspace
185
- - LDAP customizado
186
 
187
  ### HRIS
188
  - Workday, SAP SuccessFactors, BambooHR
189
  - ADP, Paylocity, UKG
190
- - REST API para integrações customizadas
191
 
192
  ### LMS/LXP
193
  - SCORM 1.2 e 2004
194
  - xAPI (Tin Can)
195
  - LTI para embedding
196
 
197
- ### Sincronização de Dados
198
- - Provisionamento automático de usuários
199
- - Sync de roles e departamentos
200
- - Exportação de dados de conclusão
201
-
202
  Implementação típica: **2-4 semanas**. Qual sistema você utiliza atualmente?""",
203
 
204
  "andragogia": """## 📚 Andragogia - A Ciência de Ensinar Adultos
205
 
206
- **Andragogia** (do grego 'andros' = adulto), conceito desenvolvido por Malcolm Knowles, reconhece que adultos aprendem diferentemente de crianças.
207
 
208
  ### Os 6 Princípios da Andragogia
209
-
210
  1. **Autodirigidos**: Adultos querem controle sobre seu aprendizado
211
  2. **Experiência como recurso**: Trazem bagagem que deve ser valorizada
212
  3. **Orientação para problemas**: Preferem aprender resolvendo problemas reais
@@ -214,15 +141,6 @@ Implementação típica: **2-4 semanas**. Qual sistema você utiliza atualmente?
214
  5. **Necessidade de saber 'por quê'**: Precisam entender a relevância
215
  6. **Prontos para aprender**: Quando percebem necessidade imediata
216
 
217
- ### Diferença entre Pedagogia e Andragogia
218
-
219
- | Aspecto | Pedagogia (Crianças) | Andragogia (Adultos) |
220
- |---------|---------------------|---------------------|
221
- | Motivação | Externa (notas) | Interna (crescimento) |
222
- | Experiência | Pouca | Rica e valorizada |
223
- | Orientação | Conteúdo | Problemas reais |
224
- | Papel do instrutor | Diretor | Facilitador |
225
-
226
  Na Academy Builder, aplicamos esses princípios em cada módulo!""",
227
 
228
  "sobre": """## 🏢 Sobre a Academy Builder
@@ -238,18 +156,6 @@ Transformar treinamento corporativo em experiências envolventes e mensuráveis
238
  - **CRM Integrado**: Lead scoring automático
239
  - **Integrações Enterprise**: SSO, HRIS, SCORM/xAPI
240
 
241
- ### Público-Alvo
242
- Empresas de médio e grande porte nos setores de:
243
- - Tecnologia
244
- - Finanças
245
- - Saúde
246
- - Educação
247
-
248
- ### Resultados
249
- - **60%** aumento em taxas de conclusão
250
- - **40%** redução no tempo de treinamento
251
- - **34%** maior retenção de colaboradores
252
-
253
  Quer saber mais sobre como podemos ajudar sua empresa?""",
254
 
255
  "default": """Obrigado pela sua pergunta!
@@ -262,172 +168,89 @@ Sou o **Prometheus**, assistente da Academy Builder. Posso ajudar com:
262
  - 🔧 Integrações técnicas
263
  - 📈 ROI e métricas de sucesso
264
 
265
- Poderia reformular sua pergunta ou me dizer especificamente como posso ajudar?
266
-
267
  **Sugestões:**
268
  - "Quais são os preços?"
269
  - "Como funciona a gamificação?"
270
  - "Qual o ROI esperado?"
271
- - "Quais integrações estão disponíveis?"
272
  """
273
  }
274
 
275
  # ============================================================================
276
- # SISTEMA DE RESPOSTA
277
  # ============================================================================
278
 
279
- def detect_intent(message: str) -> str:
280
- """Detecta a intenção da mensagem do usuário."""
281
- message_lower = message.lower()
282
 
283
- # Saudações
284
- if any(word in message_lower for word in ["olá", "oi", "hello", "hi", "bom dia", "boa tarde", "boa noite", "hey"]):
285
  return "saudacao"
286
-
287
- # Preços
288
- if any(word in message_lower for word in ["preço", "custo", "valor", "price", "pricing", "quanto custa", "plano", "planos"]):
289
  return "precos"
290
-
291
- # Gamificação
292
- if any(word in message_lower for word in ["gamificação", "gamification", "xp", "badge", "leaderboard", "pontos", "ranking", "jogo"]):
293
  return "gamificacao"
294
-
295
- # ROI
296
- if any(word in message_lower for word in ["roi", "retorno", "investimento", "return", "resultado", "benefício", "economia"]):
297
  return "roi"
298
-
299
- # Integração
300
- if any(word in message_lower for word in ["integração", "integration", "sso", "api", "hris", "scorm", "xapi", "conectar"]):
301
  return "integracao"
302
-
303
- # Andragogia/Educação
304
- if any(word in message_lower for word in ["andragogia", "pedagogia", "aprendizagem", "adulto", "ensino", "educação", "metodologia"]):
305
  return "andragogia"
306
-
307
- # Sobre a empresa
308
- if any(word in message_lower for word in ["sobre", "about", "empresa", "company", "quem", "vocês", "academy builder"]):
309
  return "sobre"
310
 
311
  return "default"
312
 
 
 
 
313
 
314
- def generate_response(message: str, history: List[List[str]]) -> str:
315
- """Gera resposta baseada na intenção detectada."""
316
-
317
  if not message or not message.strip():
318
  return "Por favor, digite uma mensagem para que eu possa ajudá-lo."
319
 
320
- # Detectar intenção
321
  intent = detect_intent(message)
322
-
323
- # Buscar resposta pré-definida
324
  response = RESPONSES.get(intent, RESPONSES["default"])
325
 
326
- # Se tiver contexto relevante da base de conhecimento, adicionar
327
  if intent == "default" and kb.loaded:
328
- context = kb.get_relevant_context(message)
329
- if context:
330
- response = f"""Com base na sua pergunta, encontrei informações relevantes:
 
 
331
 
332
- {context[:2000]}
333
 
334
  ---
335
 
336
- Posso detalhar algum ponto específico ou ajudar com outra questão?"""
337
 
338
  return response
339
 
340
-
341
  # ============================================================================
342
  # INTERFACE GRADIO
343
  # ============================================================================
344
 
345
- def respond(message: str, history: List[List[str]]) -> Tuple[str, List[List[str]]]:
346
- """Handler para o chatbot."""
347
- if not message.strip():
348
- return "", history
349
-
350
- response = generate_response(message, history)
351
- history.append([message, response])
352
- return "", history
353
-
354
-
355
- def clear_chat() -> Tuple[List, str]:
356
- """Limpa o histórico do chat."""
357
- return [], ""
358
-
359
-
360
- # Criar interface
361
- with gr.Blocks(
362
- title="Prometheus - Academy Builder Assistant",
363
  theme=gr.themes.Soft(
364
  primary_hue="blue",
365
  secondary_hue="yellow",
366
- )
367
- ) as demo:
368
-
369
- gr.Markdown("""
370
- # 🎓 Prometheus - Academy Builder AI Assistant
371
-
372
- Assistente híbrido de **vendas + educacional** para academias corporativas gamificadas.
373
-
374
- Posso ajudar com informações sobre produtos, preços, conceitos de gamificação,
375
- design instrucional e muito mais!
376
- """)
377
-
378
- chatbot = gr.Chatbot(
379
- label="Conversa",
380
- height=450,
381
- show_copy_button=True,
382
- )
383
-
384
- with gr.Row():
385
- msg = gr.Textbox(
386
- label="Sua mensagem",
387
- placeholder="Digite sua pergunta aqui... (Ex: Como funciona a gamificação?)",
388
- scale=4,
389
- show_label=False,
390
- )
391
- submit = gr.Button("Enviar", variant="primary", scale=1)
392
-
393
- clear = gr.Button("🗑️ Limpar conversa")
394
-
395
- with gr.Accordion("💡 Sugestões de perguntas", open=False):
396
- gr.Markdown("""
397
- **Vendas:**
398
- - Quais são os planos e preços da Academy Builder?
399
- - Qual o ROI típico de uma academia corporativa?
400
-
401
- **Educacional:**
402
- - Como a gamificação melhora a retenção de aprendizado?
403
- - Qual a diferença entre pedagogia e andragogia?
404
-
405
- **Técnico:**
406
- - Quais integrações estão disponíveis?
407
- - A plataforma suporta SSO?
408
-
409
- **Geral:**
410
- - O que é a Academy Builder?
411
- - Como posso começar?
412
- """)
413
-
414
- with gr.Accordion("ℹ️ Sobre o Prometheus", open=False):
415
- status = "✅ Carregada" if kb.loaded else "⚠️ Modo offline"
416
- gr.Markdown(f"""
417
- **Prometheus** é o assistente de IA da Academy Builder.
418
-
419
- **Status da Base de Conhecimento:** {status}
420
- - 📚 **{len(kb.chunks)}** chunks de conhecimento
421
- - 💬 **{len(kb.conversations)}** conversas de exemplo
422
- - ❓ **{len(kb.faqs)}** FAQs estruturadas
423
-
424
- **Desenvolvido por:** Academy Builder / MSC Academy
425
- """)
426
-
427
- # Event handlers
428
- msg.submit(respond, [msg, chatbot], [msg, chatbot])
429
- submit.click(respond, [msg, chatbot], [msg, chatbot])
430
- clear.click(clear_chat, outputs=[chatbot, msg])
431
 
432
- # Launch
433
- demo.launch()
 
1
  """
2
  Prometheus - Academy Builder AI Assistant
3
  =========================================
4
+ Assistente híbrido de vendas + educacional para academias corporativas gamificadas.
 
 
 
5
  """
6
 
7
  import gradio as gr
8
  import json
 
 
9
  from pathlib import Path
10
 
11
  # ============================================================================
12
+ # BASE DE CONHECIMENTO
13
  # ============================================================================
14
 
15
  class KnowledgeBase:
 
 
16
  def __init__(self):
17
  self.chunks = []
 
 
18
  self.loaded = False
19
  self.load_data()
20
 
21
  def load_data(self):
 
22
  try:
 
23
  chunks_path = Path("data/chunks.json")
24
  if chunks_path.exists():
25
  with open(chunks_path, "r", encoding="utf-8") as f:
26
  self.chunks = json.load(f)
27
+ self.loaded = True
28
  print(f"✅ Carregados {len(self.chunks)} chunks")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  except Exception as e:
30
  print(f"⚠️ Erro ao carregar dados: {e}")
31
  self.loaded = False
32
 
33
+ def search(self, query, top_k=3):
 
34
  if not self.chunks:
35
  return []
 
36
  query_lower = query.lower()
37
  query_words = set(query_lower.split())
38
+ scored = []
 
39
  for chunk in self.chunks:
40
  text_lower = chunk.get("text", "").lower()
 
41
  score = sum(1 for word in query_words if word in text_lower)
42
  if score > 0:
43
+ scored.append((score, chunk))
44
+ scored.sort(key=lambda x: x[0], reverse=True)
45
+ return [c for _, c in scored[:top_k]]
46
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  kb = KnowledgeBase()
48
 
49
  # ============================================================================
 
86
  - **Leaderboards**: Rankings que estimulam competição saudável
87
  - **Missões Diárias**: Microlearning gamificado para engajamento constante
88
 
 
 
 
 
 
 
 
89
  ### Resultados Comprovados
90
  - **60%** aumento nas taxas de conclusão
91
  - **40%** redução no tempo de treinamento
 
102
  - 👥 **34%** menor turnover de colaboradores
103
  - 📉 **40%** menos erros de compliance
104
 
 
 
 
 
105
  ### Exemplo (500 colaboradores)
106
  | Item | Valor |
107
  |------|-------|
 
117
  ### SSO/Identidade
118
  - SAML 2.0 e OAuth 2.0
119
  - Azure AD, Okta, OneLogin, Google Workspace
 
120
 
121
  ### HRIS
122
  - Workday, SAP SuccessFactors, BambooHR
123
  - ADP, Paylocity, UKG
 
124
 
125
  ### LMS/LXP
126
  - SCORM 1.2 e 2004
127
  - xAPI (Tin Can)
128
  - LTI para embedding
129
 
 
 
 
 
 
130
  Implementação típica: **2-4 semanas**. Qual sistema você utiliza atualmente?""",
131
 
132
  "andragogia": """## 📚 Andragogia - A Ciência de Ensinar Adultos
133
 
134
+ **Andragogia** reconhece que adultos aprendem diferentemente de crianças.
135
 
136
  ### Os 6 Princípios da Andragogia
 
137
  1. **Autodirigidos**: Adultos querem controle sobre seu aprendizado
138
  2. **Experiência como recurso**: Trazem bagagem que deve ser valorizada
139
  3. **Orientação para problemas**: Preferem aprender resolvendo problemas reais
 
141
  5. **Necessidade de saber 'por quê'**: Precisam entender a relevância
142
  6. **Prontos para aprender**: Quando percebem necessidade imediata
143
 
 
 
 
 
 
 
 
 
 
144
  Na Academy Builder, aplicamos esses princípios em cada módulo!""",
145
 
146
  "sobre": """## 🏢 Sobre a Academy Builder
 
156
  - **CRM Integrado**: Lead scoring automático
157
  - **Integrações Enterprise**: SSO, HRIS, SCORM/xAPI
158
 
 
 
 
 
 
 
 
 
 
 
 
 
159
  Quer saber mais sobre como podemos ajudar sua empresa?""",
160
 
161
  "default": """Obrigado pela sua pergunta!
 
168
  - 🔧 Integrações técnicas
169
  - 📈 ROI e métricas de sucesso
170
 
 
 
171
  **Sugestões:**
172
  - "Quais são os preços?"
173
  - "Como funciona a gamificação?"
174
  - "Qual o ROI esperado?"
 
175
  """
176
  }
177
 
178
  # ============================================================================
179
+ # DETECÇÃO DE INTENÇÃO
180
  # ============================================================================
181
 
182
+ def detect_intent(message):
183
+ msg = message.lower()
 
184
 
185
+ if any(w in msg for w in ["olá", "oi", "hello", "hi", "bom dia", "boa tarde", "boa noite", "hey"]):
 
186
  return "saudacao"
187
+ if any(w in msg for w in ["preço", "custo", "valor", "price", "quanto custa", "plano"]):
 
 
188
  return "precos"
189
+ if any(w in msg for w in ["gamificação", "gamification", "xp", "badge", "leaderboard", "pontos"]):
 
 
190
  return "gamificacao"
191
+ if any(w in msg for w in ["roi", "retorno", "investimento", "return", "resultado"]):
 
 
192
  return "roi"
193
+ if any(w in msg for w in ["integração", "integration", "sso", "api", "hris", "scorm"]):
 
 
194
  return "integracao"
195
+ if any(w in msg for w in ["andragogia", "pedagogia", "aprendizagem", "adulto", "ensino"]):
 
 
196
  return "andragogia"
197
+ if any(w in msg for w in ["sobre", "about", "empresa", "academy builder", "quem"]):
 
 
198
  return "sobre"
199
 
200
  return "default"
201
 
202
+ # ============================================================================
203
+ # FUNÇÃO DE RESPOSTA
204
+ # ============================================================================
205
 
206
+ def respond(message, history):
207
+ """Gera resposta para o chatbot."""
 
208
  if not message or not message.strip():
209
  return "Por favor, digite uma mensagem para que eu possa ajudá-lo."
210
 
 
211
  intent = detect_intent(message)
 
 
212
  response = RESPONSES.get(intent, RESPONSES["default"])
213
 
214
+ # Se for default, tentar buscar na base de conhecimento
215
  if intent == "default" and kb.loaded:
216
+ chunks = kb.search(message)
217
+ if chunks:
218
+ context = "\n\n".join([c.get("text", "")[:500] for c in chunks[:2]])
219
+ if context:
220
+ response = f"""Com base na sua pergunta, encontrei informações relevantes:
221
 
222
+ {context}
223
 
224
  ---
225
 
226
+ Posso detalhar algum ponto específico?"""
227
 
228
  return response
229
 
 
230
  # ============================================================================
231
  # INTERFACE GRADIO
232
  # ============================================================================
233
 
234
+ demo = gr.ChatInterface(
235
+ fn=respond,
236
+ title="🎓 Prometheus - Academy Builder AI Assistant",
237
+ description="Assistente híbrido de **vendas + educacional** para academias corporativas gamificadas.\n\nPosso ajudar com informações sobre produtos, preços, conceitos de gamificação, design instrucional e muito mais!",
238
+ examples=[
239
+ "Olá!",
240
+ "Quais são os preços?",
241
+ "Como funciona a gamificação?",
242
+ "Qual o ROI esperado?",
243
+ "Quais integrações estão disponíveis?",
244
+ "O que é andragogia?",
245
+ "Fale sobre a Academy Builder"
246
+ ],
 
 
 
 
 
247
  theme=gr.themes.Soft(
248
  primary_hue="blue",
249
  secondary_hue="yellow",
250
+ ),
251
+ retry_btn=None,
252
+ undo_btn=None,
253
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
 
255
+ if __name__ == "__main__":
256
+ demo.launch()