TP1: O Classificador de Habilidades
Redes Neurais, NLP e MLOps (Fases 1 e 2 do Pipeline)
🧭 Por que este TP existe?
Volte ao metadata.yaml do exercício “Divisão” que você viu na página de Visão Geral. Repare no campo skills:
skills:
- "matematica"
- "io"Esses rótulos dizem quais habilidades cognitivas um aluno precisa dominar para resolver aquele exercício. Hoje, quem classifica essas skills é o professor, manualmente. Isso é lento, subjetivo e não escala para centenas de exercícios.
A missão do TP1 é construir uma Rede Neural Clássica que leia o texto bruto de um enunciado de programação e preveja automaticamente quais skills ele exige. Esse modelo será o motor das Fases 1 e 2 do Pipeline WOKDEX.
📖 Leitura Obrigatória (Fundamentação)
Antes de programar, vocês precisam ler e entender estes dois artigos científicos. Eles serão a base do Draft 1 na seção de Trabalhos Relacionados.
- Artigo 1: Kim, Y. (2014). “Convolutional Neural Networks for Sentence Classification”. arXiv:1408.5882
-
Por que ler: É exatamente o que vocês vão construir — uma rede neural que recebe uma frase e classifica em categorias. O paper tem apenas 6 páginas e mostra como vetorizações de texto (Word2Vec, TF-IDF) alimentam um classificador profundo. A arquitetura descrita é a referência mais citada do mundo para classificação de texto com Deep Learning.
- Artigo 2: Feng, Z. et al. (2020). “CodeBERT: A Pre-Trained Model for Programming and Natural Language”. arXiv:2002.08155
-
Por que ler: Enquanto o artigo anterior trata de classificação de textos genéricos, este mostra que existe um campo de pesquisa inteiro dedicado a aplicar NLP especificamente em código-fonte e enunciados de programação. Vocês não vão usar o CodeBERT em si (ele é pesado demais para o escopo do TP), mas entender que o problema que vocês estão atacando já é estudado por grandes labs (Microsoft Research) dá lastro científico ao Draft 1.
📚 O que é uma Skill no WOKDEX?
As skills são um vocabulário controlado definido no JSON Schema oficial do WOKDEX. Abaixo estão algumas das skills mais relevantes para os exercícios de nível CS1 e CS2:
| Skill | Significado | Exemplo de Exercício |
|---|---|---|
io |
Entrada e saída de dados | “Leia dois números e imprima a soma” |
condicionais |
Estruturas if/else | “Diga se o número é par ou ímpar” |
lacos |
Estruturas de repetição (for/while) | “Imprima os N primeiros termos de Fibonacci” |
vetores |
Manipulação de arrays | “Encontre o maior valor de um vetor” |
matrizes |
Arrays bidimensionais | “Multiplique duas matrizes” |
matematica |
Operações aritméticas e fórmulas | “Calcule a área de um triângulo” |
strings |
Manipulação de texto | “Inverta uma palavra” |
recursividade |
Chamadas recursivas | “Calcule o fatorial de N” |
ordenacao |
Algoritmos de ordenação | “Ordene um vetor de inteiros” |
grafos |
Estruturas de grafos | “Encontre o caminho mínimo entre dois vértices” |
[!NOTE] O seu modelo não precisa prever todas as skills. Para o TP1, o professor definirá um subconjunto (por exemplo, 5 a 8 skills de CS1) que será o alvo de classificação da sua Rede Neural.
📦 O Dataset (Corpus de Exercícios)
O professor fornecerá um Corpus estruturado de exercícios de programação. Este corpus pode vir em dois formatos:
- Pasta com arquivos
.md: Cada arquivo Markdown contém o enunciado de um problema no corpo do texto e as skills corretas no cabeçalho YAML (frontmatter). - Arquivo
.csvconsolidado: Uma tabela com colunasenunciadoeskills.
Exemplo de um arquivo .md do corpus:
---
skills: ["lacos", "vetores"]
level: "CS1"
---
# Maior Valor
Leia um inteiro N, seguido de N números inteiros.
Imprima o maior valor lido.As skills que estão no cabeçalho YAML são o Ground Truth (gabarito do professor). Este gabarito vem diretamente do YAML original da tese WOKDEX. Vocês usarão esses rótulos para:
- Treinar a Rede Neural (como dados de treinamento supervisionado).
- Medir a acurácia do modelo (comparando a predição da rede contra o gabarito).
- Comparar com LLMs no TP3 (quem classifica melhor: a sua rede ou o ChatGPT?).
Data Limite de Entrega (Checkpoint 1): 31/08 (Segunda-feira)
Valor: 10 Pontos (5 em Grupo, 5 Individual)
👥 A Divisão de Tarefas na Equipe (4 Alunos)
Sua equipe deverá se dividir em duas grandes forças-tarefa.
🔬 Dupla 1: Ciência e Dados (O Cérebro)
Esta dupla é focada puramente na matemática, no processamento de linguagem natural (NLP) clássico e no treinamento da Rede Neural. O output final dessa dupla é um arquivo .h5 ou .keras com os pesos do modelo treinado, além dos relatórios de acurácia.
- Aluno A (Engenheiro de Dados):
- Trabalho Individual: Receber o Dataset fornecido pelo professor (que pode ser um consolidado em
.csvou uma pasta com múltiplos arquivos.md). O aluno construirá o pipeline de carga e limpeza de texto (remover stopwords, realizar stemming/lemmatization) e vetorizará os enunciados para formato numérico (ex:TF-IDFouWord2Vec).
- Trabalho Individual: Receber o Dataset fornecido pelo professor (que pode ser um consolidado em
- Aluno B (Engenheiro de Machine Learning):
- Trabalho Individual: Construir a arquitetura da Rede Neural profunda usando a biblioteca Keras. Definir o número de camadas densas, a função de ativação, a camada de saída multiclasse (Softmax) e rodar as épocas de treinamento. Validar o modelo gerando a Matriz de Confusão.
⚙️ Dupla 2: Engenharia de Software (A Casca)
Modelos parados no Jupyter Notebook não viram produto. A função desta dupla é aplicar MLOps: pegar a rede neural da Dupla 1 e criar um servidor Web moderno que receba requisições de outros sistemas.
- Aluno C (Dev Backend Python):
- Trabalho Individual: Importar o modelo da dupla anterior dentro do microframework FastAPI. Criar a rota de inferência (
POST /predict). Garantir que os dados de entrada e saída sigam contratos rígidos de segurança utilizando a biblioteca Pydantic.
- Trabalho Individual: Importar o modelo da dupla anterior dentro do microframework FastAPI. Criar a rota de inferência (
- Aluno D (DevOps e Cloud):
- Trabalho Individual: Conteinerizar todo o ambiente usando o Docker. Escrever o
Dockerfileideal, leve e seguro. Implementar os testes unitários (pytest) da API e orquestrar a integração contínua (GitLab CI) para que a imagem rode sem quebrar em qualquer máquina.
- Trabalho Individual: Conteinerizar todo o ambiente usando o Docker. Escrever o
🔌 A API que você vai construir
O produto final de engenharia do TP1 é uma API REST que recebe o texto de um enunciado e retorna as skills previstas. Abaixo está o contrato exato:
Requisição: POST /predict
{
"enunciado": "Leia dois números inteiros A e B. Imprima o resultado da divisão de A por B com duas casas decimais."
}Resposta esperada:
{
"skills": [
{ "skill": "io", "confidence": 0.92 },
{ "skill": "matematica", "confidence": 0.88 },
{ "skill": "variaveis", "confidence": 0.71 }
],
"model_version": "v1.0",
"input_length": 95
}[!IMPORTANT] No TP3, o Agente Autônomo vai chamar esta API como uma ferramenta (
predict_skills()). Se a sua API não estiver de pé e respondendo neste formato, o agente do TP3 não funciona. É por isso que o Docker é obrigatório.
📝 A Entrega Global (O Grupo)
1. O Código Unificado
Os códigos individuais devem ser commitados no repositório do grupo no GitLab. A entrega de Engenharia é o projeto finalizado. * Auditoria: O professor irá clonar o repositório e executar um docker build e um docker run. A API deve estar de pé e responder a um pacote JSON no endpoint /predict.
2. O Rascunho Científico (Draft 1)
O grupo, em conjunto, entregará um Rascunho de Artigo Científico (formato SBC) de 2 a 3 páginas. O escopo do TP1 foca nas seguintes seções: * Trabalhos Relacionados: Cite e explique brevemente as literaturas base (ex: papéis clássicos sobre NLP em código-fonte, como CodeBERT ou abordagens via deep learning). * Metodologia Preditiva: Descreva exatamente a arquitetura que a Dupla 1 escolheu para a Rede Neural, justifique a função de Loss escolhida, e exiba os gráficos de convergência. * Aferição contra o Gabarito (Ground Truth): O Corpus fornecido pelo professor possui as habilidades corretas já definidas (YAML original do WOKDEX). O grupo deve reportar a precisão da rede contra esse gabarito, pois esses números serão usados na batalha final contra os LLMs no TP3.
📊 Rubrica de Avaliação Detalhada (10 Pontos)
Nota Individual (5 pts)
| Critério | Pontos | Detalhes |
|---|---|---|
| Commits individuais na branch correta | 1 | Avaliado via Git Blame |
| Pipeline de dados funciona (Aluno A) OU Rede treina (Aluno B) OU API responde (Aluno C) OU Docker sobe (Aluno D) | 3 | O módulo individual funciona isoladamente |
| Qualidade e organização do código | 1 | Docstrings, nomes de variáveis, ausência de código morto |
Nota do Grupo (5 pts)
| Critério | Pontos | Detalhes |
|---|---|---|
| API integrada responde no formato correto | 2 | docker run + curl POST /predict funciona |
| Acurácia da Rede Neural contra o Ground Truth | 1 | Mínimo esperado: > 50% de acurácia no dataset de teste |
| Draft 1 com gráficos e metodologia | 2 | Matriz de confusão, curva de loss, justificativa de arquitetura |
(O professor fornecerá um Dataset estruturado (CSV) ou um Corpus de arquivos Markdown (.md). Caso a base original seja pequena, o professor utilizará Data Augmentation para gerar centenas de problemas sintéticos, garantindo volume para o treino da Rede).