Confiança do basal mini: o que significa 0,9 e como medir
Entenda calibração e ECE, veja resultados de 50 casos e aprenda a avaliar um limiar de automação com Python.
👁 117 leituras
Uma confiança de 0,9 parece uma promessa: o modelo deveria acertar nove em cada dez casos. Mas esse número, sozinho, não prova nada. É preciso compará-lo com as respostas corretas em dados parecidos com os que chegarão ao aplicativo. A seguir, explico a calibração, mostro cálculos feitos com resultados registrados de três modelos e apresento um script simples em Python. O mais importante: o limiar de confiança e a taxa de erros aceitável são coisas diferentes.
Em resumo (19/10/2026)
- A calibração verifica se a confiança declarada corresponde à frequência de respostas corretas.
- No teste registrado, o basal mini acertou 35 de 40 respostas com confiança de pelo menos 0,9.
- A amostra tem apenas 50 solicitações. É uma ilustração, não uma certificação de um limiar de automação.
- Escolha o limiar em uma parte dos dados e avalie-o em uma amostra separada, reservada antes do teste.
O que significa confiança 0,9
A calibração é uma propriedade de várias previsões. Se você reunir respostas com confiança próxima de 0,9, um modelo bem calibrado deverá acertar cerca de 90% delas. Isso não significa que uma resposta específica tenha sido verificada. Um modelo também pode ser bem calibrado e ter baixa taxa de acerto: ele apenas sinaliza corretamente que costuma errar.
Guo e seus coautores descrevem essa diferença em um estudo de 2017 sobre calibração de redes neurais. Melhorar a taxa de acerto não basta para tornar as probabilidades confiáveis. Em um aplicativo, importa tanto escolher a resposta correta quanto saber se a confiança ajuda a identificar os casos que precisam de revisão.
Por que um chatbot geralmente não mostra esse número
Em modelos de decisão, as respostas pertencem a um conjunto fechado. O modelo pode retornar uma distribuição de probabilidades entre as opções, e a confiança na escolha costuma ser a probabilidade da resposta selecionada. Isso gera um resultado concreto que pode ser comparado com um gabarito.
Um modelo de linguagem também trabalha com probabilidades. No entanto, os logprobs disponíveis em algumas interfaces descrevem as probabilidades dos tokens, não a veracidade da frase inteira. A saída estruturada define o formato da resposta, por exemplo, um JSON com o nome de uma categoria. O formato, por si só, não garante uma confiança calibrada. Também é preciso verificar um campo confidence acrescentado pelo chatbot. Portanto, não é verdade que chatbots não possam informar confiança; o problema está no significado desse número e na forma de medi-lo.
Gráfico de calibração com resultados reais
Em 19/10/2026, calculei a correspondência entre o campo kat e gold_kat, além da confiança média em três arquivos de resultados. O basal-omni-1.0-mini Q8_0 foi testado localmente em 19/10; o Jev 1.13 e o Perplexity Decider v1.1 27B foram testados por API em 13/10. Cada modelo foi avaliado nas 50 solicitações, sem excluir os casos difíceis; não incluí tarefas separadas de seleção de ferramentas. O resultado é calculado com base no gabarito registrado, inclusive nos casos em que a solicitação pode ser ambígua. Os testes foram feitos em polonês.
| Modelo | Faixa de confiança | Confiança média | Taxa de acerto |
|---|---|---|---|
| basal mini | 0,5-0,7 | 60,9% | 2/2 = 100% |
| basal mini | 0,7-0,9 | 83,3% | 5/8 = 62,5% |
| basal mini | 0,9-1 | 97,7% | 35/40 = 87,5% |
| Jev 1.13 | 0,5-0,7 | 61,5% | 0/2 = 0% |
| Jev 1.13 | 0,7-0,9 | 79,2% | 4/9 = 44,4% |
| Jev 1.13 | 0,9-1 | 99,4% | 37/39 = 94,9% |
| Decider v1.1 | 0-0,5 | 47,3% | 1/1 = 100% |
| Decider v1.1 | 0,5-0,7 | 62,9% | 2/3 = 66,7% |
| Decider v1.1 | 0,7-0,9 | 81,5% | 2/5 = 40% |
| Decider v1.1 | 0,9-1 | 99,0% | 39/41 = 95,1% |
O limite inferior de cada faixa é inclusivo, e o superior, exclusivo, exceto na última faixa, que também inclui 1. Faixas vazias foram omitidas. As taxas gerais de acerto são, respectivamente, 42/50, 41/50 e 44/50. Não confunda esses denominadores com os resultados de 47 solicitações descritos no teste local do basal.
No gráfico de calibração, o eixo horizontal mostra a confiança média do grupo, e o vertical, sua taxa de acerto. Os pontos ideais ficam na diagonal. Um ponto abaixo dela indica confiança excessiva; acima, confiança baixa demais. Na faixa mais alta do basal, o ponto tem coordenadas de 97,7% e 87,5%: há uma distância clara em relação à diagonal.
ECE: diferença ponderada pelo número de respostas
ECE é a média das diferenças absolutas entre taxa de acerto e confiança nos grupos, ponderada pelo tamanho de cada grupo. O grupo do basal com 40 respostas tem peso de 40/50. Sua diferença é de cerca de 10,17 pontos percentuais, o que contribui com aproximadamente 8,14 pontos para o ECE. Somando os outros grupos, o resultado é 0,1302, ou 13,02 pontos percentuais.
Com os mesmos limites de faixa, o Jev tem ECE de 0,1224 e o Decider, de 0,0861. Um resultado menor indica uma diferença medida menor, mas não comprova vantagem em outros dados. O ECE depende da divisão em grupos, e observações isoladas são instáveis. Ele também não é a taxa de respostas erradas nem o resultado de Calibration em outro benchmark.
Como avaliar um limiar de automação
Primeiro, defina a taxa de erros aceitável entre as decisões aprovadas automaticamente, por exemplo, 5% ou 1%. Em seguida, escolha o limiar nos dados de ajuste e fixe-o antes de avaliar em um conjunto independente. Meça dois valores: a taxa de erros entre os casos aceitos e a cobertura, isto é, a proporção de todos os casos processados automaticamente.
Com um limiar de 0,9, o basal aceita 40/50 solicitações, mas erra 5/40, ou 12,5%. O Decider aceita 41/50 e erra 2/41, cerca de 4,88%. Esse segundo resultado fica abaixo de 5% apenas como observação em uma amostra pequena. Não é uma confirmação estatística do risco pretendido.
- Reserve grupos inteiros de casos relacionados para evitar que variações do mesmo exemplo apareçam tanto no ajuste quanto no teste.
- Avalie separadamente as categorias importantes. Um bom resultado geral pode esconder um resultado fraco em uma classe rara.
- Repita a medição depois de mudar o modelo, as instruções, a quantização ou o tipo de dados.
Quantos exemplos são suficientes
Cinquenta exemplos ajudam a identificar um problema, mas não confirmam uma taxa de erros de 1%. Com um limiar definido previamente, observações independentes e zero erros, o limite superior unilateral da taxa de erros, com nível de confiança de 95%, é 1 - 0.05**(1/n). São necessárias pelo menos 59 decisões aceitas para um limite de 5% e 299 para um limite de 1%. Essa é a quantidade de decisões aceitas, não o total de exemplos coletados; erros aumentam o tamanho de amostra necessário.
A documentação do basal também separa ajuste e avaliação e leva em conta a incerteza estatística. O guia do basal-calibrate explica como usar essa ferramenta específica. Aqui, o princípio vale para qualquer modelo: não escolha o limiar usando as mesmas respostas que depois serão usadas para justificar seu desempenho.
Python: calcule a calibração a partir de um arquivo
Salve o código abaixo como calcula_calibracao.py. Ele usa apenas a biblioteca padrão e o formato dos arquivos de resultados descritos neste artigo. Execute python calcula_calibracao.py resultados.json 0.9 para ver os grupos, o ECE, a cobertura e a taxa de erros observada. O script não calibra o modelo nem certifica o limiar.
import json
import math
import sys
with open(sys.argv[1], encoding="utf-8") as f:
rows = json.load(f)["wyniki"]
rows = [r for r in rows if r.get("typ") == "zgl"]
if not rows:
raise ValueError("Nenhuma solicitação encontrada")
for r in rows:
c = r["conf"]
if not math.isfinite(c) or not 0 <= c <= 1:
raise ValueError("Confiança fora do intervalo")
r["ok"] = r["kat"] == r["gold_kat"]
edges = [0, 0.5, 0.7, 0.9, 1]
ece = 0
for lo, hi in zip(edges, edges[1:]):
group = [r for r in rows
if lo <= r["conf"] < hi
or hi == 1 and r["conf"] == 1]
n = len(group)
if not n:
continue
conf = sum(r["conf"] for r in group) / n
acc = sum(r["ok"] for r in group) / n
ece += n / len(rows) * abs(conf - acc)
print(lo, hi, n, round(conf, 4), round(acc, 4))
print("ECE:", round(ece, 4))
threshold = float(sys.argv[2])
if not 0 <= threshold <= 1:
raise ValueError("Limiar fora do intervalo")
accepted = [r for r in rows
if r["conf"] >= threshold]
print("Cobertura:", len(accepted) / len(rows))
if accepted:
errors = sum(not r["ok"] for r in accepted)
print("Taxa de erros:", errors / len(accepted))
else:
print("Taxa de erros: nenhuma decisão aceita")
Comece conferindo o tamanho de cada grupo. Um resultado de 100% em duas respostas diz muito pouco. Só exemplos independentes adicionais poderão mostrar se o número retornado pelo modelo é realmente adequado para tomar decisões.
Fonte dos cálculos: arquivos locais wyniki_basal_mini_q8.json, wyniki_jev113.json e wyniki_decider11.json; novo cálculo em 19/10/2026.


