Skip to content

Monitorização e Garantia de Qualidade

Esta página descreve a configuração de monitorização, métricas chave e estratégias de teste para a plataforma GamiBot.


Métricas Principais

MétricaObjetivoFerramenta de Monitorização
Latência de consulta (Esclarecimento de Dúvidas)< 5 segApplication Insights
Tempo de geração de quiz< 15 segMétricas LangFlow
Precisão de pesquisa Qdrant (NDCG@5)> 0.8Dataset de avaliação
Satisfação do aluno (NPS)> 7/10Inquérito pós-interação
Uptime do sistema> 99.5%Prometheus + Alerting
Qualidade de embedding (similaridade cosseno)> 0.75 para chunks relevantesAuditoria manual

Configuração Prometheus

Métricas Personalizadas

python
from prometheus_client import Counter, Histogram

# Contadores de pedidos
chat_requests = Counter(
    'gamibot_chat_requests_total',
    'Total de pedidos de chat',
    ['workflow_type', 'course_id']
)

# Histograma de latência
response_latency = Histogram(
    'gamibot_response_latency_seconds',
    'Latência de resposta em segundos',
    ['workflow_type'],
    buckets=[0.5, 1, 2, 5, 10, 30]
)

# Exemplo de utilização
@response_latency.labels(workflow_type='summarization').time()
def summarize_content(query, course_id):
    chat_requests.labels(
        workflow_type='summarization',
        course_id=course_id
    ).inc()
    # ... lógica de sumarização

Dashboards Grafana

Painéis Principais

PainelDescrição
Taxa de PedidosPedidos de chat por minuto por tipo de fluxo
Latência P95Tempo de resposta do percentil 95
Taxa de ErrosErros por minuto por tipo
Saúde QdrantEstado da base de dados vetorial e tempos de consulta
Utilização LLMConsumo de tokens e custos

Regras de Alerta

yaml
# alerting_rules.yml
groups:
  - name: gamibot_alerts
    rules:
      - alert: AltaLatencia
        expr: histogram_quantile(0.95, gamibot_response_latency_seconds_bucket) > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Alta latência de resposta detetada"
          description: "Latência P95 é {{ $value }}s"

      - alert: AltaTaxaErros
        expr: rate(gamibot_errors_total[5m]) > 0.1
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Alta taxa de erros detetada"
          description: "Taxa de erros é {{ $value }} por segundo"

      - alert: QdrantInativo
        expr: up{job="qdrant"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Qdrant está inativo"

Estratégia de Testes

Testes Unitários

ComponenteFoco do Teste
Plugin MoodleParsing de webhook, gestão de eventos
Fluxo LangFlowExecução de nós, fluxo de dados
Consultas QdrantLógica de filtro, precisão de pesquisa
Extração de textoParsing de PDF, PPTX, EPUB

Testes de Integração

TesteDescrição
Ingestão end-to-endUpload de ficheiro → Armazenamento Qdrant
Fluxo de sumarizaçãoConsulta → LLM → Resposta
Ciclo de quizGeração → Respostas → Feedback

Testes de Aceitação do Utilizador (UAT)

FaseDetalhes
Cursos piloto2–3 cursos (50+ alunos)
Recolha de feedbackUsabilidade, precisão de conteúdo, qualidade de resposta
IteraçãoRefinamento de prompts e configurações

Testes de Desempenho

Tipo de TesteCenário
Teste de carga100 alunos concorrentes a consultar
Teste de stressIngestão de ficheiro de 1 GB
Teste de resistência8 horas de operação contínua

Verificações de Saúde

Configuração de Endpoint

python
@app.get("/health")
async def health_check():
    checks = {
        "qdrant": await check_qdrant(),
        "database": await check_database(),
        "llm_provider": await check_llm(),
    }
    
    all_healthy = all(checks.values())
    
    return {
        "status": "healthy" if all_healthy else "unhealthy",
        "checks": checks,
        "timestamp": datetime.utcnow().isoformat()
    }

Verificação de Saúde Docker

yaml
# docker-compose.yml
services:
  langflow:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:7860/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

Próximos Passos

Released under the MIT License.