Como medir a precisão da classificação com IA usando uma matriz de confusão
A IA pode rotular tickets de suporte rapidamente, mas esses rótulos devem ser comparados com um pequeno conjunto de referência rotulado manualmente antes de serem considerados confiáveis. Este guia usa um pequeno exemplo sintético, compara as previsões da IA com rótulos conhecidos e calcula a acurácia e uma matriz de confusão em Python.
Conteúdo verificado 2026.09.21Inclui arquivos de exemplo
Ver o sumário
A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. English
Para quem éPara quem usa um assistente de chat com IA para classificar textos curtos, como tickets de suporte, e quer uma forma simples de medir a acurácia dos rótulos.
Preparação
Python 3.12
Conhecimento básico sobre arquivos CSV e rótulos de classificação
01Por que medir a classificação com IA em vez de confiar em alguns exemplos
Um assistente de chat com IA pode atribuir categorias a tickets de suporte, e-mails, comentários ou notas curtas, mas alguns exemplos convincentes não mostram a acurácia geral do classificador. A pergunta útil não é se previsões individuais parecem plausíveis, mas com que frequência a IA concorda com um conjunto de referência que já foi rotulado por uma pessoa.
Um pequeno conjunto de teste rotulado manualmente fornece uma resposta de referência fixa. Você pode comparar cada previsão da IA com essa referência, calcular a acurácia e analisar uma matriz de confusão para descobrir quais classes estão sendo confundidas. A acurácia fornece um número geral, enquanto a matriz de confusão mostra o padrão por trás dos erros.
02Crie um pequeno conjunto sintético rotulado
Os oito tickets de suporte abaixo são exemplos sintéticos criados apenas para este tutorial. Use três rótulos: billing para problemas de pagamento ou fatura, login para problemas de acesso e bug para comportamentos do software que parecem defeituosos. A coluna hand_label contém o rótulo de referência atribuído antes de pedir a classificação à IA.
id
ticket
hand_label
T1
I was charged twice for the same order.
billing
T2
My password reset link says it has expired.
login
T3
The app closes whenever I open the reports page.
bug
T4
Where can I download last month's invoice?
billing
T5
I cannot sign in after changing my email address.
login
T6
The export button does nothing when I click it.
bug
T7
My card was declined but the bank says it is fine.
billing
T8
The dashboard shows a blank screen after login.
bug
Como o conjunto é pequeno, todos os rótulos esperados podem ser revisados manualmente. Isso o torna adequado para verificar primeiro o próprio fluxo de avaliação antes de aplicar o mesmo método a uma amostra rotulada maior.
03Peça à IA exatamente um rótulo controlado por ticket
Prompts de classificação são mais fáceis de avaliar quando os rótulos permitidos e o formato de saída são fixos. Não peça explicações em texto livre, a menos que precise delas separadamente, porque texto adicional dificulta a comparação.
Defina os únicos rótulos permitidos: billing, login e bug.
Forneça uma definição curta para cada rótulo.
Exija exatamente um rótulo por ticket.
Exija que o ID do ticket permaneça inalterado.
Diga à IA para não inventar novas categorias quando um ticket for ambíguo.
04Compare a saída da IA com os rótulos de referência
Suponha que a IA produza as seguintes previsões sintéticas. Seis estão corretas. T7 é previsto como login embora o rótulo de referência seja billing, e T8 é previsto como login embora o rótulo de referência seja bug.
id
hand_label
ai_label
correct
T1
billing
billing
yes
T2
login
login
yes
T3
bug
bug
yes
T4
billing
billing
yes
T5
login
login
yes
T6
bug
bug
yes
T7
billing
login
no
T8
bug
login
no
Portanto, a acurácia geral é de 6 previsões corretas em 8 tickets. Calculando manualmente, 6 ÷ 8 = 0.75, então a acurácia é 75%.
05Leia a matriz de confusão em vez de olhar apenas a acurácia
Uma matriz de confusão conta as combinações entre rótulos de referência e rótulos previstos. Neste exemplo, use as linhas para os hand_label e as colunas para os rótulos previstos pela IA. As células da diagonal representam previsões corretas; as células fora da diagonal representam erros.
hand \ predicted
billing
login
bug
billing
2
1
0
login
0
2
0
bug
0
1
2
A matriz explica imediatamente os dois erros. Um ticket billing foi classificado como login e um ticket bug também foi classificado como login. Neste pequeno exemplo, a IA não previu incorretamente billing ou bug para nenhum ticket cujo rótulo de referência fosse login. Isso não prova que login seja, em geral, a classe mais fácil; apenas descreve estes oito casos sintéticos.
06Calcule a acurácia e a matriz com Python
Salve os dados de comparação em ticket_labels.csv com as colunas id, hand_label e ai_label. O script abaixo valida os rótulos, conta as previsões corretas, constrói a matriz de confusão e grava um relatório em outputs/classification_report.txt. Ele usa apenas a biblioteca padrão do Python 3.12, não altera o arquivo de entrada e para se o arquivo de saída já existir.
python
import csv
from collections import Counter
from pathlib import Path
INPUT_FILE = Path("ticket_labels.csv")
OUTPUT_DIR = Path("outputs")
OUTPUT_FILE = OUTPUT_DIR / "classification_report.txt"
LABELS = ["billing", "login", "bug"]
def main():
if not INPUT_FILE.is_file():
raise SystemExit(f"Input file not found: {INPUT_FILE}")
if OUTPUT_FILE.exists():
raise SystemExit(f"Output already exists: {OUTPUT_FILE}")
rows = []
with INPUT_FILE.open("r", encoding="utf-8", newline="") as file:
reader = csv.DictReader(file)
required = {"id", "hand_label", "ai_label"}
if reader.fieldnames is None or not required.issubset(reader.fieldnames):
raise SystemExit("ticket_labels.csv is missing required columns.")
for row_number, row in enumerate(reader, start=2):
hand = row["hand_label"].strip()
predicted = row["ai_label"].strip()
if hand not in LABELS:
raise SystemExit(f"Invalid hand_label on row {row_number}: {hand}")
if predicted not in LABELS:
raise SystemExit(f"Invalid ai_label on row {row_number}: {predicted}")
rows.append((row["id"].strip(), hand, predicted))
if not rows:
raise SystemExit("No labeled rows found.")
correct = sum(1 for _, hand, predicted in rows if hand == predicted)
accuracy = correct / len(rows)
counts = Counter((hand, predicted) for _, hand, predicted in rows)
report = []
report.append(f"tickets={len(rows)}")
report.append(f"correct={correct}")
report.append(f"accuracy={accuracy:.3f}")
report.append("")
report.append("confusion_matrix")
report.append("hand\\predicted\t" + "\t".join(LABELS))
for hand in LABELS:
values = [str(counts[(hand, predicted)]) for predicted in LABELS]
report.append(hand + "\t" + "\t".join(values))
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
OUTPUT_FILE.write_text("\n".join(report) + "\n", encoding="utf-8")
print(f"Wrote: {OUTPUT_FILE}")
if __name__ == "__main__":
main()
07Revise os erros e os limites antes de usar o classificador
Os dois tickets classificados incorretamente merecem mais atenção do que o número de 75% isoladamente. T7 menciona card, então um prompt fraco pode associá-lo ao tipo errado de problema, embora neste esquema de referência ele pertença a billing. T8 contém a expressão after login, mas o problema realmente relatado é uma tela em branco no dashboard, que o esquema de referência trata como bug. Esses casos mostram por que as definições das categorias devem descrever o problema subjacente em vez de depender de palavras isoladas.
Revise manualmente cada divergência antes de alterar o prompt ou as definições dos rótulos.
Mantenha as mesmas definições de rótulos ao comparar diferentes prompts ou execuções da IA.
Não misture exemplos do conjunto de teste com exemplos usados no prompt se quiser manter uma avaliação independente.
Não use apenas a acurácia geral quando as classes forem desbalanceadas ou alguns erros forem mais importantes do que outros.
Aumente a amostra rotulada manualmente antes de tirar conclusões sobre o desempenho em produção.
Uma matriz de confusão é uma evidência descritiva da amostra testada, não uma prova do desempenho futuro. Um exemplo pequeno e balanceado é útil para aprender o fluxo de avaliação, mas uma avaliação real deve incluir tickets rotulados manualmente em quantidade suficiente para representar a linguagem real, os casos ambíguos e as frequências das classes.
Registro de execução e verificação
2026-09-21 · hand-checked example · Python 3.12
Os oito tickets de suporte e seus rótulos neste artigo são exemplos sintéticos.
O exemplo contém 8 tickets e 6 previsões corretas da IA.
A acurácia foi verificada manualmente: 6 ÷ 8 = 0.75, ou 75%.
A linha billing da matriz de confusão foi verificada manualmente: 2 previsões billing, 1 login e 0 bug.
A linha login foi verificada manualmente: 0 previsões billing, 2 login e 0 bug.
A linha bug foi verificada manualmente: 0 previsões billing, 1 login e 2 bug.
A soma da matriz de confusão é 8, igual ao número de tickets do exemplo.
A lógica Python apresentada usa apenas csv, collections e pathlib da biblioteca padrão e impede a sobrescrita de um arquivo de saída existente.
Limites da verificação
O código Python deste artigo não foi executado pelo autor; seu comportamento foi revisado manualmente.
Este conjunto sintético de oito tickets é pequeno demais para estimar com confiabilidade a acurácia real em produção.
A acurácia pode esconder problemas específicos de determinadas classes, especialmente quando as frequências das classes são desbalanceadas.
O resultado medido depende da qualidade e da consistência do conjunto de referência rotulado manualmente.
Transforme “automatize isso” em uma descrição de tarefa executável. Anexe uma amostra sintética sem dados sensíveis e um resultado esperado verificado manualmente para completar uma solicitação de script que totaliza registros de trabalho por equipe.
Verifique uma função de agregação com quatro linhas que você pode calcular manualmente e 12 unit tests. Verifique não apenas valores normais, mas também entrada vazia, zero, decimais e entrada inválida.
Separe um resumo plausível em fatos, cálculos e interpretações. Recalcule proporções e médias a partir de dados mensais sintéticos e reescreva frases com fontes ausentes ou causas exageradas como afirmações que possam ser verificadas.
Trate uma regex gerada por IA como um rascunho, não como uma regra final. Monte uma pequena tabela de testes sintéticos, compare os resultados esperados com as correspondências reais, revise o padrão e salve um relatório de revisão antes de usá-lo em dados reais.