가이드
이미지, 오디오, 비디오
Oloproof는 이미지, 오디오, 비디오를 받거나 만들어 내는 시스템을 평가하며, 파일은 시스템이 보관하는 곳을 결코 떠나지 않습니다. 실행은 각 파일을 참조로 기록하고, 결정적 검사는 바이트를 측정하며, 심사 모델은 이미지, 비디오 프레임, 오디오를 볼 수 있고, 워크벤치는 각 판정 옆에 그것들을 보여 줍니다. 튜토리얼은 실행 가능한 예제로 이미지를 차례로 안내합니다.
미디어 기록하기
여러분의 시스템은 케이스가 받았거나 만들어 낸 파일을 current_case().media(...)로 기록하며, 호출 한 번마다 media/v1 아티팩트 하나가 됩니다.
from oloproof import current_case, media_file, system
@system(name="captioner", version="v2", records=("media/v1",))
def caption(case):
image = render(case["prompt"]) # your system writes its own file
current_case().media([
media_file(case["photo"], role="input"),
media_file(image), # role="output" by default
])
return {"caption": describe(image)}oloproof.yaml에서는 호출 가능 시스템이 records: [media/v1]를 선언합니다. 각 항목은 다음을 담습니다.
| 필드 | 의미 |
|---|---|
| kind | image, audio 또는 video, MIME 유형에서 정해짐 |
| mime_type | image/png, audio/wav, video/mp4 등 |
| uri | 파일이 있는 곳: file:// 경로, https:// URL, 또는 프로젝트 기준 상대 경로 |
| digest | 바이트의 sha256, sha256:... |
| size_bytes | 바이트 단위 크기 |
| role | input, output(기본값) 또는 context |
| name | 프롬프트나 페이지에서 부르는 이름; media_file은 파일 이름을 씀 |
| width, height, duration_s | 선택, 시스템이 선언한 대로 |
media_file(path)는 로컬 파일에서 이 값들을 채웁니다. Oloproof의 저장소로는 아무것도 복사되지 않습니다. 나중에 파일을 읽는 모든 것(검사, 심사 모델, 워크벤치)은 read_media를 통해 읽으며, read_media는 크기나 sha256이 레코드와 다른 바이트를 거부합니다. 바뀐 콘텐츠는 실행을 멈추고, 사라진 파일은 케이스를 누락으로 남깁니다. 실행을 보관하는 동안에는 그 실행의 파일을 바꾸지 말고 보관하십시오. 각 버전의 출력은 각자의 위치에 쓰십시오. 여러분의 @evaluator에서는 read_media(item)이 확인된 바이트를 반환합니다.
모델 없는 검사
media_check는 한 역할의 기록된 각 항목을 측정하고, 모든 항목이 선언된 모든 조건을 충족할 때 통과합니다.
- type: media_check
criterion: thumbnail_fits
kind: image
formats: [png, jpeg, webp]
max_width: 256
max_height: 256
max_bytes: 50000형식은 파일의 첫 바이트에서 읽으므로, .png로 저장된 JPEG는 실패합니다. 이미지 크기와 WAV 재생 시간은 헤더에서 읽고, 비디오의 크기나 MP3의 길이는 ffprobe로 측정합니다. 재생 시간 범위는 오디오와 비디오에, 크기 범위는 이미지와 비디오에 적용됩니다.
image_matches_reference는 각 이미지가 참조와 비슷해 보일 때 통과합니다. 즉 둘의 64비트 지각 해시가 최대 max_distance비트(기본값 8)만 다를 때입니다. 크기를 바꾸거나 다시 압축한 사본은 몇 비트 안에 머물지만, 빈 이미지, 깨진 파일, 다른 장면은 그렇지 않습니다. 참조는 모든 케이스에 쓰는 reference_file 하나이거나, reference_field로 각 케이스의 expected가 지정하는 경로입니다. 이 해시는 색이 아니라 구도와 밝기를 읽으므로, 같은 방식으로 촬영한 두 제품을 구별하지 못하며, 큰 빈 영역이 있는 평면 그래픽은 사진보다 해시를 더 많이 움직입니다. Pillow가 필요합니다: pip install 'oloproof[media]'.
모든 필드는 구성 참조에 있습니다. 두 검사 모두 모델을 호출하지 않으므로 첫 실행부터 결정합니다.
미디어를 보는 심사 모델
media를 지정한 rubric_judge에게는 케이스에 기록된 해당 역할(input, output 또는 all)의 미디어가 보이며, 심사 모델이 입력과 출력을 구별할 수 있도록 각각이 프롬프트에서 이름으로 지칭됩니다.
- type: rubric_judge
criterion: caption_matches
provider: openai_compatible
base_url: http://localhost:11434/v1
model: qwen2.5vl
rubric_text: Pass only if the caption truthfully describes the attached image.
media: output
video_frames: 4
transcriber:
model: whisper-1- 이미지는 그대로 첨부되며, 각각 최대 5 MB, 판정 하나당 최대 20개입니다.
- 비디오는 심사 모델을 실행하는 머신에서 ffmpeg로 뽑은 정지 프레임으로 첨부됩니다. video_frames: 4는 네 개의 같은 구간 각각의 가운데를 뽑고, [0.5, 2.0]은 그 시점들을 뽑습니다.
- 오디오는 transcriber(OpenAI 호환 /audio/transcriptions 엔드포인트, base_url을 생략하면 OpenAI의 것)가 전사하고 그 전사 결과가 프롬프트에 들어갑니다. 또는 audio: native를 지정하면 들을 수 있는 모델을 위해 소리로 첨부됩니다(wav와 mp3; Anthropic의 모델은 해당하지 않음).
미디어의 다이제스트는 판정의 키에 포함되므로, 바뀐 미디어는 다시 심사되고 바뀌지 않은 미디어는 캐시에서 옵니다. 전사기와 프레임 시각은 심사 모델 버전의 일부이며, 각 판정은 전사 결과와 ffmpeg 버전을 보관합니다. 전사기 없이 오디오용으로 선언한 심사 모델이나, ffmpeg가 없는 머신에서 비디오용으로 선언한 심사 모델은 그 케이스들을 누락으로 남기는 대신 실행을 멈춥니다. 호스팅된 모델은 각 단어뿐 아니라 각 이미지에도 요금을 청구합니다.
미디어 심사 모델 검증하기
미디어를 보는 심사 모델도 텍스트를 읽는 심사 모델과 똑같이, 사람의 레이블이 심사 모델과의 일치를 보여 주기 전까지는 아무것도 결정하지 않습니다. 무작위 표본에 레이블을 단 다음 oloproof evaluators validate를 실행하십시오(심사 모델). 호스팅된 워크스페이스에서는 리뷰 대기열이 각 케이스의 미디어를 리뷰어에게 보여 줍니다. 모델, 루브릭, media, 프레임, 전사기 중 하나라도 바꾸면 새 심사 모델이 되며, 그 자체의 검증이 필요합니다.
워크벤치의 미디어
케이스의 미디어는 케이스 페이지와 리뷰 대기열에서 그 출력과 판정 옆에, 각 파일의 유형, 크기, 다이제스트와 함께 나타납니다.
- 로컬 워크벤치는 실행이 기록한 곳(여러분의 머신)에서 각 파일을 읽고, 그 sha256이 여전히 일치하는 동안에만 보여 줍니다.
- 호스팅된 워크스페이스는 미디어를 결코 받지 않습니다. 보는 사람의 브라우저가 리뷰 대기열이 케이스 내용에 쓰는 것과 같은 짧은 수명의 티켓으로 여러분 네트워크의 oloproof collect에서 각 파일을 가져오고(심사 모델), 보여 주기 전에 그 sha256을 확인합니다. 수집기가 없으면 페이지는 각 파일의 사실을 나열하고 왜 보여 주지 않는지 알려 줍니다.
push된 실행은 각 파일이 보관된 위치와 함께 media/v1 레코드를 egress 범주 artifacts 아래에 담아 보냅니다. artifacts를 보내지 않는 정책이라면 그 위치도 여러분 쪽에 남습니다.
지원되지 않는 것
- 미디어 생성: 파일은 여러분의 시스템이 만들고, Oloproof는 그것을 평가합니다.
- Oloproof로 미디어 업로드: 호스팅이든 로컬이든 업로드는 없습니다.
- Anthropic의 API를 통해 모델이 비디오 전체를 보거나 오디오를 듣는 것: 그곳에서는 비디오는 프레임으로, 오디오는 전사 결과를 통해 심사됩니다.
- 오디오나 비디오가 담은 내용에 대한 결정적 검사(단어 오류율, 장면 감지): @evaluator와 read_media로 작성하십시오.
- 오디오나 비디오의 지각 해시: image_matches_reference는 이미지만 읽습니다.