가이드
구성 참조
oloproof.yaml과 release.yaml의 모든 필드를, 파일을 읽는 모델에서 가져온 타입, 기본값, 허용 값, 예시와 함께 정리합니다. 필드를 찾아볼 때 쓰세요. 작업 흐름을 배우려면 빠른 시작과 게이팅 페이지를 읽으세요.
두 파일 모두 무엇이든 실행되기 전에 검증됩니다. 알 수 없는 필드, 철자가 틀린 필드, 잘못된 타입의 값은 구성 오류이며, 명령은 케이스를 하나도 실행하지 않고 2로 종료합니다. 두 파일 모두 JSON Schema가 있어, JSON Schema를 읽는 편집기라면 자동 완성에 쓸 수 있습니다. 설치된 패키지가 결과 스키마와 함께 현재 디렉터리 아래의 schemas/v1/에 이를 씁니다: python -m oloproof_core.models.schema_export(두 파일은 project_config.schema.json과 release_policy.schema.json입니다).
아래 표에서 "필수"는 그 필드가 없으면 파일이 거부된다는 뜻이며, 다른 필드에는 생략했을 때 쓰이는 값이 표시됩니다.
oloproof.yaml 한눈에 보기
작지만 완전한 프로젝트입니다. Python 함수를 로컬에서 실행하고, 네트워크도 키도 필요 없으며, oloproof init이 만드는 골격과 같은 모양입니다.
# oloproof.yaml
version: 1
project: support-bot
dataset: datasets/support.jsonl
system:
name: support-bot
callable: app.bot:answer
evaluators:
- type: exact_match
criterion: correct_label
field: label최상위 필드
| 필드 | 타입 | 기본값 | 의미 |
|---|---|---|---|
| version | 1 | 1 | 파일 형식 버전. 1만 있습니다. |
| project | 문자열 | 필수 | 프로젝트 이름으로, 보고서에 표시되고 푸시할 때 쓰입니다. |
| dataset | 경로 | 필수 | 프로젝트 기준 상대 경로의 JSONL 스위트 파일. 행의 형식은 스위트에 설명되어 있습니다. |
| system | 매핑 | 필수 | 테스트 대상 시스템. 아래를 보세요. |
| concurrency | 매핑 | system: 8, judge: 4 | 동시에 실행되는 시스템 호출과 심사 모델 호출의 수. |
| evaluators | 리스트 | 필수, 하나 이상 | 각 케이스에서 측정하는 것. 각 항목에는 type이 있습니다. |
| metrics | 리스트 | 비어 있음 | 각 평가기 기준이 이미 이루는 지표 외의 추가 지표. |
| predictive | 매핑 | 없음 | 분류기의 레이블, 점수, 정답이 있는 곳. 예측 모델을 보세요. |
| slices | 문자열 리스트 | 비어 있음 | 탐색용 슬라이스: metadata.<key>, relevant_position 또는 context_truncated. 게이트에는 도달하지 않습니다. 슬라이스를 보세요. |
| min_slice_support | 정수, 1 이상 | 30 | 적격 케이스가 이보다 적으면 슬라이스는 추정치만 보이고 구간은 보이지 않습니다. |
| replicates | 정수, 1 이상 | 1 | 모든 케이스를 이 횟수만큼 측정합니다. 단위는 여전히 케이스입니다. 반복은 구간을 계산하기 전에 케이스 안에서 집계됩니다. |
| pricing | 리스트 | 비어 있음 | 모델별로 백만 토큰당 지불하는 금액. 없으면 비용은 토큰으로만 보고되고 달러로는 보고되지 않습니다. |
| egress | 문자열 리스트 | 비어 있음 | oloproof push가 호스팅 워크스페이스로 보낼 수 있는 원본 내용. 결과와 실행을 보세요. |
concurrency
| 필드 | 타입 | 기본값 |
|---|---|---|
| system | 정수, 1 이상 | 8 |
| judge | 정수, 1 이상 | 4 |
pricing 항목
Oloproof는 가격표를 제공하지 않습니다. 각 항목은 평가기의 model:이 쓰는 것과 정확히 같은 이름으로 모델을 지정합니다.
| 필드 | 타입 | 기본값 |
|---|---|---|
| model | 문자열 | 필수 |
| input_per_mtok | 숫자, 0 이상 | 필수 |
| output_per_mtok | 숫자, 0 이상 | 필수 |
# oloproof.yaml
version: 1
project: support-bot
dataset: datasets/support.jsonl
system:
name: support-bot
callable: app.bot:answer
evaluators:
- type: exact_match
criterion: correct_label
field: label
pricing:
- model: my-judge-model
input_per_mtok: 0.15
output_per_mtok: 0.6
egress: [raw_outputs]system
시스템에는 callable, http, rag 중 정확히 하나가 필요합니다.
| 필드 | 타입 | 기본값 | 의미 |
|---|---|---|---|
| name | 문자열 | 필수 | 시스템 이름. 버전 식별자의 일부입니다. |
| version | 문자열 | 없음 | 이 버전에 붙이는 여러분의 레이블. HTTP 시스템에는 필수입니다. 식별자의 일부이므로, 바꾸면 캐시된 실행이 무효화됩니다. |
| callable | module:attribute | 없음 | 동기 또는 비동기 Python 함수. 케이스의 input을 받아 출력을 반환합니다. |
| http | 매핑 | 없음 | 케이스마다 한 번 호출되는 엔드포인트. 아래를 보세요. |
| rag | 매핑 | 없음 | @rag_system으로 선언한 단계형 RAG 클래스. 아래를 보세요. |
| config | 매핑 | 비어 있음 | 시스템 버전과 함께 기록되는 자유 형식 설정. 바꾸면 버전이 바뀝니다. |
| code_paths | glob 패턴 리스트 | 비어 있음 | 내용이 호출 가능 시스템의 버전에 들어가는 소스 파일. 없으면 호출 가능 객체 자신의 모듈만 해시됩니다. |
| timeout_s | 0보다 큰 숫자 | 120 | 호출 가능 시스템의 호출당 시간 제한. HTTP 시스템은 대신 http.timeout_s를 씁니다. |
| records | 아티팩트 종류 리스트 | 비어 있음 | retrieval/v1처럼 호출 가능 시스템이 기록하는 아티팩트 종류. HTTP 또는 RAG 시스템에서는 거부됩니다. |
system.http
| 필드 | 타입 | 기본값 | 의미 |
|---|---|---|---|
| url | 문자열 | 필수 | 각 케이스를 보내는 곳. |
| method | GET, POST 또는 PUT | POST | HTTP 메서드. |
| output_path | 점으로 구분한 경로 | 없음 | JSON 응답의 어느 필드가 출력인지, 예: result.answer. 없으면 본문 전체입니다. |
| artifacts | 종류에서 점 경로로의 매핑 | 비어 있음 | 아티팩트로 기록되는 응답 필드, 예: retrieval/v1: debug.retrieval. |
| version | 문자열 | 없음 | system.version이 없을 때 시스템 버전으로 쓰입니다. HTTP 시스템에는 둘 중 하나가 필요합니다. |
| timeout_s | 0보다 큰 숫자 | 30 | 요청당 시간 제한. |
# oloproof.yaml
version: 1
project: support-api
dataset: datasets/support.jsonl
system:
name: support-api
version: "2026-10-08"
http:
url: http://localhost:8000/answer
output_path: answer
artifacts:
retrieval/v1: debug.retrieval
evaluators:
- type: hit_rate
k: 5요청과 응답의 계약, 그리고 타임아웃과 HTTP 오류 시 일어나는 일은 결과와 실행에 있습니다.
system.rag
| 필드 | 타입 | 기본값 | 의미 |
|---|---|---|---|
| object | module:attribute | 필수 | @rag_system으로 선언한 클래스 또는 그 인스턴스. |
| depth | 정수, 1 이상 | 클래스의 값 | 검색이 반환하는 패시지 수. |
| top_k | 정수, 1 이상 | 클래스의 값 | 그중 생성에 도달하는 수. |
| token_budget | 정수, 1 이상 | 클래스의 값 | 컨텍스트의 토큰 제한. 클래스의 count_tokens(passage)가 필요합니다. |
| index_version | 문자열 | 클래스의 값 | 검색 식별자의 일부. 인덱스를 다시 만들 때마다 바꾸세요. |
여기서 준 설정은 클래스가 선언한 설정보다 우선합니다. 단계형 시스템은 자신의 retrieval/v1, context/v1, citations/v1 아티팩트를 스스로 기록하므로, 그 옆의 records는 거부됩니다. RAG를 보세요.
evaluators
모든 항목은 type과 다음 두 공통 필드를 받습니다.
| 필드 | 타입 | 기본값 | 의미 |
|---|---|---|---|
| criterion | 문자열 | 유형에 기본값이 없으면 필수 | 측정하는 것의 이름. 각 기준은 지표이며, 규칙의 metric:이 이를 가리킵니다. |
| on_execution_error | missing 또는 fail | missing | 시스템 호출이 실패한 케이스를 이 기준에서 무엇으로 셀지. missing은 관측되지 않은 것으로 분모에 남기고, fail은 실패로 셉니다. |
fail은 통과/실패 평가기에만 적용되며, 점수 평가기에 쓰면 구성 오류입니다. on_execution_error는 YAML 필드입니다. SDK 평가기 클래스는 그런 인수를 받지 않으며, 오류가 난 케이스는 누락으로 셉니다.
평가기 유형
"읽는 것"은 평가기의 판정이 무엇에 달려 있는지를 나열하며, 이는 캐시된 판정의 키이기도 합니다. "SDK"는 oloproof.evaluators의 클래스 이름입니다.
| YAML type | 읽는 것 | SDK | 네트워크나 키 필요 여부 |
|---|---|---|---|
| exact_match | output, expected | ExactMatch | 아니요 |
| contains | output, expected | Contains | 아니요 |
| regex | output | Regex | 아니요 |
| json_schema | output | JsonSchema | 아니요 |
| rubric_judge | input, output, expected | RubricJudge | 예, 모델 제공자 |
| model_classifier | output(또는 text가 지정한 필드), 선택적으로 premise | YAML 전용 | 예, TEI 호환 서버 |
| probability_judge | 케이스와 출력 | YAML 전용 | 예, 로그 확률을 반환하는 OpenAI 호환 제공자 |
| cascade | 두 단계와 같음 | YAML 전용 | 예 |
| hit_rate, recall, mrr, ndcg | artifacts.retrieval, expected | HitRate, Recall, MRR, NDCG | 아니요 |
| citation_validity | artifacts.citations, artifacts.context | CitationValidity | 아니요 |
| groundedness_judge | input, output, artifacts.context | Groundedness | 예 |
| citation_support_judge | input, output, artifacts.context, artifacts.citations | CitationSupport | 예 |
| agent_max_steps | artifacts.agent_trajectory | AgentMaxSteps | 아니요 |
| agent_tool_called | artifacts.agent_trajectory | AgentToolCalled | 아니요 |
| agent_no_tool_loop | artifacts.agent_trajectory | AgentNoToolLoop | 아니요 |
| agent_tool_sequence | artifacts.agent_trajectory, expected | AgentToolSequence | 아니요 |
| agent_no_undeclared_tool | artifacts.agent_trajectory, expected | AgentNoUndeclaredTool | 아니요 |
| agent_constraints_satisfied | artifacts.agent_trajectory | AgentConstraintsSatisfied | 아니요 |
| agent_route | artifacts.agent_trajectory | AgentRoute | 아니요 |
| agent_tool_permissions | artifacts.agent_trajectory | AgentToolPermissions | 아니요 |
| agent_max_handoffs | artifacts.agent_trajectory | AgentMaxHandoffs | 아니요 |
| predictive_correct | output과 expected의 레이블 필드 | PredictiveCorrect | 아니요 |
| predictive_recall | 위와 같음 | PredictiveRecall | 아니요 |
| predictive_precision | 위와 같음 | PredictivePrecision | 아니요 |
| predictive_absolute_error | 위와 같음, 숫자 | AbsoluteError | 아니요 |
| predictive_brier | output의 점수 필드, expected의 레이블 | Brier | 아니요 |
| predictive_log_loss | 위와 같음 | LogLoss | 아니요 |
| predictive_ranking | 위와 같음 | PredictiveRanking | 아니요 |
| YAML 유형 없음 | artifacts.conversation | ConversationCompleted(SDK 전용) | 아니요 |
| YAML 유형 없음 | expected, artifacts.conversation | ConversationJudge(SDK 전용) | 예 |
| YAML 유형 없음 | 여러분이 선언한 것 | @evaluator와 CustomEvaluator(SDK 전용) | 여러분의 선택 |
호스팅 모델을 호출하는 심사 모델은 케이스 내용을 그 제공자에게 보내며, 요금은 그 제공자가 청구합니다. 키는 api_key_env에 지정한 환경 변수에서 읽으며, Oloproof는 이 파일들에 키를 저장하지 않습니다.
결정론적 평가기
| 유형 | 필드 | 타입 | 기본값 |
|---|---|---|---|
| exact_match | field | 출력 안의 점 경로 | 없음: 출력 전체 |
| exact_match | expected_field | expected 안의 점 경로 | 없음: field와 같음 |
| exact_match | strip | 불리언 | true |
| exact_match | casefold | 불리언 | false |
| contains | field, expected_field | exact_match와 같음 | 없음 |
| regex | pattern | 정규 표현식 | 필수 |
| regex | field | 점 경로 | 없음 |
| regex | pass_if | match 또는 no_match | match |
| json_schema | schema | 인라인 JSON Schema, 또는 프로젝트 기준 상대 경로의 JSON 파일 | 필수 |
| json_schema | field | 점 경로 | 없음 |
모델 심사 모델
rubric_judge, groundedness_judge, citation_support_judge는 다음 필드를 공유합니다. rubric_judge에는 rubric_file과 rubric_text 중 정확히 하나가 필요하며, 두 RAG 심사 모델은 최대 하나를 받고 없으면 내장 루브릭을 씁니다. 이들의 criterion 기본값은 groundedness와 citation_support입니다.
| 필드 | 타입 | 기본값 |
|---|---|---|
| provider | anthropic, openai 또는 openai_compatible | 필수 |
| model | 문자열 | 필수 |
| rubric_file | 경로 | 없음 |
| rubric_text | 문자열 | 없음 |
| api_key_env | 환경 변수 이름 | ANTHROPIC_API_KEY 또는 OPENAI_API_KEY |
| base_url | URL | 제공자의 값 |
| temperature | 숫자 | 0 |
| max_tokens | 정수, 1 이상 | 512 |
| timeout_s | 0보다 큰 숫자 | 60 |
probability_judge는 형식이 정해진 질문을 하고 모델의 확률을 읽습니다.
| 필드 | 타입 | 기본값 |
|---|---|---|
| provider | openai 또는 openai_compatible | 필수 |
| model | 문자열 | 필수 |
| question | 문자열 | 필수 |
| form | yes_no, choice 또는 score | 필수 |
| min_probability | (0, 1] 범위의 숫자 | 필수 |
| options | 답에서 설명으로의 매핑 | choice에 필요 |
| pass_options | 답의 리스트 | choice에 필요 |
| levels | 수준에서 설명으로의 매핑, 가장 낮은 것부터 | score에 필요 |
| pass_at_least | 수준 하나 | score에 필요 |
| calibration | slope(0보다 큼), intercept, from_version | 없음 |
| api_key_env, base_url | 위와 같음 | 없음 |
| timeout_s | 0보다 큰 숫자 | 60 |
cascade는 저렴한 심사 모델을 먼저 실행하고 불확실한 케이스를 상위로 넘깁니다.
| 필드 | 타입 | 기본값 |
|---|---|---|
| first | probability_judge 항목 | 필수 |
| then | rubric_judge 또는 probability_judge 항목 | 필수 |
| escalate_between | 확률 두 개 | 필수 |
각 단계는 캐스케이드 자신의 criterion을 심사하며, 다른 기준을 지정한 단계는 거부됩니다.
model_classifier는 TEI 호환 서버의 학습된 모델로 텍스트에 점수를 매깁니다.
| 필드 | 타입 | 기본값 |
|---|---|---|
| model | 문자열 | 필수 |
| base_url | URL | 필수 |
| label | 읽을 분류기 레이블 | 필수 |
| min_score 또는 max_score | [0, 1] 범위의 숫자, 정확히 하나 | 필수 |
| text | 분류할 필드 | output |
| premise | 쌍 분류기를 위한 두 번째 텍스트 | 없음 |
| api_key_env | 환경 변수 이름 | 없음 |
| timeout_s | 0보다 큰 숫자 | 30 |
RAG 평가기
| 유형 | 필드 | 타입 | 기본값 |
|---|---|---|---|
| hit_rate, recall, mrr, ndcg | k | 정수, 1 이상 | hit_rate와 recall은 5, mrr과 ndcg는 10 |
| hit_rate, recall, mrr, ndcg | relevance_unit | doc 또는 chunk | doc |
| hit_rate, recall, mrr, ndcg | criterion | 문자열 | <type>_at_<k>, 예: hit_rate_at_5 |
| citation_validity | require_citations | 불리언 | false |
| citation_validity | criterion | 문자열 | citations_valid |
에이전트 평가기
| 유형 | 필드 | 타입 | 기본값 |
|---|---|---|---|
| agent_max_steps | max_steps | 정수, 1 이상 | 필수 |
| agent_tool_called | tool_name | 문자열 | 필수 |
| agent_tool_called | min_calls | 정수, 1 이상 | 1 |
| agent_no_tool_loop | max_repeats | 정수, 1 이상 | 2 |
| agent_tool_sequence | ordered | 불리언 | true |
| agent_constraints_satisfied | constraints | 제약 이름 리스트 | 비어 있음 |
| agent_tool_permissions | permissions | 에이전트에서 허용 도구로의 매핑 | 필수 |
| agent_max_handoffs | max_handoffs | 정수, 0 이상 | 필수 |
각 에이전트 유형에는 기본 criterion이 있어 생략할 수 있습니다. 자신의 유형 이름이거나, 설정으로 만든 이름입니다(agent_steps_le_8, agent_tool_lookup_called, agent_handoffs_le_2). 에이전트를 보세요.
예측 평가기
| 유형 | 필드 | 타입 | 기본값 |
|---|---|---|---|
| predictive_correct, predictive_recall, predictive_precision | positive | 임의의 JSON 값 | true, 또는 predictive: 블록의 값 |
| 같음 | field | 출력 필드 | label, 또는 predictive.label_field |
| 같음 | expected_field | 기대 필드 | label, 또는 predictive.expected_field |
| predictive_absolute_error | target_range | 숫자 두 개 | 필수 |
| predictive_absolute_error | field, expected_field | 위와 같음 | label |
| predictive_brier, predictive_log_loss, predictive_ranking | positive | 임의의 JSON 값 | true, 또는 블록의 값 |
| 같음 | field | 출력 필드 | score, 또는 predictive.score_field |
| 같음 | expected_field | 기대 필드 | label, 또는 블록의 값 |
| predictive_log_loss | clip | (0, 0.5) 범위의 숫자 | 필수 |
positive, field 또는 expected_field를 쓰지 않은 예측 평가기는 그 값을 predictive: 블록에서 가져오며, 직접 쓴 값은 유지됩니다.
predictive
| 필드 | 타입 | 기본값 |
|---|---|---|
| label_field | 문자열 | label |
| score_field | 문자열 | score |
| expected_field | 문자열 | label |
| positive | 임의의 JSON 값 | true |
| calibration_bins | 정수, 1 이상 | 10 |
| thresholds | 숫자 리스트 | 비어 있음 |
| average | macro 또는 micro | 없음: 집계 없음 |
metrics
각 평가기 기준은 이미 지표입니다. metrics: 항목은 지표를 하나 더 추가하며, type으로 구별합니다.
| type | 필드 | 의미 |
|---|---|---|
| quantile | id, source, (0, 1) 범위의 quantile | latency_ms, input_tokens, output_tokens, cost_usd, agent_steps 또는 agent_tool_calls의 분위수. |
| ranking | id, criterion, statistic: roc_auc 또는 average_precision | 순위 기준 점수의 순서에 대한 통계량. |
| human_score, human_preference | id | 거부됨: 이 레이블을 읽는 승인된 방법이 아직 없습니다. |
| cost_per_accepted | id, criterion, cost_ceiling_usd, cost_ceiling_source | 연결 방식이 감사를 통해 승인될 때까지 거부됩니다. |
# oloproof.yaml
version: 1
project: support-bot
dataset: datasets/support.jsonl
system:
name: support-bot
callable: app.bot:answer
evaluators:
- type: exact_match
criterion: correct_label
field: label
metrics:
- id: latency_p95
type: quantile
source: latency_ms
quantile: 0.95release.yaml
릴리스 정책입니다. 어떤 규칙이 결정하고, 어떤 결정이 차단하는지를 정합니다. 생략한 설정은 기본값을 유지하므로, 규칙만 지정한 정책도 여전히 FAIL, INSUFFICIENT_EVIDENCE, MANUAL_REVIEW에서 차단합니다.
# release.yaml
version: 1
rules:
- id: label_accuracy
metric: correct_label
min: 0.8| 필드 | 타입 | 기본값 | 의미 |
|---|---|---|---|
| version | 1 | 1 | 파일 형식 버전. |
| confidence_level | 확률 | 0.95 | 규칙이 읽는 모든 구간의 신뢰 수준. |
| block_on | 결정 상태 리스트 | FAIL, INSUFFICIENT_EVIDENCE, MANUAL_REVIEW | 게이트를 차단하게 하고 종료 코드를 정하는 상태. |
| warn_on | 결정 상태 리스트 | 비어 있음 | 차단하지 않고 경고하는 상태. block_on과 겹치면 안 됩니다. |
| block_on_partial_run | 불리언 | true | 완료되지 않은 실행이 종료 코드 5로 차단하는지 여부. |
| require_validated_evaluators | 불리언 | true | 모델 심사 모델 위의 규칙이, 심사 모델이 사람 레이블에 대해 검증될 때까지 결정을 보류하는지 여부. 결정론적 평가기는 면제됩니다. |
| minimum_evaluator_agreement | [0, 1] 범위의 숫자 | 없음 | 심사 모델이 검증되기 전에 하한 기준으로 도달해야 하는 사람 레이블과의 일치도. |
| maximum_evaluator_bias | (0, 1] 범위의 숫자 | 없음 | 검증되기 전에 심사 모델의 통과율이 사람의 통과율에서 벗어날 수 있는 정도. |
| allow_approximate_methods | 불리언 | false | 엔진이 근사로 표시한 구간(클러스터 이진 구간)으로 규칙이 결정할 수 있는지 여부. 그렇지 않으면 MANUAL_REVIEW를 읽습니다. |
| min_clusters | 정수, 10 이상 | 20 | 클러스터가 이보다 적으면 클러스터 규칙은 INSUFFICIENT_EVIDENCE를 읽습니다. |
| difference_method | bounded_paired_difference@1 또는 conditional_exact_paired_difference@1 | 없음: 첫 번째 | 짝지은 이진 비율 차이를 경계 짓는 승인된 방법. |
| early_stopping | 불리언 | false | 케이스를 배치로 실행하고 모든 규칙이 결정되면 멈춥니다. 게이팅을 보세요. |
| early_stopping_seed | 정수, 0 이상 | 없음 | 케이스 순서의 시드. |
| early_stopping_batch_size | 정수, 1 이상 | 25 | 배치당 케이스 수. |
| rules | 리스트 | 필수, 하나 이상 | 규칙. 아래를 보세요. |
| families | 리스트 | 비어 있음 | 거짓 FAIL을 함께 통제하는 규칙. |
| review_rule | 매핑 | 없음 | 거부됨: 연결 방식이 아직 승인되지 않았습니다. |
rules
하나의 리스트가 두 종류를 모두 담습니다. 실행 규칙은 min, max, max_failures 중 정확히 하나를 받습니다. 비교 규칙은 kind를 지정하고 두 실행 사이의 차이를 결정합니다. 비교 규칙을 보세요.
| 필드 | 타입 | 기본값 | 적용 대상 |
|---|---|---|---|
| id | 문자열 | 필수 | 모두 |
| metric | 지표 id 또는 기준 | 필수 | 모두 |
| kind | interval_threshold, observed_count, superiority, non_inferiority, equivalence | 실행 규칙은 추론됨 | 모두 |
| min | 숫자 | 없음 | 실행 규칙: 구간의 하한이 이 값 이상이면 PASS |
| max | 숫자 | 없음 | 실행 규칙: 구간의 상한이 이 값 이하이면 PASS |
| max_failures | 정수, 0 이상 | 없음 | observed_count: 실행된 스위트에 대한 개수, 구간 없음 |
| margin | 0보다 큰 숫자, 지표의 단위 | 없음 | non_inferiority와 equivalence, superiority에서는 거부됨 |
| direction | min 또는 max | min | non_inferiority 전용: 높을수록 좋은지 낮을수록 좋은지 |
| max_missing_fraction | [0, 1] 범위의 숫자 | 없음 | 구간 규칙과 비교 규칙 |
| requires_manual_review | 불리언 | false | 모두: 규칙이 항상 MANUAL_REVIEW를 읽음 |
| scope | global 또는 슬라이스 | global | 구간 규칙과 비교 규칙 |
| min_support | 정수, 1 이상 | 없음 | 슬라이스에 대한 비교 규칙 |
families
| 필드 | 타입 | 기본값 |
|---|---|---|
| id | 문자열 | 필수 |
| correction | holm | holm |
| rules | 규칙 id 리스트 | 필수, 하나 이상 |
# release.yaml
version: 1
warn_on: [INSUFFICIENT_EVIDENCE]
block_on: [FAIL, MANUAL_REVIEW]
rules:
- id: label_accuracy
metric: correct_label
min: 0.8
max_missing_fraction: 0.05
- id: no_regression
metric: correct_label
kind: non_inferiority
margin: 0.02아티팩트 종류
아티팩트는 시스템이 출력 옆에 쓰는 타입이 있는 레코드로, 예를 들어 무엇을 검색했는지입니다. 종류는 선택적 버전이 붙은 소문자 이름으로, ^[a-z][a-z0-9_]*(/v[1-9][0-9]*)?$에 맞아야 합니다. 아티팩트가 필요한 평가기는 그 이름을 지정하며, 시스템이 필요한 종류를 선언하지 않은 실행은 모든 케이스를 누락으로 세는 대신 시작하기 전에 거부됩니다.
| 종류 | 쓰는 곳 | 필요로 하는 것 |
|---|---|---|
| retrieval/v1 | current_case().retrieval(...), @rag_system 또는 http.artifacts | hit_rate, recall, mrr, ndcg |
| context/v1 | current_case().context(...) 또는 @rag_system | citation_validity, groundedness_judge, citation_support_judge |
| citations/v1 | current_case().citations(...) 또는 @rag_system | citation_validity, citation_support_judge |
| agent_trajectory/v1 | current_case().agent_trajectory(...) | 모든 agent_* 평가기, 그리고 agent_steps와 agent_tool_calls 소스 |
| conversation/v1 | current_case().artifact(CONVERSATION, ...) | ConversationCompleted, ConversationJudge |
| stage_timings/v1 | @rag_system | 없음, 지연 시간 옆에 표시됨 |
호출 가능 시스템은 기록하는 종류를 records:(또는 @system(records=...))에 선언하고, HTTP 시스템은 http.artifacts에 선언하며, 단계형 RAG 시스템은 스스로 기록합니다.
버전, 캐시 키, 무효화
Oloproof는 입력이 바뀌지 않은 작업을 재사용하며, 무엇이 "바뀌지 않음"인지는 내용 다이제스트로 판단합니다. 각 다이제스트는 엔진이 계산하고 실행과 함께 기록합니다.
| 레코드 | 다음이 동일할 때 재사용됨 |
|---|---|
| 시스템 버전 | name, version, config, 그리고 코드 다이제스트: 호출 가능 객체의 모듈 소스(또는 code_paths에 맞는 모든 파일), HTTP 시스템의 url, method, output_path, artifacts |
| 실행 | 시스템 버전, 케이스의 input, 반복 인덱스. 성공한 실행만 재사용됩니다. |
| 판정 | 평가기 버전(유형과 모든 설정)과, 평가기 표에 나열된 대로 읽는 각 필드의 다이제스트 |
| 분석 | 분석 계획, 지표, 신뢰 수준, 스위트 다이제스트, 그리고 센 모든 입력 |
| 게이트 | 모든 분석, 정책 다이제스트, 실행이 완료되었는지 여부, 그리고 결정이 인용하는 각 평가기의 실효 상태 |
Oloproof가 볼 수 없는 것은 여러분이 선언해야 합니다.
- HTTP 시스템의 동작은 서버에 있습니다. URL 뒤에 있는 것이 바뀔 때마다 system.version을 바꾸세요. 그렇지 않으면 예전에 캐시된 출력이 새 시스템을 대신하게 됩니다.
- 호출 가능 객체의 보조 모듈은 code_paths가 그것에 맞을 때만 해시됩니다. 없으면 보조 모듈을 수정해도 버전이 바뀌지 않습니다.
- 메서드나 호출 가능 객체는 버전을 선언해야 하며, 객체의 상태가 바뀌면 버전도 바뀌어야 합니다.
- RAG 인덱스는 index_version으로 식별됩니다. 인덱스를 다시 만들면 바꾸세요.
- 모델 심사 모델의 식별자는 제공자의 가중치가 아니라 설정입니다. 제공자가 같은 이름 뒤의 모델을 갱신해도 캐시는 이를 감지하지 못합니다.
- 사용자 정의 @evaluator는 그것을 정의한 모듈 파일을 해시하며, cacheable=True를 선언할 때만 판정이 실행 사이에 재사용됩니다. 내장 루브릭 심사 모델은 캐시 가능하며, 결정론적 평가기는 다시 계산되는데 그 비용은 작습니다.
캐시된 작업은 프로젝트의 로컬 저장소, 즉 oloproof.yaml 옆의 .oloproof/store.sqlite(또는 OLOPROOF_HOME 아래)에 있습니다. 저장소를 지우면 모든 캐시와 모든 실행이 사라집니다. 호스팅 워크스페이스에서 엔진은 캐시된 실행, 판정, 분석을 재사용하지 않습니다. 푸시가 그것을 쓸 수 있기 때문이며, 엔진은 다시 계산합니다.