Como perceber que as decisões do Jev pararam de combinar com o seu produto?

monitoramento das decisões do Jev por proporção e faixa de confiança
Resposta rápida

Para perceber que as decisões do Jev pararam de combinar com o seu produto, salve em cada chamada do Choice os três campos da resposta (choice, probabilities e confidence) e acompanhe por semana a PROPORÇÃO de cada opção e a fatia de respostas em cada faixa de confiança. Três sinais pedem revisão: a opção other crescendo (categoria nova que falta no criteria), probabilidade dividida entre opções vizinhas com confiança média (rubrica larga demais) e uma opção concentrando volume sem explicação do negócio. Em cada caso, leia amostras, ajuste o mapa criteria e revalide seus limites de confiança nos seus próprios dados

Fala aí, beleza? O Jev não avisa quando o seu produto mudou

Ele continua devolvendo decisões tipadas, com probabilidade e confiança, com a mesmíssima cara de sempre 😀

O problema é que o seu Choice foi montado num momento específico

As opções e as rubricas que você escreveu refletiam a realidade daquela época, e a realidade muda: entra cliente novo, sai feature nova, aparece um tipo de pedido que ninguém imaginou

E aí as decisões do Jev começam a ficar estranhas sem nenhum erro aparecer no log

Se liga na ideia central deste post: esse sinal quase nunca aparece numa decisão isolada

Ele aparece na DISTRIBUIÇÃO das respostas ao longo das semanas

Pra situar: o Jev é o modelo System One da TypeSafe AI, em early access desde 15 de setembro de 2026

Ele recebe um estado e perguntas tipadas e devolve decisões com probabilidade e confiança, sem gerar texto livre

Bora ver na prática como flagrar essa mudança e o que revisar em cada caso?

O que você precisa antes de começar a monitorar

Antes de olhar gráfico nenhum, confere se tu tem esses itens no lugar:

  • Um Choice do Jev já rodando em produção, respondendo perguntas reais do seu produto
  • Os três valores de cada resposta guardados: choice (a opção de maior probabilidade), probabilities (a distribuição completa entre todas as opções, somando 1) e confidence (um número de 0 a 1)
  • O mapa criteria atual versionado, pra conseguir comparar o antes e o depois de qualquer mudança
  • Seus limites de confiança definidos, ou seja, a partir de quanto você age sozinho e a partir de quanto manda pra revisão

Sobre esses limites, tome cuidado!

A documentação usa 0.5 como piso de revisão e 0.9 antes de ação destrutiva, mas são EXEMPLOS, não padrão

O número certo depende do custo de uma resposta errada no seu produto

A referência pra tudo isso é a documentação oficial em docs.typesafe.ai

Um detalhe importante: aqui a agregação é feita por você, a partir do que você armazena

Não conte com um painel pronto de distribuição semanal, a ideia é que você tenha os dados na sua mão pra monitorar as decisões em produção do seu jeito 🙂

Passo a passo para acompanhar a distribuição das respostas semana a semana

O porquê antes do como: uma resposta sozinha não diz se o mundo mudou

Mas mil respostas por semana, comparadas com as mil da semana anterior, dizem MUITO

  1. Registre a resposta completa, não só o campo choice

Cada chamada vira um registro com a opção vencedora, a distribuição inteira, a confiança, a data e a versão do criteria usada

O erro comum deste passo: salvar só a opção vencedora

Parece suficiente, né? Só que é justamente em probabilities e confidence que o sinal de mudança aparece primeiro, e sem eles tu fica cego

Um registro bem guardado tem mais ou menos esta cara:

# o que você salva da resposta do Choice, mais metadados seus
registro = {
    "created_at": "2026-10-01T14:02:00",
    "choice": "suporte",
    "probabilities": {"suporte": 0.70, "financeiro": 0.20, "other": 0.10},
    "confidence": 0.62,
    "criteria_version": "v3",
}
  1. Agrupe por semana a participação de cada opção no total

Aqui o código trabalha só em cima dos registros que você já guardou, nada de chamar o Jev de novo:

from collections import Counter, defaultdict
from datetime import datetime

