自動化與 Agent
AI 逐鏡「反抽卡」怎麼做:防住「假重抽」,驗收看雜湊值不看肉眼
任何「換一批、重來一次」的功能,驗收標準是「結果真的不同」,不是「它跑完了」。靜默退化一路綠燈、不會報錯,是最貴的一種 bug。
一個核心觀念
「重來一次」「換一批」類功能,正確性的定義是輸出真的改變,不是執行完成。
介面上按鈕有反應、有 loading、跳出新卡片,不代表圖變了。功能存在、看似生效、實際無效、而且不報錯,這叫靜默退化,一路綠燈,最難抓。
什麼是逐鏡反抽卡
對影片裡的每一個鏡頭,AI 一次生成 2 到 4 張候選畫面並排給你挑;不滿意就按「再抽一批」,看中哪張就指定哪張。把「賭一次運氣」變成「從幾個選項挑最好的」。
陷阱:假重抽
圖像模型靠一個隨機種子(seed)決定出圖長相。如果「重新生成」沒有更換種子,每次送同一個固定值,按十次「再抽一批」會拿到十張一模一樣的圖。使用者以為在挑選,其實系統只是把同一張圖重畫給他看。
我的第一版預設種子就是 0 而且不會變,差一點就這樣上線。
解法:種子要刻意設計
- 每一批用一個隨機的大整數當起點。
- 同一批裡每張候選,種子加一個大質數當間隔(我用 7919)。
batch_base = random_big_int()
seeds = [batch_base + i * 7919 for i in range(n_candidates)]
質數間隔讓同批內不重複、不同批之間也幾乎不會撞號。
驗收:算雜湊值,不要靠肉眼
肉眼看「好像不太一樣」太容易自我安慰。做法:把候選圖檔的 SHA-256 雜湊值算出來比對,三個都不同才算通過。
import hashlib
def sha(path):
return hashlib.sha256(open(path, "rb").read()).hexdigest()
hashes = [sha(p) for p in candidate_paths]
assert len(set(hashes)) == len(hashes), "有候選圖完全相同:假重抽"
同一個原則可以帶到任何「重試、重新生成」類功能:拿兩次輸出算雜湊值,相異才算數。
同款病的第二個變體:逐段情緒被拼接抹平
配音也是逐段挑情緒(平述、開心、驚訝、平靜、悲傷)、逐段試聽。我撞到的坑是:舊的合成介面把整篇文稿拼成一個字串丟給語音引擎,逐段情緒在拼接的瞬間全被抹成中性。底層引擎明明支援逐段情緒,是上層介面沒把它傳下去。
通用對策:凡是「逐段屬性」,在每一層都要透傳,並用實際輸出(聽、算)驗證,不只看設定頁面有沒有那個欄位。
含角色鏡頭:一致性條件生成
角色鎖定時存下的「定妝照」,在每個含該角色的鏡頭自動當參考去生成,同一個人跨鏡頭臉和服裝才不跑掉。每張候選再掛上 AI 場記的質檢標記,提醒你哪張可能畫錯了意圖。
出片:用真實語音秒數對齊
每個鏡頭的畫面要顯示多久?不是用字數估算,而是用該段真實語音的秒數:語音 2.9 秒,那顆鏡頭就 2.9 秒,音軌、畫面、字幕三軌自然同步。先渲一支檢查版終審,通過才一鍵生成剪映草稿。
後記(10 月補充)
文中這套是在影流(ReelFlow)裡做的,那個專案自 8 月 8 日起降為維運、不再開發新功能。但「重來要驗證結果真的不同」與「逐段屬性要一路透傳」兩條跟專案無關,我後來做別的生成流程時照樣用。
卡住時怎麼問 AI
我在做一個 <你的工具或框架> 的 AI 生成流程,有「重新生成/換一批」的按鈕。我懷疑它其實沒有換隨機種子,按多次會得到相同結果。這是我目前呼叫生成的程式碼:<貼上程式碼>。請:1) 幫我判斷種子有沒有每次變化 2) 教我怎麼設計批次種子(隨機起點加質數間隔)3) 給我一段可以比對輸出雜湊值的最小驗收程式。請一步一步、先解釋原因再給範例。
一句話總結
任何「換一批、重來一次」的功能,都要驗證它真的變了。拿兩次輸出算雜湊值,相異才算數。
這是踩坑實錄與 AI 工具實測系列的一部分。想收到後續完整 SOP,訂閱電子報。
支持這裡的內容:前往 Ko-fi 斗內