指南
影像、音訊和影片
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 讀取,它會拒絕大小或 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 只讀取影像。