def semana(iso):
    ano, sem, _ = datetime.fromisoformat(iso).isocalendar()
    return f"{ano}-S{sem:02d}"

def proporcao_por_semana(registros):
    contagem = defaultdict(Counter)
    for r in registros:
        contagem[semana(r["created_at"])][r["choice"]] += 1

    resultado = {}
    for sem, c in sorted(contagem.items()):
        total = sum(c.values())
        resultado.update({sem: {opcao: n / total for opcao, n in c.items()}})
    return resultado

O erro comum deste passo: olhar volume absoluto em vez de proporção

Se o produto cresceu, TODAS as opções crescem junto, e isso não é mudança de padrão nenhuma, é só mais gente usando haha

O que importa é a fatia de cada opção no total da semana

  1. Acompanhe a confiança média e a fatia de respostas em cada faixa

A documentação divide a confiança em três faixas: alta pra ação automática, média pra pedir confirmação ou marcar pra revisão, e baixa pra mandar a uma pessoa, pedir esclarecimento ou cair pra um sistema mais lento

# 0.5 e 0.9 são exemplos da documentação, NÃO padrão
# ajuste ao custo do erro no seu produto
PISO_REVISAO = 0.5
PISO_ACAO = 0.9

def faixa(conf):
    if conf >= PISO_ACAO:
        return "alta"
    if conf >= PISO_REVISAO:
        return "media"
    return "baixa"

def faixas_por_semana(registros):
    contagem = defaultdict(Counter)
    somas = defaultdict(float)
    for r in registros:
        contagem[semana(r["created_at"])][faixa(r["confidence"])] += 1
        somas[semana(r["created_at"])] += r["confidence"]

    resultado = {}
    for sem, c in sorted(contagem.items()):
        total = sum(c.values())
        resultado.update({sem: {
            "confianca_media": somas.get(sem) / total,
            **{f: n / total for f, n in c.items()},
        }})
    return resultado

O erro comum deste passo: olhar só a média

A média pode ficar quase parada enquanto a faixa baixa cresce aos poucos, escondida atrás de muitas respostas de confiança alta

Por isso a fatia de cada faixa vale mais que a média sozinha

  1. Compare com uma semana de referência e marque desvios pra revisão manual

Escolha uma semana que você considera normal e compare as seguintes com ela:

def desvios(referencia, atual):
    opcoes = set(referencia) | set(atual)
    difs = {o: atual.get(o, 0) - referencia.get(o, 0) for o in opcoes}
    return sorted(difs.items(), key=lambda x: abs(x[1]), reverse=True)

prop = proporcao_por_semana(registros)
# use como referência uma semana completa e normal, nada de semana com poucos dias de dados
for opcao, dif in desvios(prop["2026-S39"], prop["2026-S40"]):
    print(opcao, round(dif, 3))

As opções do topo dessa lista são as primeiras candidatas a uma leitura de amostras na mão

O limiar do que conta como desvio é seu: não existe número oficial pra isso, então calibre olhando o histórico do seu próprio produto

O erro comum deste passo: reagir a uma semana atípica isolada

Feriado, campanha, um cliente grande que entrou numa segunda… Espere o desvio se repetir antes de mexer no criteria

Sinal 1: apareceu uma categoria nova que não existe no Choice

Sintoma: a opção other (ou none of the above) ganha fatia semana após semana

Ou então cresce a parcela de respostas com probabilidades espalhadas e confiança baixa

E o que significa essa distribuição espalhada? A confiança é calculada a partir de como as probabilidades se espalham: distribuição plana entre várias opções é confiança baixa, pico único numa opção é confiança alta

Causa: entraram no seu produto casos reais que nenhuma opção cobre

O Choice serve pra escolher uma opção dentro de um conjunto conhecido, então o modelo é obrigado a escolher ali dentro, mesmo quando nada encaixa direito

Solução: leia amostras dessas respostas, nomeie a categoria que está surgindo e adicione ela ao mapa criteria

O criteria aceita até 255 opções rotuladas, então espaço tem de sobra pra quase todo caso

