Skip to content

Guías

Segmentos

Una tasa global puede mantenerse estable mientras una parte de la suite se desploma. Un segmento es una parte declarada de la suite, medida por separado, para que el desplome sea visible. Los segmentos vienen con dos disciplinas, porque examinar muchas partes de una suite es la forma en que una evaluación encuentra ruido y lo presenta como un hallazgo.

Declarar segmentos

Un segmento se nombra en oloproof.yaml. El tipo habitual lee una clave del metadata de cada caso:

slices: [metadata.lang, metadata.topic]
min_slice_support: 30
{"id": "c000", "input": {"lang": "en", "topic": "billing", "hard": false, "n": 0}, "expected": {"label": "yes"}, "metadata": {"lang": "en", "topic": "billing"}}

Todos los tipos de segmento que admite el archivo:

SegmentoAgrupa los casos porRequiere
metadata.<key>el valor de esa clave en el metadata del casola clave en los casos
relevant_positiondónde se recuperó el primer pasaje relevante: top_k, beyond_top_k o not_retrievedun sistema RAG y expected.relevant
context_truncatedsi un presupuesto de tokens eliminó pasajes del contextoun sistema RAG con un token_budget
first_toolla herramienta que un agente llamó primeroun registro agent_trajectory/v1
repeated_actionsi un agente repitió una llamada idénticaun registro agent_trajectory/v1
routelos agentes que tuvieron el control, escritos como triage>billingun registro agent_trajectory/v1 cuyos pasos nombran a sus agentes
trajectory_length:4,8número de pasos, agrupado según los límites que usted declareun registro agent_trajectory/v1
confidence:0.5la puntuación que un modelo dio a la fila, en bandas según los límites que usted declareun bloque predictive:

Un nombre que el archivo no reconoce se rechaza antes de ejecutar nada:

Configuration error: unknown slice 'lang'; declare metadata.<key>, relevant_position, context_truncated, first_tool, repeated_action, route, trajectory_length:<bounds> or confidence:<bounds>

Los segmentos informan y nunca actúan como gate

Una ejecución imprime sus segmentos bajo su propio encabezado. Un candidato que corrigió el inglés y rompió el francés:

│ metadata.lang=de       │ ok     │ 100.0%   │ [95.4%, 100.0%] │ 80 / 80 observed · 0 missing · 0 excluded · exploratory · support 80    │
│ metadata.lang=en       │ ok     │ 100.0%   │ [95.4%, 100.0%] │ 80 / 80 observed · 0 missing · 0 excluded · exploratory · support 80    │
│ metadata.lang=fr       │ ok     │ 32.5%    │ [22.4%, 43.9%]  │ 26 / 80 observed · 0 missing · 0 excluded · exploratory · support 80    │
│ metadata.topic=account │ ok     │ 88.3%    │ [81.2%, 93.5%]  │ 106 / 120 observed · 0 missing · 0 excluded · exploratory · support 120 │
│ metadata.topic=billing │ ok     │ 66.7%    │ [57.4%, 75.1%]  │ 80 / 120 observed · 0 missing · 0 excluded · exploratory · support 120  │

El título de la tabla dice Slices (exploratory; never gated), y lo dice en serio. La tasa global de esa ejecución fue del 77.5% y su gate permitió la publicación, con el francés a un tercio de eso. Una regla de publicación sobre una ejecución nombra una métrica global, y una regla limitada a un segmento de una sola ejecución se rechaza:

Configuration error: release rule 'fr-floor' targets slice/metadata.lang=fr; a run's slice results are exploratory, and only a comparison rule gates a slice, inside a family with a correction

Esa es la primera disciplina. Una suite dividida en diez segmentos tiene diez oportunidades de mostrar una diferencia por azar, y un gate que leyera segmentos bloquearía publicaciones por ruido. Los segmentos sirven para encontrar dónde mirar.

Qué segmentos destacan

La ejecución también ordena sus segmentos frente a la tasa propia de la ejecución y marca los que difieren, con el procedimiento de Benjamini-Yekutieli, para que la proporción de marcas falsas se mantenga controlada sea cual sea el solapamiento entre segmentos. La tabla de segmentos de la terminal muestra cada uno en su columna BY mark — marked, not marked, o en blanco para un segmento demasiado pequeño para contrastarlo — junto con el p-valor con el que se ordenó. También se almacenan en la ejecución y se exportan en el run.json de su paquete:

jq -c '.run.slice_metrics[] | {scope, estimate, fdr_marked, fdr_p_value}' .oloproof/bundles/RUN_ID/run.json
{"scope":"slice/metadata.lang=de","estimate":1.0,"fdr_marked":true,"fdr_p_value":0.0001}
{"scope":"slice/metadata.lang=en","estimate":1.0,"fdr_marked":true,"fdr_p_value":0.0001}
{"scope":"slice/metadata.lang=fr","estimate":0.325,"fdr_marked":true,"fdr_p_value":0.0001}
{"scope":"slice/metadata.topic=account","estimate":0.8833333333333333,"fdr_marked":true,"fdr_p_value":0.0037003540039062493}
{"scope":"slice/metadata.topic=billing","estimate":0.6666666666666666,"fdr_marked":true,"fdr_p_value":0.008582189941406249}

