Ga naar de inhoud

Handleidingen

Afbeeldingen, audio en video

Oloproof evalueert systemen die afbeeldingen, audio en video ontvangen of maken, en de bestanden verlaten nooit de plek waar je systeem ze bewaart. Een run legt elk bestand bij referentie vast; deterministische controles meten de bytes; een judge kan afbeeldingen, videoframes en audio zien; de workbench toont ze naast elk oordeel. De tutorial loopt afbeeldingen door aan de hand van een uitvoerbaar voorbeeld.

Media vastleggen

Je systeem legt de bestanden die een case ontving of maakte vast met current_case().media(...), als één media/v1-artefact per aanroep:

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

In oloproof.yaml declareert een callable systeem records: [media/v1]. Elk item bevat:

VeldBetekenis
kindimage, audio of video, afgeleid van het MIME-type
mime_typeimage/png, audio/wav, video/mp4 enzovoort
uriwaar het bestand staat: een file://-pad, een https://-URL of een pad relatief aan het project
digestde sha256 van de bytes, sha256:...
size_bytesde grootte in bytes
roleinput, output (de standaard) of context
namehoe een prompt of een pagina het noemt; media_file gebruikt de naam van het bestand
width, height, duration_soptioneel, zoals je systeem ze declareert

media_file(path) vult deze in vanuit een lokaal bestand. Er wordt niets naar de store van Oloproof gekopieerd. Alles wat het bestand later leest, een controle, een judge of de workbench, leest het via read_media, dat bytes weigert waarvan de grootte of sha256 afwijkt van het record: gewijzigde inhoud stopt de run, en een bestand dat weg is maakt de case ontbrekend. Bewaar de bestanden van een run, ongewijzigd, zolang je de run bewaart; schrijf de uitvoer van elke versie naar een eigen plek. In je eigen @evaluator geeft read_media(item) de gecontroleerde bytes terug.

Controles zonder model

media_check meet elk vastgelegd item van een rol en slaagt wanneer elk ervan aan elke gedeclareerde voorwaarde voldoet:

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

Het formaat wordt gelezen uit de eerste bytes van het bestand, dus een JPEG die als .png is opgeslagen faalt; afmetingen van afbeeldingen en de duur van WAV-bestanden worden uit hun headers gelezen; de afmetingen van een video of de lengte van een MP3 worden gemeten met ffprobe. Grenzen voor duur gelden voor audio en video, grenzen voor afmetingen voor afbeeldingen en video.

image_matches_reference slaagt wanneer elke afbeelding op een referentie lijkt: hun perceptuele hashes van 64 bits verschillen in hoogstens max_distance bits (standaard 8). Een verkleinde of opnieuw gecomprimeerde kopie blijft binnen een paar bits; een lege afbeelding, een kapot bestand of een andere scène niet. De referentie is één reference_file voor elke case, of een pad dat de expected van elke case noemt met reference_field. De hash leest compositie en licht, geen kleur, dus hij kan twee producten die op dezelfde manier zijn gefotografeerd niet uit elkaar houden, en vlakke graphics met grote lege vlakken verschuiven hem meer dan foto's. Hij heeft Pillow nodig: pip install 'oloproof[media]'.

Elk veld staat in de configuratiereferentie. Beide controles beslissen vanaf de eerste run, omdat ze geen model aanroepen.

Judges die media zien

Een rubric_judge met media krijgt de vastgelegde media van de case met die rol te zien (input, output of all), elk bij naam genoemd in zijn prompt, zodat de judge een input van een output kan onderscheiden:

  - 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
  • Afbeeldingen worden bijgevoegd zoals ze zijn, tot 5 MB elk en 20 per oordeel.
  • Video wordt bijgevoegd als stilstaande frames, genomen met ffmpeg op de machine die de judge draait: video_frames: 4 neemt het midden van vier gelijke stukken, [0.5, 2.0] neemt die momenten.
  • Audio wordt getranscribeerd door de transcriber (een OpenAI-compatibel /audio/transcriptions-endpoint, dat van OpenAI wanneer base_url is weggelaten) en het transcript gaat in de prompt; of het wordt met audio: native als geluid bijgevoegd voor een model dat hoort (wav en mp3; niet dat van Anthropic).

De digests van de media maken deel uit van de sleutel van een oordeel, dus gewijzigde media worden opnieuw beoordeeld en ongewijzigde media komen uit de cache. De transcriber en de frametijden maken deel uit van de versie van de judge, en elk oordeel bewaart zijn transcripten en de ffmpeg-versie. Een judge die voor audio is gedeclareerd zonder transcriber, of voor video op een machine zonder ffmpeg, stopt de run in plaats van die cases ontbrekend te laten. Een gehost model rekent elke afbeelding af, net als elk woord.

Een mediajudge valideren

Een judge die media ziet beslist niets totdat labels van mensen laten zien dat hij het met hen eens is, precies zoals een judge die tekst leest: label een willekeurige steekproef en draai dan oloproof evaluators validate (Judges). In een gehoste werkruimte toont de reviewwachtrij de media van elke case aan de reviewer. Het model, de rubric, media, de frames of de transcriber wijzigen maakt een nieuwe judge, die zijn eigen validatie nodig heeft.

Media in de workbench

De media van een case verschijnen naast haar uitvoer en haar oordelen, op de pagina van de case en in de reviewwachtrij, met het type, de grootte en de digest van elk bestand.

  • Een lokale workbench leest elk bestand van de plek waar de run het vastlegde, op je machine, en toont het alleen zolang de sha256 nog klopt.
  • Een gehoste werkruimte ontvangt nooit media. De browser van de kijker haalt elk bestand op bij oloproof collect in je netwerk, met hetzelfde kortlevende ticket dat de reviewwachtrij voor de inhoud van cases gebruikt (Judges), en controleert de sha256 voordat het bestand wordt getoond. Zonder collector toont de pagina de gegevens van elk bestand en zegt ze waarom het niet wordt getoond.

Een gepushte run draagt de media/v1-records, met de plek waar elk bestand wordt bewaard, onder de egress-categorie artifacts; een policy die artifacts achterhoudt, houdt ook die locaties aan jouw kant.

Niet ondersteund

  • Media genereren: je systeem maakt zijn bestanden, en Oloproof evalueert ze.
  • Media naar Oloproof uploaden: er is geen upload, gehost noch lokaal.
  • Een model dat een hele video bekijkt of audio hoort via de API van Anthropic: daar wordt video beoordeeld op basis van frames, en audio via een transcript.
  • Deterministische controles van wat audio of video bevat (word error rate, scènedetectie): schrijf er een met @evaluator en read_media.
  • Perceptuele hashing van audio of video: image_matches_reference leest alleen afbeeldingen.