Como prevenir: mantenha SEMPRE uma opção other ou none of the above, como a documentação recomenda quando a lista pode não cobrir todas as entradas

Sem ela, a novidade não vira sinal: ela se esconde dentro de alguma outra opção e bagunça tudo calada

Pensa no other como o seu alarme 🙂

Sinal 2: a rubrica de uma opção ficou larga demais

Sintoma: uma opção começa a absorver casos que, pela regra de negócio, pertencem a outra

E a confiança dessas respostas cai pra faixa média, com a probabilidade dividida entre duas opções vizinhas

Dá pra flagrar isso contando quais pares de opções mais disputam probabilidade:

def disputas(registros):
    pares = Counter()
    for r in registros:
        top = sorted(r["probabilities"].items(),
                     key=lambda x: x[1], reverse=True)[:2]
        if len(top) == 2 and faixa(r["confidence"]) == "media":
            pares[(top[0][0], top[1][0])] += 1
    return pares.most_common(5)

Se o mesmo par aparece no topo semana após semana, a fronteira entre essas duas opções está borrada

Causa: descrição vaga, numa string curta, sem dizer onde termina uma opção e começa a outra

Lembra que o criteria é um mapa em que cada chave é o nome da opção e cada valor é a descrição dela? Essa descrição É a rubrica

Solução: reescreva a descrição em forma de objeto

A documentação mostra que a descrição pode ser string, objeto, array ou null, e na forma de objeto ela diz três coisas:

  • o que a opção cobre
  • o que pertence a outra opção
  • alguns exemplos

Isso deixa a fronteira MUITO mais nítida, e o formato exato está na seção de primitives avançadas da documentação

Como prevenir: sempre que o produto ganhar feature ou público novo, revise as rubricas das opções que mais disputam probabilidade entre si

A lista de disputas acima já te entrega por onde começar

Sinal 3: o volume se concentrou em uma única opção

Sintoma: uma opção passa a dominar a distribuição sem que nada no negócio explique essa mudança

Nenhuma campanha, nenhum lançamento, nada… e mesmo assim ela engoliu metade do tráfego

Causa possível: essa opção virou o destino padrão de tudo que é ambíguo

Ou a pergunta ficou ampla demais pra caber num único Choice

Solução: audite amostras dessa opção

Se for mistura de casos diferentes, tu tem dois caminhos:

  • quebrar o julgamento em perguntas mais estreitas e tipadas, com critérios explícitos, como a documentação orienta pra construir com System One
  • dividir a opção em duas, cada uma com rubrica clara

Como prevenir: trate concentração repentina como alerta pra revisão, não como sinal de acerto

E como diferenciar de uma concentração legítima, quando o produto realmente mudou? Olhe a confiança dessas respostas

Se a opção cresceu com pico único e confiança alta, provavelmente a realidade mudou mesmo

Se cresceu com probabilidade espalhada e confiança média ou baixa, ela está virando depósito de dúvida

Um resumo rápido dos três sinais:

Sinal O que aparece na distribuição O que revisar
Categoria nova other ganhando fatia, mais confiança baixa Adicionar opção ao criteria
Rubrica larga Probabilidade dividida entre duas vizinhas, confiança média Descrição em objeto com fronteira e exemplos
Concentração Uma opção dominando sem explicação do negócio Auditar amostras, quebrar a pergunta ou dividir a opção

Depois de mexer no Choice: como validar se a revisão funcionou

Mexeu no criteria? Massa, mas o trabalho não acabou

Agora tu precisa provar que a mudança melhorou alguma coisa

  1. Compare a distribuição das semanas seguintes com a de antes da mudança

Usa a mesma função desvios do passo a passo, com a semana de antes como referência

O erro comum deste passo: mudar rubrica e opções ao mesmo tempo

Aí a distribuição muda e você não faz ideia de qual das duas alterações surtiu efeito, então mexe numa coisa por vez sempre que der

  1. Revise os limites de confiança nos seus próprios dados

A documentação recomenda testar os limites plotando confiança contra acurácia nos seus dados, e esse é o mesmo raciocínio de validar as decisões antes de produção

