跳至主要內容

指南

影像、音訊和影片

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]。每個項目包含:

欄位意義
kindimage、audio 或 video,由 MIME 類型得出
mime_typeimage/png、audio/wav、video/mp4 等
uri檔案所在的位置:一個 file:// 路徑、一個 https:// URL,或相對於專案的路徑
digest位元組的 sha256,sha256:...
size_bytes以位元組計的大小
roleinput、output(預設)或 context
name提示詞或頁面對它的稱呼;media_file 使用檔名
width、height、duration_s可選,由您的系統宣告

media_file(path) 依據一個本機檔案填寫這些欄位。不會有任何內容被複製到 Oloproof 的儲存區中。之後讀取該檔案的一切,無論是檢查、評審還是工作台,都透過 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,要麼是每個案例的 expected 透過 reference_field 指明的路徑。雜湊讀取的是構圖與明暗,而不是顏色,因此它無法區分以相同方式拍攝的兩件商品,而且有大片空白區域的平面圖形比照片更容易讓它變動。它需要 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。沒有收集器時,頁面會列出每個檔案的事實,並說明為什麼不顯示它。

推送的執行會在 egress 類別 artifacts 下攜帶 media/v1 記錄,以及每個檔案的保存位置;扣留 artifacts 的政策也會把這些位置留在您這一側。

不支援的功能

  • 產生媒體:您的系統製作它的檔案,Oloproof 評估它們。
  • 把媒體上傳到 Oloproof:沒有上傳功能,無論託管還是本機。
  • 透過 Anthropic 的 API 讓模型觀看完整影片或聆聽音訊:在那裡,影片依據影格來評判,音訊透過轉寫文字來評判。
  • 對音訊或影片內容的確定性檢查(字詞錯誤率、場景偵測):以 @evaluator 和 read_media 自己寫一個。
  • 音訊或影片的感知雜湊:image_matches_reference 只讀取影像。