iT邦幫忙

2026 iThome 鐵人賽

DAY 30
0
AI Engineering

AI 寫的測試,誰來測?系列 第 31 篇

【Day29】多生成五份,會得到五份一樣的盲區

  • 分享至 

  • xImage
  •  

TL;DR

  • 用 AI 最常見的直覺是「多跑幾次挑最好的」。三十天的資料說:這一半行不通
  • 它犯的錯很一致——三次獨立生成、跨兩臺模型,測試的盲區開在完全相同的位置
  • 但它多補的東西每次不同,所以也不能只驗一份就當每份都這樣

https://ithelp.ithome.com.tw/upload/images/20260928/20103826ni4azTNfA8.jpg


前言

要 AI 寫東西,不滿意就再跑一次:這是所有人都會做的動作。跑五次,挑最好的那份,聽起來很合理:反正生成便宜。

今天不做新實驗,把前二十八天累積的產物重新排一次,回答這個問題。

答案是彆扭的那種:兩邊都不順著直覺。


一致的那一邊:它怎麼錯

三次獨立生成,盲區開在完全相同的位置。

這批跟昨天那十份不同。更早那一輪要 AI 照規格寫具體的測試(寫死期望值那種,不是蛻變關係),同樣是兩臺模型各跑五次,三份通過門檻的拿去跑十四個變異體:

單獨變異分數    85.7%    85.7%    85.7%
存活的變異體    M11、M14  M11、M14  M11、M14

不只分數一樣,活下來的是同一批。跟人寫的那套漏的不是同一對(人漏 M09、M14),但三份 AI 產物彼此一模一樣。當時的紀錄寫了一句:盲區不是隨機的。

第二筆更誇張。第一幕驗屍的時候發現,年報酬率直接除以 12 當成月利率這個寫法,出現在三個獨立生成的檔案裡、總共七次。每一次要 AI 做月複利,它就給這個寫法。

這不是打錯字,是穩定行為。

第三筆是前幾天量到的:十份產物,全部寫了同一條在受測實作上永遠不會紅的斷言。十次獨立生成,十票投給同一個判斷。

三筆裡一筆是它產的程式、兩筆是它產的測試,放在一起指向同一件事:不管產的是哪一種,它錯的地方不是抽籤決定的。


離散的那一邊:它多補了什麼

換個角度看同一批產物,畫面完全不同。分界先講清楚:上一節是它看不見的地方,不管怎麼生成都看不見;這一節是它有得選的地方,這次這樣、下次那樣。

十份裡只有一份寫了金額負值的校驗測試。而那一份,剛好補上了人寫的測試套組漏掉的一格:那一格漏了是因為二十三組案例沒有一組餵過負值。

一份寫了,九份沒寫。而提示詞對這件事根本沒有要求。

第二筆在第一幕。當時解剖的是一支有缺陷的計算機,但同一個模型還生成過另一支:

同一個模型,另一次生成,用一個更簡單的架構完全繞過了整個問題。
它會寫。它只是在功能變多的時候,選了一條會分岔的路。

同一臺模型、同樣的任務,一次踩進去了,一次繞過去了。


所以,多跑幾次有用嗎

兩條推論,各打一半。

一、想靠多跑幾次補洞,行不通。

因為它犯的錯很一致。跑五次,得到五份在同一個位置開洞的產物。這不是說五份完全一樣(它們各自多殺掉的變異體並不相同),而是說那個洞,五份都有。你把五份疊在一起,那個洞還在。挑「最好的那份」也沒用:在盲區這件事上,它們沒有好壞之分,它們一樣。

這也回答了一個更早的問題:為什麼前面那些天要花力氣造尺。因為你沒辦法靠抽樣繞過它:抽再多次,抽到的是同一個洞。

二、但也不能只驗一份,就當每份都這樣。

因為它多補的東西每次不同。這一份寫了負值校驗,下一份可能沒寫。你驗收過的那一份不代表下一份,尤其當「這一份多做了什麼」剛好就是它的價值所在。

合起來是個不太舒服的結論:

重複生成救不了你,但你也不能只看一份。


放進工作

一、不要用「再生成一次」當作修 bug 的手段。

如果第一份有結構性的問題(兩段程式對不起來、某個欄位從來沒被檢查),第二份很可能一樣。值得重跑的是「這次它剛好寫得比較亂」那種,不是「這次它算錯了」那種。

分辨方法:看那個問題是「它沒做」還是「它做錯」。 沒做的(沒餵負值、沒寫校驗),換一份可能就有;做錯的(/12、恆綠斷言),換幾份都在。

二、把「這一份多做了什麼」記下來。

九份沒寫負值校驗,一份寫了。如果你只留了沒寫的那份,你會永遠不知道還有這一格。生成多份的價值不在挑最好的,在看它們的差集:哪一份做了別份沒做的事。

三、驗收要驗你手上這一份。

不是「這個模型可不可靠」,是「這一份產出長什麼形狀」。前者問不出答案,後者查得出來。


後記

寫這篇之前我對這件事的想法是反的。

原本的骨架是「同一個模型、不同次生成,危險程度差很多,所以要逐份看」。寫到一半去翻資料,翻出那三個 85.7%,存活集合還完全相同。我的命題被自己一週前記下來的東西推翻了。

而且那份紀錄裡本來就寫了「盲區不是隨機的」這句話。我當時寫下它,然後忘了。

這大概是做這種長系列最奇怪的體驗:你的主要資料來源是幾週前的自己,而那個人記下來的東西比你現在記得的多。留 manifest 的理由本來是怕數字抄錯,實際救到的是結論。


這些數字不能拿來做什麼

  • 三個 85.7%、七次 /12、十份的 10/10:樣本都很小,而且都來自同一家的模型、同一個題目
  • 「一致」與「離散」是這幾批產物觀察到的分布,不是模型的性質,更不是可靠度評分
  • 本篇沒有新實驗。是把已經量過的資料重新排一次回答一個新問題,沒有回填任何預測
  • 「重複生成救不了你」是對結構性錯誤說的。純粹寫得亂、漏了一段這種,重跑當然可能好

逐輪的原始輸出在各天的 manifest.yaml。


只帶走一件事
生成多份的價值不在挑最好的那份,在看它們的差集。
相同的部分是盲區,不同的部分才是資訊。


三十天走到這裡,方法都建好了,尺也都造了。

剩下的是把它們整理成一張可以帶走的清單,以及回去修那支程式。


今天的 repo:https://github.com/eyelash500/2026_ironman_test_ai/tree/day29


上一篇
【Day28】補上那一格的,是一條 pytest.raises
下一篇
【Day30-上】四幕,四個結論,八十筆決定
系列文
AI 寫的測試,誰來測? 共 33 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言