O erro comum deste passo: manter os números antigos depois de alterar as opções

Com opções novas, a forma como as probabilidades se espalham muda, e o limite que funcionava antes pode não fazer mais sentido

  1. Registre a versão do criteria junto de cada resposta

É o campo criteria_version do registro lá do começo

Isso é feito do seu lado, na sua base, e é o que permite separar o antes e o depois na análise:

antes = [r for r in registros if r["criteria_version"] == "v3"]
depois = [r for r in registros if r["criteria_version"] == "v4"]

print(faixas_por_semana(antes))
print(faixas_por_semana(depois))

Sem essa marcação, as duas versões se misturam na mesma semana e a comparação vira chute

Conclusão: o Choice precisa acompanhar o produto

O Choice é uma foto da realidade no dia em que você escreveu as opções e as rubricas

E como qualquer regra de negócio, ele precisa ser revisto quando o produto muda

Recapitulando: guarde a resposta completa, acompanhe a proporção de cada opção e as faixas de confiança por semana, compare com uma referência e leia amostras antes de mexer

Os três sinais que pedem revisão são other crescendo, probabilidade dividida entre vizinhas e concentração sem explicação

Próximo passo concreto: começa hoje a guardar choice, probabilities e confidence de cada chamada e monta a primeira visão semanal, com o other como alarme

Pra detalhes do Choice e também do Score (que avalia a informação contra uma escala numérica e também devolve confidence), a referência é a documentação oficial da TypeSafe

E aí, já pegou alguma decisão do Jev desandando no seu produto? Bora trocar uma ideia 😀

Até o próximo post!

Perguntas frequentes

Como saber se o Choice do Jev precisa de novas opções?

Olha a fatia ‘other’ ou ‘none of the above’ crescendo semana a semana nas proporções que você calculou

Se ela sai de um ruído baixo e vira uma fatia relevante do total, é sinal de que o criteria atual não cobre mais os casos que estão chegando

Nesse ponto vale revisar as descrições das opções existentes e considerar adicionar uma nova, lembrando que o mapa criteria aceita até 255 opções

Com que frequência revisar a distribuição de respostas do Jev?

O ritmo semanal é o que o passo a passo deste post usa, comparando a proporção de cada opção com uma semana de referência

Isso dá volume suficiente pra distinguir ruído de mudança real sem esperar meses

Se o seu produto tem pico sazonal forte, compare também semana contra a mesma semana de outro ciclo, não só contra a anterior

O que fazer quando a confiança média do Jev cai sem erro no log?

Primeiro checa a fatia de respostas na faixa baixa, porque ela pode estar subindo mesmo com a média quase parada

Depois confere se a distribuição das probabilities ficou mais espalhada entre as opções, já que confiança baixa vem justamente de distribuição plana

Se os dois sinais aparecem juntos, é hora de revisar o criteria antes de ajustar qualquer limite de confiança

Dá pra confiar só no campo choice para monitorar o Jev?

Não, e esse é o erro comum que o passo 1 deste post aponta

O choice mostra só a opção vencedora, mas o sinal de mudança aparece primeiro em probabilities e em confidence

Sem guardar os três valores completos, não tem como calcular proporção por semana nem faixa de confiança

Quais limites de confiança usar nas decisões do Jev?

A documentação usa 0.5 como piso de revisão e 0.9 antes de ação destrutiva, mas só como exemplo, não como padrão

O número certo depende do custo de uma resposta errada no seu produto, e a própria documentação recomenda testar plotando confiança contra acurácia nos seus dados

Por isso o código deste post deixa PISO_REVISAO e PISO_ACAO como variáveis pra você ajustar

O que significa confidence baixa numa resposta do Jev?

Significa que as probabilities ficaram espalhadas entre várias opções, sem um pico único se destacando

Quando isso vira padrão numa fatia crescente das respostas da semana, é sinal de que as opções do Choice pararam de descrever bem a realidade atual

Nesses casos a faixa baixa de confiança pede humano ou fallback, conforme as três faixas da documentação



Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Claude Code

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 120 aulas
  • 4 projetos
  • 9h 48min

Blog | Mais populares