Un segmento sin marca no ha demostrado coincidir con la ejecución; simplemente no se ha señalado. Una marca dirige la atención y no llega a ningún gate.

Soporte

min_slice_support es el número mínimo de casos que necesita un segmento para recibir un intervalo. Por debajo de él, se muestra la estimación y se omite el intervalo. De un proyecto que lo fijó en 4:

│ metadata.topic=account          │ answer_correct  │ 100.0%   │                 │ 1 / 1 observed · 0 missing · 0 excluded · exploratory · support 1 │
│                                 │                 │          │                 │ < 4, no interval                                                  │

El valor por defecto es 30. Una suite pequeña que lo reduce obtiene intervalos en segmentos escasos, y esos intervalos son lo bastante amplios como para decirlo por sí mismos.

Usar un segmento como gate, en una comparación

Cuando un segmento realmente no debe empeorar, se puede limitar una regla de comparación a él. El alcance es el nombre del segmento con el prefijo slice/, y la regla declara el soporte que necesita antes de leer ninguna evidencia:

version: 1
rules:
  - {id: overall, metric: ok, kind: non_inferiority, margin: 0.05}
  - {id: fr-not-worse, metric: ok, kind: non_inferiority, margin: 0.05, scope: slice/metadata.lang=fr, min_support: 30}
  - {id: en-not-worse, metric: ok, kind: non_inferiority, margin: 0.05, scope: slice/metadata.lang=en, min_support: 30}
  - {id: de-not-worse, metric: ok, kind: non_inferiority, margin: 0.05, scope: slice/metadata.lang=de, min_support: 30}
families:
  - {id: languages, correction: holm, rules: [fr-not-worse, en-not-worse, de-not-worse]}

Escrito sin el prefijo, el alcance se rechaza:

Configuration error: rule 'fr-not-worse' has unknown scope 'metadata.lang=fr'; a comparison rule decides on the global scope or on slice/<name>=<value>

Con él, el candidato anterior frente a su línea base:

oloproof compare CANDIDATE_RUN_ID BASELINE_RUN_ID --policy compare.yaml
Comparison sha256:cd2693b505e645919d397e8d7a87eaf0a841ab0c11c0b95484912363381b72e0 of run_01M3C46CYA163JSMSA5QZ6KAZA against run_01M3C46B3PSNP1ZTC8X05AG0GE · 240 paired cases
ok: -5.0 points [-15.2, +4.9] · 240 paired · 0 missing · 0 excluded
ok [slice/metadata.lang=de]: +8.8 points [-0.5, +21.5] · 80 paired · 0 missing · 0 excluded · exploratory · support 80
ok [slice/metadata.lang=en]: +18.8 points [+7.0, +34.4] · 80 paired · 0 missing · 0 excluded · exploratory · support 80
ok [slice/metadata.lang=fr]: -42.5 points [-60.3, -26.8] · 80 paired · 0 missing · 0 excluded · exploratory · support 80
ok [slice/metadata.topic=account]: +7.5 points [+0.9, +17.1] · 120 paired · 0 missing · 0 excluded · exploratory · support 120
ok [slice/metadata.topic=billing]: -17.5 points [-35.0, -0.1] · 120 paired · 0 missing · 0 excluded · exploratory · support 120
Decisions
  overall  ok  non-inferiority, margin 5.0 points  INSUFFICIENT_EVIDENCE  interval_overlaps_margin
    no sample size would make this PASS: the difference itself (-5.0 points) is outside the margin, so more cases would move it toward FAIL
  fr-not-worse  ok  non-inferiority, margin 5.0 points  FAIL  upper_bound_below_margin
  en-not-worse  ok  non-inferiority, margin 5.0 points  PASS  lower_bound_above_margin
  de-not-worse  ok  non-inferiority, margin 5.0 points  PASS  lower_bound_above_margin
Family languages: Holm over 3 rules; adjusted levels 0.01667
Gate: BLOCK (exit 1)

Esa es la segunda disciplina. Una regla limitada a un segmento solo actúa como gate dentro de una entrada de families:, que enumera las reglas cuyos falsos fallos se controlan conjuntamente. holm es la corrección: una regla de la familia que falla se vuelve a contrastar a un nivel más estricto, dimensionado según cuántas reglas contiene la familia, de modo que tres oportunidades de fallar por azar no suman tres veces el riesgo. Con un nivel de confianza de 0.95 y tres reglas, el fallo más fuerte se vuelve a contrastar a 0.05 / 3, el siguiente a 0.05 / 2 y el último a 0.05. Solo se vuelven a contrastar los fallos: una regla que pasa no es un rechazo y no necesita corrección. Aquí falló una regla, se volvió a contrastar a 0.01667, y el francés sigue fallando. La regla global no pudo decidir, y la recomendación que aparece debajo indica que más casos solo la moverían hacia FAIL.

Una regla de segmento fuera de cualquier familia se rechaza:

Configuration error: slice rule 'fr-not-worse' belongs to no family; slice rules multiply the chances of a false FAIL, so they gate only inside a family with a correction

Siguientes pasos

Clasificadores y regresores usan los segmentos que no son de metadatos.