Dois modelos para gastar
LLM só onde vale
Prever quem vai parar de estudar, e decidir quais respostas discursivas precisam mesmo da correção por LLM. Dados públicos, linha de base declarada e dois protótipos que rodam no navegador.
Projeto TrailUp · github.com/Geisbelly/core-trailup
→ ← navegam (ou deslize o dedo). O índice · N notas · F tela cheia.
O que vem pela frente
| Bloco | Conteúdo | Tempo |
|---|---|---|
| Problema | as duas perguntas e por que elas custam dinheiro | 3 min |
| Dados | as bases públicas e como foram preparadas | 3 min |
| Método | os eixos, a regressão logística, o grafo de coocorrência | 4 min |
| Resultados | cada número ao lado da sua linha de base | 3 min |
| Limites | o que não funcionou, os erros, o que falta | 2 min |
Os dois modelos respondem à mesma pergunta de fundo: uma chamada de LLM custa tempo e dinheiro, e não dá para fazer uma por aluno ou uma por resposta. Quem decide onde gastar precisa ser barato.
O aluno não cancela. Ele para de aparecer
Plataforma de estudo não tem aviso de saída. A pessoa vai espaçando as sessões até sumir, e quando alguém percebe já passou o momento de agir.
A pergunta: olhando quatro semanas de comportamento, dá para saber quem não volta no mês seguinte? Se der, uma ação barata pode ir para quem precisa, em vez de ir para todo mundo.
Em curso obrigatório quase todo mundo volta, porque tem nota e presença. Em aplicativo de autoestudo quase ninguém volta, porque não custa nada parar. Um modelo treinado em uma dessas realidades não sabe em qual das duas está sendo usado.
Corrigir texto aberto com LLM custa por resposta
Mandar toda resposta discursiva para uma LLM significa pagar e esperar por cada uma. Não mandar nenhuma significa não corrigir. Queríamos saber se dá para resolver as pontas sozinhos.
- A resposta em branco não precisa de LLM para ser reprovada.
- A que cobre o gabarito inteiro não precisa de LLM para passar.
- O meio é onde a decisão é difícil, e é só ele que deveria custar.
Duas bases escolhidas por serem opostas
| Base | O que é | Alunos | Não voltam |
|---|---|---|---|
| EdNet KT3 | autoestudo de inglês, adulto, coreano. Sem turma e sem matrícula: continuar é decisão de quem estuda | 26.547 | 86,2% |
| OULAD | universidade britânica a distância, com turma, professor e abandono registrado | 25.434 | 8,5% |
| Painel completo | 51.981 |
EdNet KT3, CC BY-NC 4.0. OULAD, CC BY 4.0. Os arquivos não estão no repositório porque o EdNet sozinho tem 4,2 GB; os scripts dizem onde baixar.
classEx: 1.167 respostas, cada uma avaliada três vezes
O alvo é nota de LLM, não de professor: é a limitação mais séria do modelo 2. Cerca de 87% das notas caem em 3 ou 4, então há pouquíssimo exemplo nas pontas.
Uma janela mede, a outra confere
- Nada da segunda janela entra no cálculo dos eixos. É a regra que impede vazamento.
- Quem teve menos de 30 eventos na primeira janela fica de fora.
- O desfecho não foi rotulado por nós: "voltou" é ter qualquer atividade nos dias 30 a 59.
A métrica é AUC, e ela não é porcentagem de acerto
Sorteie dois alunos, um que voltou e um que não voltou. AUC é a probabilidade de o modelo ter dado risco maior para o que não voltou. 0,50 é jogar uma moeda; 1,00 é ordenar certo todos os pares. A métrica olha só a ordem dos riscos.
Acurácia mentiria aqui: no OULAD 91,5% dos alunos voltam, então um modelo que nunca alerta ninguém acerta 91,5% sem separar ninguém. Em AUC esse modelo fica em 0,50.
Cada eixo foi testado sozinho, nas duas bases
Antes de juntar qualquer coisa, medimos a AUC de cada eixo isolado. Só entrou no modelo quem funcionou nas duas realidades.
Entram recência e frequência. A profundidade fica em 0,516 no OULAD, que é quase moeda. O volume nem é calculável lá, porque a base não registra hora.
Regressão logística de duas variáveis, padronizadas por coorte
z = (valor do aluno − media da coorte) / desvio da coorte risco = 1 / (1 + e^−(b0 + b1·z_recencia + b2·z_frequencia))
Coorte é o conjunto de alunos de uma mesma base. "Seis dias ativos em dez" quer dizer coisas diferentes no EdNet e no OULAD, então cada valor vira "quantos desvios acima ou abaixo da média daquela plataforma".
O ganho é pequeno, e está declarado como pequeno
Cada número é a média de 12 divisões independentes dos alunos entre treino e teste, com o desvio entre elas. Não é o resultado de uma divisão só: uma divisão sortuda já nos deu um número melhor que o real, e ele foi parar em vários lugares antes de ser corrigido.
A frequência faz quase todo o trabalho. O modelo acrescenta combinar os dois eixos de forma estável: o peso da recência é 3,2 vezes o da frequência nas 12 partições.
A ordem transfere entre plataformas. O nível não
O modelo não entrega um rótulo de risco, entrega uma posição na fila. Para alertar os 10% de maior risco de cada coorte, o corte muda de uma base para a outra:
Levar o limiar de uma base para a outra troca completamente quem é alertado. Por isso calibrar em cada plataforma é requisito de uso, não detalhe de ajuste fino.
O modelo 2 compara dois conjuntos de palavras
Ele não chama LLM em momento nenhum: os únicos imports são re,
collections, dataclasses e math. Separa o texto em
palavras de três letras ou mais, tira as que aparecem em mais de 40% dos textos do tópico,
transforma cada palavra restante em nó e cada par a até quatro posições em aresta.
Dez contagens, uma soma ponderada, uma nota
O que é contado
- Quanto do gabarito a resposta cobre, em palavras distintas e em peso.
- Quantos dos conceitos centrais aparecem.
- Quanto da resposta não está no gabarito nem no enunciado.
- Quantas ligações entre palavras reaparecem.
- O tamanho: caracteres, nós e arestas.
Como isso vira nota
nota = b0 + Σ (peso · contagem) nota = limitar(nota, 1, 5)
Os pesos vieram de uma regressão ridge ajustada no treino e estão fixos no módulo. Rodar o modelo não treina nada.
Como se mede um modelo que ordena respostas
Correlação entre a ordem prevista e a ordem real das notas, de −1 a 1. Responde "as respostas melhores ficaram acima?", e não "o número da nota está certo?". É a métrica adequada para triagem, que é ordenar uma fila.
Cada resposta foi avaliada três vezes pelo mesmo GPT-4. Comparando duas dessas execuções entre si, a correlação é 0,883: é o quanto o avaliador concorda consigo mesmo. Como o alvo do treino é a média dessas notas, nenhum modelo ajustado contra elas passa muito disso.
A outra métrica das tabelas é QWK, que compara as notas arredondadas e penaliza mais os erros grandes que os pequenos.
A linha de base aqui é contar palavras
Em avaliação automática de texto, resposta longa costuma ganhar nota maior. Se contar palavras chega perto do modelo, o resto não está fazendo nada.
O modelo ganha da melhor contagem isolada por 0,033, com intervalo de 95% entre 0,005 e 0,061, positivo em 99% das reamostragens por aluno. Em 12 partições, 0,495 ± 0,021.
Onde um Spearman de 0,50 é suficiente
Ordenar exige menos do modelo do que pontuar. Por isso o uso defensável é escolher a ordem da fila e resolver as pontas, e não escrever uma nota na prova do aluno.
O que tentamos e não deu certo
A primeira ideia para o modelo 2 era a intuitiva: dar mais texto do assunto à referência. Testamos acrescentar ao gabarito as respostas bem avaliadas de outros alunos da mesma tarefa.
Referência grande fica genérica, qualquer resposta cobre algum pedaço dela, inclusive a ruim, e a cobertura perde o poder de separar. Também descartados: LSA, que não mudou nada; boosting, pior que a regressão; e um encoder pré-treinado, +0,057 ao custo de 900 MB. No modelo 1, percentil em vez de padronização: AUC igual e calibração pior.
Três erros nossos que quase viraram conclusão
1. Um teste que não testava
A primeira versão preenchia o eixo não medível do OULAD com outra coluna. O teste de replicação passava comparando uma coluna com ela mesma.
2. Um teste de vazamento vazio
Comparávamos valores crus contra padronizados treinando em uma base e testando na outra. Dava sempre o mesmo número, porque padronizar não muda a ordem e AUC só olha ordem.
3. Uma API que deixou omitir argumentos
A primeira medição do modelo 2 chamou a função de preparo só com o gabarito, sem o enunciado e sem as palavras frequentes do corpus. Deu 0,429, abaixo da cobertura sozinha, que dá 0,463. Íamos concluir que as outras nove contagens não valiam nada.
Chamando do jeito documentado o número é 0,495 e a conclusão inverte. A diferença de 0,066 é maior que o ganho de todas as nove contagens extras.
O que estes números não dizem
Modelo 1
Mede permanência, não aprendizado.
Nenhum dos eixos prevê ganho de acerto entre um mês e outro. Quem aparece todo dia e não avança é classificado como engajado, porque é isso que a nossa definição diz. Pode não ser a definição que interessa a quem ensina.
Modelo 2
Aprendeu a concordar com o GPT-4.
O modelo não chama LLM para funcionar, mas o alvo do treino é nota de LLM. Se o GPT-4 erra de forma sistemática, nada nesta medição percebe, porque não há nota humana no corpus.
A janela de 30 dias foi escolhida por conveniência e não testamos alternativas. As duas bases são estrangeiras e de adultos. Os pesos do modelo 2 foram ajustados em alemão, em uma disciplina só: as contagens não dependem do idioma, os pesos dependem.
Do clone aos números
git clone https://github.com/Geisbelly/core-trailup.git cd core-trailup/seminario && pip install -r requirements.txt # modelo 2: roda agora, o corpus esta no repositorio cd scripts && python3 07_discursivo.py python3 08_discursivo_operacao.py # pre-filtro, triagem, custo python3 09_conferir_port.py # o JavaScript bate com o Python? # modelo 1: precisa baixar as duas bases, ver dados/README.md python3 01_preparar.py 02_eixos.py 03_vazamento.py python3 04_treinar.py 05_calibrar.py 06_exportar.py
Cada script imprime o que mediu e o que aquilo quer dizer. Rodando do 01 ao 09 saem todos os números desta apresentação.
O 09_conferir_port.py existe porque o protótipo reimplementa o
modelo 2 em JavaScript, e duas implementações da mesma coisa divergem em silêncio. Ele roda as
duas sobre 200 respostas e falha se discordarem. Hoje batem até a décima quinta casa decimal.
O que fica
- Dois modelos baratos decidem onde gastar a chamada cara, e ganham da linha de base por uma margem pequena, declarada como pequena.
- A mesma atividade significa coisas diferentes em plataformas diferentes: a ordem transfere, o nível não, e calibrar é requisito de uso.
- Dar mais texto à referência do modelo 2 piorou o resultado de forma ordenada.
- Todo número tem linha de base ao lado, desvio de 12 partições, e teto medido quando existe teto.
Protótipos: modelo 1, engajamento e modelo 2, resposta discursiva. Código, dados e diário em github.com/Geisbelly/core-trailup.
Geisbelly Victória e Maria Antonia. Obrigada. Perguntas?