iT邦幫忙

2026 iThome 鐵人賽

DAY 13
0
AI Engineering

《矽墟》:我把一部科幻小說當成軟體專案來管系列 第 13

Day 13|同一個 prompt 連 4 次被判 NSFW,改寫措辭完全沒用

  • 分享至 

  • xImage
  •  

模組三|AI 生圖與生片產線(Day 10–19)

前兩天講產線怎麼建。今天講產線卡住的時候怎麼辦。

這篇的主角是一次內容審核誤判。它本身不大,但排查的過程是可以直接搬走的,而我當時走了三步冤枉路。

問題:生不出來,而且不知道為什麼

情境:我要生一張章節封面。用 Day 10 講過的雙參考做法:三視圖 + 立繪一起餵進去,prompt 鎖住角色設定,另一段描述場景。

第一次送出,回來的是內容審核拒絕。

這種事偶爾會發生,通常換個說法就好。於是我改寫了 prompt,把可能敏感的措辭都換掉。

第二次,一樣被擋。

再改,用更中性的字。第三次,一樣。

第四次,一樣。

**同一個組合,連續四次,全部被同一個模型的審核擋下。**而我每次都改了 prompt 的文字。

冤枉路:我一直在改同一個變數

我把同一根推桿推了四次,另外三根連碰都沒碰過

現在回頭看,第二次失敗的時候我就該停下來了。

因為我做的事情是這樣:

嘗試 我改了什麼 結果
1
2 prompt 措辭
3 prompt 措辭(更中性)
4 prompt 措辭(再中性)

四次嘗試,只動了一個變數,而且那個變數動了三次都沒有任何反應。

這在除錯上是很明確的訊號:

改動 X 而結果完全不變,代表 X 不是原因。

我當時沒有這樣想,因為「內容審核 = prompt 有問題」這個聯想太強了。文生圖的直覺就是「文字有問題就改文字」。

但這次的輸入不只有文字,還有兩張參考圖。

機制:審核不是只看文字

兩根我單獨都拿得過去的短棍,併在一起就卡在門框上

想通這件事之後,整件事就合理了。

現代的圖像生成服務,內容審核通常是多模態的:

  • 你送出的 prompt 文字
  • 你附上的參考圖
  • 以及模型即將產出的東西

三者都可能進入判定,而且它們是組合判定的:單獨看每一項都沒問題,組合起來可能觸發。

我這次的情況就是:參考圖本身的一項體型特徵,加上場景裡需要的一件道具,兩者組合被判定為需要攔截

單獨拆開來看,兩者都毫無問題。 這也是為什麼我改文字沒用。文字從來就不是觸發點,而那件道具是場景的必要元素,改掉就不是我要的圖了。

為什麼這種問題特別難查

因為審核回應通常不告訴你是哪一部分觸發的。

你收到的是一個籠統的拒絕。沒有「是第三句話」、沒有「是參考圖 B」、沒有信心分數。

這跟一般的 API 錯誤很不一樣。400 Bad Request 至少會告訴你哪個欄位錯了;內容審核基於很合理的理由(防止有人反推繞過機制),故意不給你細節。

於是你只能靠控制變數自己二分。 而每一次二分都要花一次生成的錢和時間。

繞法:換模型,一次過

最後的解法很簡單:換一個模型。

原本用的是一個模型(Seedream 4.5),改用另一個(nano_banana_2,實際跑的是 nano_banana_flash)。

同樣的參考圖、同樣的場景需求,一次過。

因為內容審核的判定標準是各家自己訂的,不是產業標準。A 家判定為需要攔截的組合,B 家可能完全不覺得有問題。

這不代表 B 家比較寬鬆或比較不負責,是它們的閾值和分類器不一樣。

然後我把結論寫成規則

開發足跡.md 裡當天的紀錄,最後一句是這樣:

此參考圖組合日後封面直接用 nano banana,別浪費 Seedream 額度。

這句話比解法本身重要。

因為這種誤判是可重現的:同樣的參考圖組合,下次還是會被擋。如果我不記下來,三個禮拜後我會再燒四次額度重新發現一次。

排查的成本要一次付清,不要每次重付。

代價

代價一:四次失敗的額度是真的燒掉了。

而且是燒在完全沒有產出的方向上。如果我第二次就轉向去驗證「是不是圖的問題」,成本會少一半。

代價二:換模型不是免費的。

兩個模型的畫風不完全一樣、輸出解析度不一樣(這直接導致了明天要講的解析度補齊問題)、參數名稱也不同。

「換一個能跑的」會在別的地方產生新的不一致。 這次的封面因此走了跟其他圖不同的後製流程。

代價三:我沒有真正確認觸發原因。

我的紀錄裡寫的是「疑似」。我沒有做完整的控制變數實驗:沒有拆掉道具單獨測、沒有換一張參考圖單獨測。

因為做那些實驗要再燒好幾次額度,而我已經有一條能走的路了。

這是務實的選擇,但它的代價是我對這件事的理解停留在假設。 下次遇到類似情況,我沒辦法預測會不會發生。

帶走什麼

一、同一個變數改三次沒反應,就換變數。

這是最基本的除錯紀律,但在有「強烈直覺」的領域特別容易忘記。

「內容審核 = 文字問題」「畫面不對 = prompt 不夠細」「效能慢 = 資料庫」,這些聯想愈強,你愈可能在錯的變數上耗掉整個下午。

具體做法:在第二次失敗之後,強迫自己寫下「還有哪些輸入我沒動過」。 我這次沒寫,所以四次都在改文字。

二、列出你的完整輸入清單,不要只列你想到的那個。

送出一次生成請求,輸入其實有:文字 prompt、negative prompt、參考圖(可能多張)、模型、參數(尺寸、品質、seed)、以及服務端的審核設定。

卡住的時候,先把清單寫出來,再決定要動哪一個。 憑直覺挑通常會挑到最顯眼的那個,而最顯眼的那個往往不是原因。

三、外部服務的策略性拒絕,「換一家」是合法的第一選項

我們對自己寫的程式會有「一定要找出根因」的堅持,這是對的。但對外部服務的內容審核:

  • 你看不到規則
  • 你拿不到細節回應
  • 規則會在你不知情的時候改變
  • 每次實驗都要付費

在這種條件下,追根因的期望報酬很低。 先換一家試試看,能過就過,然後把「這個組合走 B 家」記下來。

判斷句:這個系統的規則我看得到嗎? 看得到就查根因;看不到而且有替代品,就先換。

四、把排查結論寫成規則,不然你會付兩次。

這種誤判可重現。今天花四次額度學到的東西,如果沒寫下來,三個月後會再花四次。

紀錄要包含三件事:什麼組合會出事、換成什麼可以過、下次直接用哪個。 「什麼組合會出事」最容易被省略,但它是最值錢的那一項。


明天 Day 14,繼續講外部服務的實務問題:參考圖怎麼傳上去。兩條路:走簽名上傳流程,或把圖丟到自己的靜態站當圖床再給 URL。我選了後者,理由不只是比較省事。


上一篇
Day 12|把 prompt 從腳本裡搬出來,改角色設定不用碰程式
下一篇
Day 14|參考圖怎麼傳給外部服務:我選了看起來比較笨的那條
系列文
《矽墟》:我把一部科幻小說當成軟體專案來管16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言