Guias
Casos agrupados
A maior parte da aritmética de intervalos supõe que cada caso é independente de todos os outros. Três turnos de uma mesma conversa não são: quando a conversa dá errado, os três tendem a dar errado. Uma suíte que os trata como independentes informa um intervalo mais estreito do que a evidência sustenta, e um gate pode passar com base nele.
Declarando um cluster
Um caso nomeia o seu cluster com group_id, no nível superior da linha, ao lado de id:
{"id": "conv00_t0", "group_id": "conv00", "input": {"question": "Conversation 0 turn 0: refund please (garbled)"}, "expected": {"label": "refund"}}
{"id": "conv00_t1", "group_id": "conv00", "input": {"question": "Conversation 0 turn 1: where is my order (garbled)"}, "expected": {"label": "other"}}
{"id": "conv00_t2", "group_id": "conv00", "input": {"question": "Conversation 0 turn 2: refund please (garbled)"}, "expected": {"label": "refund"}}Assim que qualquer caso declara um, a suíte inteira é analisada por cluster. Não existe uma opção por métrica para voltar atrás: tratar casos agrupados como independentes é a direção insegura, por isso não é oferecida.
O que muda
Os mesmos 108 turnos de 36 conversas, uma conversa em cada seis corrompida do primeiro ao último turno. Sem group_id:
│ exact_label │ 83.3% │ [74.9%, 89.9%] │ 90 / 108 observed · 0 missing · 0 excluded │Com ele:
│ exact_label │ 83.3% │ [65.2%, 94.6%] │ 90 / 108 observed · 0 missing · 0 excluded · 36 clusters · approximate │A estimativa é idêntica. O intervalo fica cerca de duas vezes mais largo, porque a suíte contém 36 observações independentes, e não 108. Contra um piso de 0.70, com a adesão descrita abaixo, a primeira execução passa e a segunda não:
label-floor: PASS (lower_bound_meets_minimum)label-floor: INSUFFICIENT_EVIDENCE (interval_overlaps_threshold)A segunda resposta é a correta para estes dados.
A adesão explícita
O intervalo agrupado é um bootstrap de clusters studentizado. É um método aproximado, e uma política precisa dizer que o aceita antes que uma regra possa decidir com base nele. Sem isso, a mesma execução agrupada mostra:
label-floor: MANUAL_REVIEW (approximate_method_not_permitted)e sai com 4. Para deixar a regra decidir, adicione isto a release.yaml:
allow_approximate_methods: trueMais duas configurações limitam aquilo que se confia ao método.
| Configuração | Padrão | O que faz |
|---|---|---|
| min_clusters | 20 | Com menos clusters do que isso, uma regra mostra INSUFFICIENT_EVIDENCE com insufficient_clusters. Pode ser reduzido até 10, e não além. |
| max_missing_fraction | nenhum | Definido em uma regra. Um intervalo agrupado não consegue limitar casos ausentes da forma como um independente consegue, então uma regra agrupada sobre uma métrica com qualquer caso ausente mostra missingness_unbounded até que a regra declare quanta ausência aceita. |
Uma política que define min_clusters: 5 é recusada antes que qualquer coisa seja decidida:
Configuration error: p5.yaml: min_clusters: Input should be greater than or equal to 10As mesmas conversas, com uma delas dando erro em todos os turnos:
│ exact_label │ 82.9% │ [64.3%, 94.5%] │ 87 / 105 observed · 3 missing · 0 excluded · 35 clusters · approximate │label-floor: INSUFFICIENT_EVIDENCE (missingness_unbounded)Uma regra que declara a ausência que aceita:
rules:
- id: label-floor
metric: exact_label
min: 0.60
max_missing_fraction: 0.15label-floor: PASS (lower_bound_meets_minimum)Declarar uma fração registra uma suposição: a de que os casos ausentes estão ausentes ao acaso. A decisão só é tão boa quanto essa suposição, e é por isso que o engine não a faz por você.
O que uma suíte agrupada ainda não consegue fazer
Só as taxas de aprovação/reprovação têm intervalo agrupado. Em uma suíte que declara group_id:
- uma média, um quantil ou uma métrica de ranking não tem intervalo, e uma regra sobre ela mostra
MANUAL_REVIEW com unsupported_dependence_structure;
- com replicates: acima de 1, nenhuma métrica tem intervalo, incluindo as taxas de
aprovação/reprovação, porque as duas estruturas de dependência se compõem e nada modela as duas;
- uma comparação de duas execuções não tem intervalo para nenhuma métrica.
Um quantil de latência na suíte agrupada:
│ latency_p50 │ 1.365 ms │ no interval: unsupported_dependence_structure │ p50 of 108 observed · 0 missing · 0 excluded │A última limitação é a que mais importa. Comparando duas execuções da suíte de conversas, com o candidato corrigindo todas as conversas corrompidas:
oloproof compare CANDIDATE_RUN_ID BASELINE_RUN_ID --policy compare.yamlComparison sha256:ed7820e6471f70ce2b5e16ba618fdd48ea92a5ed39d23cce0b719ab31fcb16af of run_01M3C43MWTH8127R7S5M4N9DQ9 against run_01M3C43J2DVM93EWWWRBMRW22E · 108 paired cases
exact_label: +16.7 points · 108 paired · 0 missing · 0 excluded
no interval: unsupported_dependence_structure
Decisions
no-regression exact_label non-inferiority, margin 5.0 points MANUAL_REVIEW unsupported_dependence_structure
Gate: BLOCK (exit 4)Nenhum procedimento pareado para suítes agrupadas passou pela sua grade de validação, então a comparação informa a diferença e consulta uma pessoa em vez de decidir de forma aproximada. MANUAL_REVIEW em vez de INSUFFICIENT_EVIDENCE, porque mais casos do mesmo tipo não resolveriam.
Próximos passos
- Regras de comparação trata das regras pelas quais uma comparação é decidida.
- Conceitos básicos trata dos quatro estados de decisão.