weken.news
ai產品gemini合規設計工程實務實測

我讓 Gemini 認蟲但不准它推薦商品:法規怎麼決定 AI 產品的架構,而不是技術

直接回答

讓 AI 產品不講出違法的話,最有效的做法不是把規則寫進 prompt,是把它沒有能力講的東西從它的職責裡拿掉。我的辨識工具裡模型只負責兩件事,判斷是哪一種蟲、寫一句好笑的話,商品名稱、許可證字號、處理建議全部由伺服器端的對照表決定,prompt 裡一個商品名都不出現。再加兩道保險:模型寫的每一句話送出前過禁用詞掃描,命中就整句換掉;辨識信心度低於 60 分完全不推薦任何商品。

週末哥 ·

做一個 AI 辨識工具,接上環境用藥類的商品建議。整件事裡最大的風險不是模型認不認得出蟲,是它會不會講出一句違法的話。

環境用藥管理法對逾越登記內容的罰則是 6 萬到 30 萬元,而且可以撤照、勒令停業。

先說清楚界線在哪,因為這決定了整個架構。

環境用藥廣告有一條官方函釋的界線:只列品名、圖案、價格、廠商資料,不涉及效能、使用方式、製法、安全性,可以不視為廣告。碰到任何一項,整套規定上身。

而我做的東西會說「你拍到的是這種蟲,這幾支商品登記可以用在牠身上」。那是效能宣稱,百分之百落在廣告的範圍裡。

所以問題不是做完之後加什麼免責聲明,是這個東西要怎麼蓋。

我第一個想到的做法是把規則寫進 prompt。這是錯的。

prompt 是機率不是保證。模型每次生成都會換一種說法,而你事前看不到它這次會寫什麼。環境用藥廣告的禁用詞分四款,其中誇張安全性包含環保配方、絕對安全、人畜無害、無毒性、安心使用,誇張效能包含立即見效、澈底殺滅、完全消滅、根除、保證。

模型只要寫出一句「這個噴下去一定死」,就構成誇張效能。而它有非常多種方式可以寫出那個意思。

讓 AI 不講違法的話,不是把規則寫進 prompt,是讓它沒有能力講。商品名稱與效能敘述不進 prompt,模型就不可能生成商品建議。這是結構問題不是提示問題。

最後的架構只有一句話:模型只負責認,不負責建議。

模型的職責被砍到只剩兩件事,判斷是哪一種蟲、寫一句好笑的判決。它的 prompt 裡一個商品名都沒有。

商品名稱、許可證字號、成分、急迫度、鑑別特徵、處理建議,全部放在伺服器端的兩個資料檔裡。前端顯示什麼商品,是伺服器拿辨識出來的類別去查表決定的。

這樣一來,模型再怎麼發揮都碰不到受管制的那一段。而那張表我只要人工檢查一次,之後就長期安全。

對照表本身有一條規矩:每一支商品都必須有「我實際看過許可證或商品標示」的來源,而且來源要寫在資料檔的欄位裡。

這條規矩擋掉了不少東西。有一支熱賣商品,官網不同素材上的字號寫法不一致,一邊寫某某防蟲字、一邊寫某某製字,查詢系統又查不到。那一支我整支排除在對照表外面,寧可少推一個商品。

另一個常見陷阱是商品頁寫得比許可證寬。許可證登記的防治性能只有蟑螂跟螞蟻,但商品頁的行銷文案會多寫幾種蟲。照抄商品頁就是逾越登記內容,要對的是許可證不是文案。

我抓商品圖的時候也踩到同一個坑。用「面積最大的圖」去挑,抓到的是商品描述的長圖,那張圖上印著一個誇張效能的百分比宣稱。改成只認商品相簿裡接近方形的那幾張才避開。

除了對照表,還有兩道保險。

第二道是禁用詞掃描。我把法規列舉的四款禁用詞抄成一個清單,模型寫的每一句話送給使用者之前掃一次。命中就整句換成安全的預設句,不做局部塗改,因為挖掉違規詞再重組容易留下語意殘骸。同時記錄這次是被哪個詞攔下來的,方便事後回頭調 prompt。

第三道是信心度門檻。辨識信心度低於 60 分,完全不推薦任何商品,只請使用者靠近一點重拍。理由很簡單:認錯物種又推錯處理方式,比誠實說認不出來嚴重得多。

三道保險:受管制內容寫死在伺服器端對照表,模型碰不到;模型輸出過禁用詞掃描,命中整句換掉;辨識信心度低於 60 分完全不推薦商品。

還有第四件事,它不是保險而是立場:辨識到益蟲的時候,工具會直接說這隻不用打,而且一支商品都不推。願意叫使用者不要買東西,比推銷更能取信於人,而且它讓公開頁少一段廣告,法規上更乾淨。

