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:
| Segmento | Agrupa los casos por | Requiere |
|---|---|---|
| metadata.<key> | el valor de esa clave en el metadata del caso | la clave en los casos |
| relevant_position | dónde se recuperó el primer pasaje relevante: top_k, beyond_top_k o not_retrieved | un sistema RAG y expected.relevant |
| context_truncated | si un presupuesto de tokens eliminó pasajes del contexto | un sistema RAG con un token_budget |
| first_tool | la herramienta que un agente llamó primero | un registro agent_trajectory/v1 |
| repeated_action | si un agente repitió una llamada idéntica | un registro agent_trajectory/v1 |
| route | los agentes que tuvieron el control, escritos como triage>billing | un registro agent_trajectory/v1 cuyos pasos nombran a sus agentes |
| trajectory_length:4,8 | número de pasos, agrupado según los límites que usted declare | un registro agent_trajectory/v1 |
| confidence:0.5 | la puntuación que un modelo dio a la fila, en bandas según los límites que usted declare | un 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 correctionEsa 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.yamlComparison 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 correctionSiguientes pasos
- Reglas de comparación trata los tipos de regla a los que se puede aplicar un alcance.
- Evaluación RAG, Agentes y herramientas y
Clasificadores y regresores usan los segmentos que no son de metadatos.