Langsung ke konten

Panduan

Gambar, audio, dan video

Oloproof mengevaluasi sistem yang menerima atau menghasilkan gambar, audio, dan video, dan file-file itu tidak pernah meninggalkan tempat sistem Anda menyimpannya. Sebuah eksekusi merekam setiap file berdasarkan referensi; pemeriksaan deterministik mengukur byte-nya; juri dapat melihat gambar, frame video, dan audio; workbench menampilkannya di samping setiap putusan. Tutorial membahas gambar pada contoh yang dapat dijalankan.

Merekam media

Sistem Anda merekam file yang diterima atau dihasilkan sebuah kasus dengan current_case().media(...), sebagai satu artefak media/v1 per panggilan:

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)}

Di oloproof.yaml, sistem callable mendeklarasikan records: [media/v1]. Setiap item memuat:

FieldArti
kindimage, audio, atau video, dari tipe MIME
mime_typeimage/png, audio/wav, video/mp4, dan seterusnya
uridi mana file itu berada: path file://, URL https://, atau path relatif terhadap proyek
digestsha256 dari byte-nya, sha256:...
size_bytesukurannya dalam byte
roleinput, output (bawaan), atau context
namesebutan untuknya dalam prompt atau halaman; media_file memakai nama file-nya
width, height, duration_sopsional, sebagaimana dideklarasikan sistem Anda

media_file(path) mengisi field-field ini dari file lokal. Tidak ada yang disalin ke penyimpanan Oloproof. Segala sesuatu yang membaca file itu kemudian, baik pemeriksaan, juri, maupun workbench, membacanya melalui read_media, yang menolak byte yang ukuran atau sha256-nya berbeda dari rekamannya: konten yang berubah menghentikan eksekusi, dan file yang sudah tidak ada membuat kasus itu hilang. Simpan file-file sebuah eksekusi, tanpa diubah, selama Anda menyimpan eksekusi itu; tulis keluaran setiap versi ke tempatnya sendiri. Di @evaluator Anda sendiri, read_media(item) mengembalikan byte yang sudah diperiksa.

Pemeriksaan tanpa model

media_check mengukur setiap item yang direkam dengan suatu peran dan lolos ketika setiap item memenuhi setiap syarat yang dideklarasikan:

  - type: media_check
    criterion: thumbnail_fits
    kind: image
    formats: [png, jpeg, webp]
    max_width: 256
    max_height: 256
    max_bytes: 50000

Format dibaca dari byte pembuka file, sehingga JPEG yang disimpan sebagai .png gagal; ukuran gambar dan durasi WAV dibaca dari header-nya; ukuran video atau panjang MP3 diukur dengan ffprobe. Batas durasi berlaku untuk audio dan video, batas dimensi untuk gambar dan video.

image_matches_reference lolos ketika setiap gambar terlihat seperti acuannya: perceptual hash 64-bit keduanya berbeda paling banyak max_distance bit (8 secara bawaan). Salinan yang diubah ukurannya atau dikompresi ulang tetap dalam selisih beberapa bit; gambar kosong, file rusak, atau adegan yang berbeda tidak. Acuannya adalah satu reference_file untuk setiap kasus, atau path yang disebut oleh expected setiap kasus dengan reference_field. Hash ini membaca tata letak dan cahaya, bukan warna, sehingga tidak dapat membedakan dua produk yang difoto dengan cara yang sama, dan grafik datar dengan area kosong yang luas menggesernya lebih banyak daripada foto. Evaluator ini membutuhkan Pillow: pip install 'oloproof[media]'.

Setiap field ada di referensi konfigurasi. Kedua pemeriksaan memutuskan sejak eksekusi pertama, karena keduanya tidak memanggil model.

Juri yang melihat media

rubric_judge dengan media ditunjukkan media yang direkam untuk kasus itu dengan peran tersebut (input, output, atau all), masing-masing disebut namanya dalam prompt sehingga juri dapat membedakan input dari keluaran:

  - 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
  • Gambar dilampirkan apa adanya, hingga 5 MB per gambar dan 20 per penilaian.
  • Video dilampirkan sebagai frame diam, yang diambil dengan ffmpeg di mesin yang menjalankan juri: video_frames: 4 mengambil titik tengah dari empat rentang yang sama panjang, [0.5, 2.0] mengambil momen-momen itu.
  • Audio ditranskripsi oleh transcriber (endpoint /audio/transcriptions yang kompatibel dengan OpenAI, milik OpenAI ketika base_url tidak ditulis) dan transkripnya dimasukkan ke dalam prompt; atau, dengan audio: native, audio dilampirkan sebagai suara untuk model yang dapat mendengar (wav dan mp3; bukan milik Anthropic).

Digest media merupakan bagian dari kunci sebuah penilaian, sehingga media yang berubah dinilai ulang dan media yang tidak berubah berasal dari cache. Transcriber dan waktu frame merupakan bagian dari versi juri, dan setiap penilaian menyimpan transkripnya dan versi ffmpeg. Juri yang dideklarasikan untuk audio tanpa transcriber, atau untuk video di mesin tanpa ffmpeg, menghentikan eksekusi alih-alih membuat kasus-kasus itu hilang. Model yang di-hosting menagih setiap gambar sebagaimana setiap kata.

Memvalidasi juri media

Juri yang melihat media tidak memutuskan apa pun sampai label manusia menunjukkan bahwa juri itu sepakat dengan mereka, persis seperti juri yang membaca teks: beri label pada sampel acak, lalu oloproof evaluators validate (Juri). Di ruang kerja yang di-hosting, antrean tinjauan menunjukkan media setiap kasus kepada peninjau. Mengubah model, rubrik, media, frame, atau transcriber menghasilkan juri baru, yang membutuhkan validasinya sendiri.

Media di workbench

Media sebuah kasus muncul di samping keluaran dan putusannya, di halaman kasus itu dan di antrean tinjauan, dengan tipe, ukuran, dan digest setiap file.

  • Workbench lokal membaca setiap file dari tempat eksekusi merekamnya, di mesin Anda, dan hanya menampilkannya selama sha256-nya masih cocok.
  • Ruang kerja yang di-hosting tidak pernah menerima media. Browser pemirsa mengambil setiap file dari oloproof collect di jaringan Anda, dengan tiket berumur pendek yang sama yang dipakai antrean tinjauan untuk konten kasus (Juri), dan memeriksa sha256-nya sebelum menampilkannya. Tanpa kolektor, halaman itu mencantumkan fakta setiap file dan menyatakan mengapa file itu tidak ditampilkan.

Eksekusi yang di-push membawa rekaman media/v1, beserta tempat setiap file disimpan, di bawah kategori egress artifacts; kebijakan yang menahan artifacts juga menjaga lokasi-lokasi itu tetap di sisi Anda.

Tidak didukung

  • Membuat media: sistem Anda membuat file-filenya, dan Oloproof mengevaluasinya.
  • Mengunggah media ke Oloproof: tidak ada unggahan, baik yang di-hosting maupun lokal.
  • Model yang menonton seluruh video atau mendengar audio melalui API Anthropic: di sana video dinilai dari frame, dan audio melalui transkrip.
  • Pemeriksaan deterministik atas isi audio atau video (word error rate, deteksi adegan): tulis sendiri dengan @evaluator dan read_media.
  • Perceptual hashing untuk audio atau video: image_matches_reference hanya membaca gambar.