技術上有一個坑值得單獨講,因為它會讓整支 API 掛掉而且錯誤訊息完全誤導。

我用的是 Gemini 2.5 Flash,要求它回 JSON。第一版上線後每一次呼叫都回 502,訊息是 JSON 解析失敗。

原因是這個模型預設會先思考一輪。實測它會花 270 到 370 個 token 在思考上,而我把 maxOutputTokens 設成 400。思考加上輸出超過上限,回來的 JSON 被截斷,解析當然失敗。

把 thinkingConfig 的 thinkingBudget 設成 0 之後,同一組測試圖片的回應時間從 6.0 秒降到 2.2 秒,辨識正確率沒有任何變化。

Gemini 2.5 Flash 預設開啟思考,實測吃掉 270 到 370 個 token。maxOutputTokens 設太小會讓 JSON 被截斷而解析失敗。關掉思考後同組測試從 6.0 秒降到 2.2 秒,正確率不變。

還有一個坑是 prompt 改寫造成的,而且它藏了一整天。

我後來把辨識從「大類」升級成「物種」,重寫了 prompt。新的 prompt 裡有一欄叫 verdict 是判決句,另一欄叫 roast 是吐槽句,我寫著「roast 只有在不是蟲的時候才寫」。

模型就理解成 verdict 是給蟲用的。結果只要辨識出「不是蟲」,verdict 就永遠是空的,畫面上出現一個空的黃色方框。我連續呼叫 4 次確認,4 次都是空的。

修的方式是三層:prompt 明講這一欄不管是不是蟲都一定要寫、伺服器端加保底空的就用另一欄頂上、畫面上空的就不要畫那個框。

這個問題不是任何自動檢查抓到的,是我打開截圖用眼睛看到的。所以我後來把「有邊框或底色卻沒有內容的框」也加成一項自動檢查。

學到的是:AI 產品的合規設計,決定架構的是法規不是技術。

先問這個頁面在法規上算什麼,再決定模型可以碰哪些東西。把受管制的內容從模型職責裡整個拿掉,比在 prompt 裡寫十條規則可靠得多,因為前者是結構,後者是機率。

常見問題

為什麼不把法規規則寫進 prompt 就好?
因為 prompt 是機率不是保證。模型每次生成都可能換一種說法,而你事前看不到它會寫什麼。環境用藥廣告的禁用詞包含誇張安全性與誇張效能兩類,模型只要寫出一句「這個一定死」就構成誇張效能。真正可靠的做法是讓它沒有能力講:商品資訊不進 prompt,模型就不可能生成商品建議,這是結構問題不是提示問題。
環境用藥廣告的罰則有多重?
有兩層。內容違規走環境用藥管理法第 48 條,罰 6 萬到 30 萬元,適用無照刊登、逾越登記內容、虛偽誇張或不當廣告。沒有敘明廠商名稱或字號、載體不在規定方式內,走第 49 條,罰 3 萬到 15 萬元。兩層都可以撤照、勒令停業。母法第 33 條第 1 項規定不得逾越登記內容,意思是許可證登記可以防治哪些害蟲,廣告就只能對那些害蟲講。
怎麼確認商品跟害蟲的對應沒有逾越登記內容?
逐支比對許可證上登記的防治性能,而不是看商品頁的文案。商品頁常常寫得比許可證寬,例如登記只有蟑螂跟螞蟻,文案卻寫也能對付其他小蟲。我的對照表規定每一支商品都必須有「我實際看過許可證或商品標示」的來源,寫在資料檔的欄位裡,沒有來源的商品一律不進表。字號查不到或素材上寫法不一致的,整支排除。
Gemini 2.5 Flash 回 502 或 JSON 解析失敗,常見原因是什麼?
我遇到的原因是預設開啟的思考模式吃掉輸出額度。實測它會先花 270 到 370 個 token 思考,如果 maxOutputTokens 設得太小(我設 400),思考加輸出就超過上限,回傳的 JSON 被截斷,解析必然失敗。把 thinkingConfig 的 thinkingBudget 設成 0 之後,同一組圖片的回應從 6.0 秒降到 2.2 秒,辨識正確率沒有變化。
AI 判斷不確定的時候該怎麼處理?
設一個信心度門檻,低於門檻就完全不給建議,只請使用者重拍。我設在 60 分。理由是認錯物種又推錯處理方式,比誠實說認不出來嚴重得多。同一個原則也用在統計上:樣本數不足的時候照樣顯示比例,但明白標註「目前只有 N 筆,還不準」,不做假的稀缺感。