가이드
결과와 실행 참조
실행이 HTTP 시스템에 무엇을 보내고 무엇을 돌려받기를 기대하는지, 각 케이스가 지표의 분모에 어떻게 들어가는지, 결정 상태와 그 이유를 설명하는 이유 코드, 종료 코드, 그리고 어떤 데이터가 로컬에 남고 어떤 데이터가 호스팅 워크스페이스로 옮겨지는지를 정리합니다. 그 바탕이 되는 개념은 개념을, 정책 필드는 구성 참조를 읽으세요.
HTTP 시스템 계약
HTTP 시스템(oloproof.yaml의 system.http)은 케이스마다 한 번, 반복마다 한 번 호출됩니다.
| 항목 | 동작 |
|---|---|
| 요청 | 기본값은 POST입니다(GET과 PUT도 받습니다). 본문은 케이스의 input 값을 JSON으로 보낸 것입니다. |
| 헤더와 인증 | 아무것도 구성할 수 없습니다. 요청에는 HTTP 클라이언트의 기본값만 실립니다. 키가 필요한 엔드포인트는 키를 추가하는 Python 호출 가능 시스템 뒤에 두어야 합니다. |
| 응답 | JSON이어야 합니다. output_path는 result.answer처럼 점으로 구분한 경로로 출력을 고릅니다. 없으면 본문 전체가 출력입니다. output_path 필드가 없으면 그 케이스의 실행 오류로 기록됩니다. |
| 아티팩트 | 각 http.artifacts 항목은 응답에서 점으로 구분한 경로 하나를 읽습니다. 선언한 필드가 응답에 없으면 계약 오류이며, 실행은 종료 코드 2로 멈춥니다. |
| 타임아웃 | 요청마다 http.timeout_s, 기본값은 30초입니다. |
| 재시도 | 타임아웃, 연결 실패, HTTP 408, 429, 5xx는 재시도하며, 모두 합쳐 최대 네 번 시도하고, Retry-After를 따르는 지터가 있는 지수 백오프를 씁니다. 다른 4xx 응답은 재시도하지 않습니다. |
| 마지막 시도 후 | 케이스의 실행은 오류로 기록되고 케이스는 누락으로 셉니다(on_execution_error: fail에서는 실패로 셉니다). 실행은 계속됩니다. |
| 동시성 | 동시에 진행 중인 요청은 최대 concurrency.system개, 기본값은 8입니다. |
URL, 메서드, 출력 경로, 아티팩트 매핑은 시스템 버전에 들어가지만, 서버가 하는 일은 들어가지 않습니다. 서버의 동작이 바뀔 때마다 system.version을 바꾸세요. 이유는 구성 참조를 보세요.
서로 다른 세 가지 어휘
결과에는 세 종류의 상태가 있으며, 서로를 대신하지 않습니다.
| 종류 | 값 | 답하는 질문 |
|---|---|---|
| 결정 상태 | PASS, FAIL, INSUFFICIENT_EVIDENCE, MANUAL_REVIEW | 증거가 규칙 하나에 대해 무엇을 말하는가. |
| 실행 상태 | 실행 상태 RUN_ERROR 또는 CANCELLED, 실행 완결성 PARTIAL, 케이스 실행 ERROR 또는 TIMEOUT | 실행이나 케이스 하나의 호출에 무슨 일이 있었는가. 품질 결과가 아닙니다. |
| 릴리스 조치 | ALLOW, WARN, BLOCK | 정책이 각 결정으로 무엇을 하는가. block_on 상태는 차단하고, warn_on 상태는 경고하며, 나머지는 허용합니다. |
정상적으로 끝난 실행은 DECIDED이고, 조기 중단으로 끝났으면 DECIDED_EARLY입니다. Ctrl-C나 작업 취소로 중단된 실행은 CANCELLED이고, 하네스가 예외를 일으킨 실행은 RUN_ERROR입니다. 둘 다 실행을 PARTIAL로 남기고, 끝난 케이스를 보존하며, 다음 실행이 캐시된 레코드를 재사용하게 합니다. 오류를 보세요.
최소 임계값 T와 구간 [L, U]에 대해, 규칙은 L >= T이면 PASS, U < T이면 FAIL, 그 밖에는 INSUFFICIENT_EVIDENCE입니다. 최대 임계값은 대칭입니다. 구간을 읽기 전에 규칙은 결정을 내려야 하는지부터 확인합니다. 먼저 MANUAL_REVIEW의 이유를, 다음으로 INSUFFICIENT_EVIDENCE의 이유를 봅니다. 이유가 있는 첫 단계가 결정하며, 찾은 이유를 모두 나열합니다.
이유 코드
모든 결정에는 하나 이상의 이유 코드가 붙습니다.
MANUAL_REVIEW
| 코드 | 의미 |
|---|---|
| policy_requires_review | 규칙이 requires_manual_review: true를 설정합니다. |
| unsupported_method | 이 상황에서 이 지표에 대해 승인된 구간이 없습니다. 아래를 보세요. |
| unsupported_dependence_structure | 스위트가 클러스터(group_id)를 선언하는데, 이 지표에 대해 그것을 다루는 승인된 방법이 없습니다. |
| approximate_method_not_permitted | 유일한 구간이 근사이고, 정책이 allow_approximate_methods: true를 설정하지 않았습니다. |
| evaluator_retired | 지표 뒤의 평가기가 폐기되었습니다. |
INSUFFICIENT_EVIDENCE
| 코드 | 의미 |
|---|---|
| no_observations | 이 지표에 대해 관측된 케이스가 없습니다. |
| missingness_exceeds_policy | 적격 케이스 중 누락된 비율이 규칙의 max_missing_fraction이 허용하는 것보다 큽니다. |
| missingness_unbounded | 방법이 누락 케이스를 경계 짓지 않고 버리며, 규칙이 max_missing_fraction을 선언하지 않았습니다. |
| evaluator_not_validated | 지표 뒤의 모델 심사 모델이 사람 레이블에 대해 검증되지 않았고, require_validated_evaluators가 켜져 있습니다(기본값). |
| evaluator_recalibration_required | 심사 모델이 이 실행의 판정이 나온 것과 다른 서빙 모델에서 검증되었습니다. |
| interval_unavailable | 지표에 읽을 구간이 없습니다. |
| insufficient_clusters | 클러스터가 정책의 min_clusters보다 적습니다. |
| interval_monte_carlo_uncertain | 임계값이 클러스터 경계의 시뮬레이션 불확실성 안에 들어갑니다. |
| interval_overlaps_threshold | 구간이 임계값을 포함합니다. 케이스가 더 있으면 구간이 좁아집니다. |
| interval_unbounded | 규칙이 읽는 쪽에 구간의 경계가 없습니다. |
| missing_could_change_outcome | observed_count 규칙에서, 누락 케이스가 실패를 max_failures 너머로 넘길 수 있습니다. |
| interval_overlaps_zero, interval_overlaps_margin, interval_overlaps_margins | 차이 구간이 0이나 마진에 걸치는 비교입니다. |
| insufficient_support | 슬라이스의 케이스가 min_support보다 적은 슬라이스 비교 규칙입니다. |
| family_correction_withheld | families: 항목의 규칙으로, Holm 보정이 그 앞에서 멈췄습니다. |
PASS와 FAIL
| 코드 | 상태 |
|---|---|
| lower_bound_meets_minimum, upper_bound_meets_maximum | PASS |
| upper_bound_below_minimum, lower_bound_above_maximum | FAIL |
| observed_failures_within_limit | PASS |
| observed_failures_exceed_limit | FAIL |
| difference_above_zero, lower_bound_above_margin, interval_within_margins | PASS(비교) |
| difference_below_zero, upper_bound_below_margin, interval_outside_margins | FAIL(비교) |
| cost_ceiling_exceeded | 기록된 실행이 선언한 상한을 넘은 비용 규칙의 상태 옆에 표시됩니다 |
호스팅 워크스페이스 전용
푸시된 실행을 직접 결정하는 워크스페이스는 ppi_not_verified(결정의 근거가 되는 구간을 검증하지 않았음), execution_not_verified(출력이 등록된 러너에서 나오지 않았음), workspace_cannot_decide(정책 사본이 없거나 증거를 읽을 수 없었음)로 결정을 보류할 수 있습니다. 게이팅을 보세요.
각 케이스가 분모에 들어가는 방식
모든 지표는 네 가지 개수를 보고합니다. n_total(스위트의 케이스), n_eligible, n_observed, n_missing이며, n_eligible = n_observed + n_missing입니다. n_eligible 밖의 케이스는 이유와 함께 exclusions 아래에 나열됩니다.
| 케이스에 일어난 일 | 셈 방식 | 분모 포함 여부 |
|---|---|---|
| 평가기가 통과 또는 실패를 반환함 | 관측됨, 성공 또는 실패 | 예 |
| 평가기가 스스로 해당 없음을 선언함(예: 비교할 기대값이 없음) | 이유와 함께 제외됨 | 아니요 |
| 시스템 호출이 오류를 내거나 타임아웃됨 | 누락, 또는 on_execution_error: fail에서는 실패 | 예 |
| 평가기가 예외를 일으켰거나 심사 모델의 응답을 읽을 수 없었음 | 누락 | 예 |
| 실행이 중단되어 케이스가 실행되지 않음 | 누락, 그리고 실행은 PARTIAL | 예 |
누락 케이스는 버려지지 않고 경계 지어집니다. 통과율의 경우 구간의 하한은 모든 누락 케이스를 실패로, 상한은 성공으로 취급하므로, 누락 케이스가 많은 실행은 구간이 넓어 까다로운 규칙을 통과할 수 없습니다. 경계 있는 평균은 같은 방식으로 선언한 범위의 양 끝을 대입합니다. 누락 케이스를 경계 지을 수 없는 방법(예: 순위 통계량)은 그것을 버리고 그 가정을 기록하며, 그 위의 규칙은 max_missing_fraction을 선언할 때까지 missingness_unbounded를 읽습니다.
observed_count 규칙은 실행된 스위트에 대해 실패를 세며 구간을 읽지 않습니다. 관측된 실패에 모든 누락 케이스를 더해도 여전히 max_failures 안에 들어갈 때만 통과합니다.
승인된 구간이 없는 지표
규칙은 감사를 통해 승인된 방법의 구간으로만 결정합니다. 그런 구간이 없으면 지표는 여전히 계산되어 표시되지만, 그 위의 규칙은 검증되지 않은 방법을 빌려 오지 않습니다.
| 상황 | 그 위의 규칙이 읽는 것 |
|---|---|
| score_range가 없는 사용자 정의 점수 평가기처럼, 범위를 선언하지 않은 점수(평균) 지표 | MANUAL_REVIEW, unsupported_method |
| group_id를 선언한 스위트의 평균, 분위수, 순위 또는 비용 지표 | MANUAL_REVIEW, unsupported_dependence_structure |
| 클러스터가 있는 스위트의 통과율 | 근사 구간: allow_approximate_methods: true가 아니면 MANUAL_REVIEW, 그렇다면 위의 클러스터 검사 |
| replicates가 1보다 큰 분위수 또는 순위 지표 | MANUAL_REVIEW, unsupported_method |
| group_id와 반복을 모두 가진 스위트의 모든 지표 | MANUAL_REVIEW, unsupported_dependence_structure |
| 클러스터가 있는 스위트의 비교 | MANUAL_REVIEW |
| min_slice_support 미만의 슬라이스 | 구간 없음, 하지만 슬라이스는 게이트에 도달하지 않음 |
| human_score, human_preference 또는 cost_per_accepted 지표 | 파일을 읽을 때 거부됨, 종료 코드 2 |
종료 코드
oloproof gate, 정책을 지정한 oloproof run, 그리고 결정을 내리는 다른 명령은 모두 같은 코드를 씁니다.
| 코드 | 의미 |
|---|---|
| 0 | 정책이 차단하는 것이 없습니다. 모든 규칙이 통과했거나, 통과하지 못한 규칙이 block_on 밖에 있습니다. |
| 1 | block_on에 있는 규칙이 실패했습니다. |
| 2 | 구성이나 호출이 잘못되었거나, 시스템이 계약을 어겼습니다. 아무것도 결정되지 않았습니다. |
| 3 | block_on에 있는 규칙이 INSUFFICIENT_EVIDENCE를 읽었습니다. |
| 4 | block_on에 있는 규칙이 MANUAL_REVIEW를 읽었습니다. |
| 5 | 실행이 완료되지 않았고 block_on_partial_run이 켜져 있습니다(기본값). |
여러 개가 해당하면 1, 5, 4, 3 중 처음 것이 보고됩니다. block_on에서 빠진 상태는 종료 코드를 바꿀 수 없습니다. block_on: [FAIL]과 warn_on: [INSUFFICIENT_EVIDENCE]에서는 결정되지 않은 규칙이 경고하고 게이트는 0으로 종료합니다. 따라서 종료 코드 0은 정책이 차단하는 일이 일어나지 않았다는 뜻일 뿐, 모든 규칙이 통과했다는 뜻이 아닙니다. 게이팅을 보세요.
작업이 실행되는 곳과 데이터가 가는 곳
로컬, 기본값
oloproof run, oloproof gate, SDK는 여러분의 컴퓨터에서 실행됩니다. 모든 레코드(케이스, 출력, 아티팩트, 판정, 지표, 결정)는 oloproof.yaml 옆의 .oloproof/store.sqlite에, 또는 설정되어 있으면 OLOPROOF_HOME 아래에 기록됩니다. Oloproof로는 아무것도 보내지 않습니다. 네트워크 트래픽은 구성이 일으키는 것뿐입니다. HTTP 시스템의 URL로 가는 호출, 그리고 모델 심사 모델이나 모델 분류기가 제공자에게 하는 호출이며, 제공자는 심사하는 케이스 내용을 받고 그에 대해 요금을 청구합니다.
호스팅 워크스페이스로 푸시하기
oloproof push는 실행의 증거를 oloproof login으로 연결한 워크스페이스로 보냅니다. 기본적으로 지표, 구간, 결정, 집계 슬라이스, 그리고 모든 레코드의 식별자, 상태, 소요 시간, 사용량을 보내지만 내용은 보내지 않습니다. 원본 내용은 무엇이든 컴퓨터를 떠나기 전에 필드별로 가려지며, 가려진 레코드는 어떤 범주가 보류되었는지 밝힙니다. 범주는 oloproof.yaml의 egress:에 나열될 때만 전송됩니다.
| 범주 | 다루는 것 |
|---|---|
| raw_inputs | 시나리오 입력, 기대값, 케이스 메타데이터: 데이터셋 행 |
| raw_outputs | 테스트 대상 시스템이 각 케이스에 대해 반환한 것 |
| judge_rationales | 심사 모델이 판정을 설명하며 쓴 텍스트로, 출력을 인용합니다 |
| artifacts | 실행 중 기록된 검색 컨텍스트, 인용, 궤적 |
| error_detail | 예외 메시지와 세부 정보로, 입력을 그대로 담는 경우가 많습니다 |
| system_config | 테스트 대상 시스템과 그 평가기의 선언된 구성 |
| label_notes | 사람이 레이블 옆에 쓴 메모로, 출력을 인용하는 경우가 많습니다 |
| span_names | 계측이 기록한 트레이스, 스팬, 도구, 에이전트 이름 |
레코드 다이제스트는 가린 후에 다시 계산하지 않으므로, 호스팅된 레코드는 여전히 원래 증거를 가리키며 그 증거는 여러분의 컴퓨터에 남습니다. 가림은 암호화가 아니며, 아주 작은 슬라이스에 대한 지표는 여전히 그 뒤의 케이스를 식별할 수 있습니다.
검토자가 호스팅 검토 대기열에서 케이스에 레이블을 붙일 때, 검토자의 브라우저는 여러분 쪽에서 실행 중인 oloproof collect에서 케이스 내용을 가져옵니다. 내용은 워크스페이스를 거치지 않습니다. 워크스페이스가 쓰는 제공자 키는 oloproof credentials set으로 저장하며, oloproof credentials list는 이름만 보여 주고 값은 절대 보여 주지 않습니다. 관리형 작업은 Oloproof가 운영하는 워커에서 실행되며, 그 워커는 여러분의 Python 코드를 실행하지 않습니다. oloproof job은 결과를 보고하고 게이트에 따라 종료합니다.
호스팅 워크스페이스에서 엔진은 캐시된 실행, 판정, 분석을 절대 재사용하지 않습니다. 푸시가 그 캐시를 쓸 수 있기 때문입니다. 엔진은 그것을 다시 계산합니다.