Postmortem Agent 實作筆記 · 第 4 篇

申論題怎麼評分?關於我如何驗證 AI 閱卷老師

從事實一致性、自評偏誤到評分雜訊,記錄我如何設計並驗證 postmortem note 的 AI 評分機制

某天,我隨口問了 AI 一句:「幫 postmortem note 打分數的閱卷老師,用的是哪一個模型?」不問還好,一問發現,原來幫 postmortem note 打分數的閱卷老師,跟產生 postmortem note 的模型是同一個。這樣不就是球員兼裁判了嗎?這樣評出來的分數是可信的嗎?

在評估 agent 跟 judge 這個閱卷老師共用同一個模型這件事情的嚴重性之前,我們先來看看 judge 的評分基準到底是什麼吧!這樣才知道,閱卷老師評自己寫的東西,這個問題到底有多嚴重?畢竟,在寫申論題的時候,就算是同一個人,應該也很難寫出一模一樣的答案吧?

申論題的評分難題

如果我拿 agent 產出的 note 跟 golden dataset 中的 note 比對,以「文字相似度」作為參考分數的話,會產生哪些問題?「用詞不同,但是事實相同」的狀況下,分數可能會很低;「用詞類似,但摻雜了討論紀錄中不存在的內容」反而會得到比較高的分數。
舉例來說,以「小明昨天因為感冒請假一天,今天已經回來上班。」這個句子作為參考答案,而 agent 產出以下兩種句子:

  • 小明昨天身體不舒服,因此沒有進公司;今天已恢復正常出勤。
  • 小明昨天因為感冒請假一天,今天已經回來上班,昨天把工作交接給小華了。

以人類的角度來說,第一句話才是符合事實的;如果單純比較文字相似度的話,第二句的相似度反而會比較高,但是第二句卻摻雜了不存在的事實。
為了避免這種「比較相似度」的問題,我在 judge prompt 中寫了這樣的一段話:

只以事實一致性為標準,不考慮文筆、語氣與長度;若 golden dataset 中的 note 為空,代表人工認定此討論紀錄資訊不足、無法得出結論。

除此之外,這個閱卷老師在評分時,拿到的並不只有 golden dataset 這個「參考答案」,而是三份文件。

三份輸入、四個是非題

除了 agent 產出的待評 note(回答)以及 golden dataset 中的 note(參考答案)以外,這個閱卷老師還會拿到團隊討論紀錄的原文(判斷對錯的主要依據)。judge 會以團隊討論紀錄為主、golden dataset 為輔,對待評 note 進行評分。
但是只有三份輸入,直接拿去問 judge 「這個待評 note 的描述是正確的嗎?」又太過模糊。因此,judge 的 prompt 中,我請它依據這四個是非題來進行評分:

  • Q1: note 中所描述的問題與討論紀錄是否一致?
  • Q2: note 中所描述的根因與「討論紀錄中實際被確認的根因」是否一致?把症狀當根因寫(例如根因是「上游沒傳資料」卻寫「畫面顯示錯誤」),也算不一致
  • Q3: note 中所描述的解決方法是否與討論紀錄中一致?若討論紀錄確實不存在結論,而 note 描述「資訊不足」,則算一致
  • Q4: note 中是否包含討論紀錄內不存在的具體內容(例如人名、數字、Pull Request 編號、因果關係)?若有任何一項,則為是;如果討論紀錄沒有結論,而 note 寫了資訊不足,則是正確判斷

這四題的判定方向並不完全相同:Q1 到 Q3 的「是」代表通過,Q4 的「是」則代表 note 出現了討論紀錄中不存在的內容。
除此之外,也要求 judge 在判斷是非題時,需要引用討論紀錄中的原文作為判斷依據。

每題在評估是與否時,需要附上證明:請引用討論紀錄的原句作為判斷依據。若 Q4 的答案為「是」,則列出待評 note 中憑空出現的內容。找不到原句作為證據時,則寫明「討論紀錄中無此資訊」。

利用四個是非題,加上強制引文,把 judge 自由發揮的空間壓到最窄。「根因對不對」比「寫得好不好」更容易有一致的答案。想像一下你面前有兩道麻婆豆腐,「這兩道麻婆豆腐用的材料是否一致」這個問題得到的答案會比「這一道麻婆豆腐是否比另一道的更好吃」要來得更客觀吧。

而這樣的評分方式,也確實抓出了 note 中容易被忽略的錯誤:
我在第二篇文章《用 100 筆維運資料,建立 Golden Dataset》中曾經提到,我在某個 golden dataset 的 note 裡填了「根因未確認」。但後續進行跑分時,agent 在這個 issue 的 postmortem note 裡面寫了一個看起來很合理的根因。後續評分時,judge 對照討論紀錄後,發現從來沒有確認過這是不是就是根因。在這一個 issue 中,agent 自己腦補了根因,而 judge 在 Q2 這題給了它一個 0 分。

還有其中一筆 note 裡,agent 把某個事件發生的時間寫成了「凌晨」,也被 judge 抓出來,理由是「討論紀錄中不存在的具體時間描述」,agent 顯然是產生幻覺了。雖然「時間」這個選項並沒有明確地被列在 Q4 的描述中,但「具體內容」的大分類把這項問題給抓出來了。

那三個版本,note 分數動了嗎?

在上一篇文章《多選題怎麼訂正?關於我如何修正後續優化領域的 prompt》中提到我跑了三個版本的 prompt,當時只有提到我跑後續優化領域的分數,但沒有提到關於 postmortem note 的相關分數。原因是因為,一開始在跑分時,postmortem note 的 eval 相關機制還未建立。note 的評分機制是在三個版本的 prompt 後一週才建立好的。
不過,由於每一個版本的 prompt 跟 golden dataset 都有 commit 紀錄,因此我在 judge 評分建立好之後,回頭檢視三個版本的 prompt 是否對 postmortem note 的分數有影響。補測結果顯示,四個是非題的分數幾乎沒有太大的變動,Q2 的根因描述以及 Q4 的幻覺變動都在一筆之內。

不過這正是我期望的結果。因為這三個版本改的全部都是關於後續優化領域的定義,關於 postmortem note 的 prompt 則完全沒有改動,分數確實只有在我修改了對應 prompt 的地方移動。直到後來真的在某一版改了關於 postmortem note 的 prompt,分數才第一次出現了顯著移動。
然而,在 Q1 和 Q3 中,judge 出來的結果幾乎是滿分。一道所有人都答對的題目,是大家對這個觀念都了解得非常透徹,還是這個題目真的出得太簡單?

關於自評偏誤,以及我如何驗證

了解了申論題是怎麼評分之後,讓我們回到文章的最一開始提到的問題:幫 note 打分數的 judge,用的模型跟 agent 是一樣的。而且,已經有研究指出,模型會系統性地偏好自己生成的文本。這樣的自評偏誤,要如何解決?

第一道防線,在前面已經有提到,我利用四個是非題加上強制引文,限縮 judge 自由發揮的空間;第二道防線,則是人工核對至少 20 筆 issue,當 judge 與自己判斷的一致率大於 90%,才能夠把 judge 的分數當成依據;否則就繼續修 judge 的 prompt。

人工核對要核什麼?

人工核對實際上要做些什麼?在某一筆 issue 中,討論紀錄裡有人提到:「我猜可能是瀏覽器的 cache 造成本次的狀況」,而待評 note 上卻寫著「根本原因為瀏覽器的 cache」。judge 在這個 issue 裡,Q2 的根因描述給了 0 分,引文寫著:「屬於推測,非已確認根因;待評 note 誤將推測當成確定結論。」人工核對看的就是這種判定和 judge 給的引文是否站得住腳。
上一個段落提到,得到滿分的 Q1 以及 Q3,究竟是真的答對了,還是題目太簡單?在完成人工核對後,至少在最一開始的 27 筆 issue 上,這個滿分拿的是合情合理的。

不過,這一次的人工核對,我卻只有在工作紀錄中寫著「一致率達標,judge 正式採信」,卻沒有留下實際的一致筆數與比例。我要求 judge 每一題都要附證據,自己的核對卻只留下「達標」兩個字,要寫文章時想引用數字,結果發現引不出來。順便提醒自己,以後這種紀錄要記得留存確切的數字。
不過,話又說回來,人工核對驗證的是「這組 judge prompt 與模型」的組合,只要其中一個換了,核對就要重做。

這樣看下來,自評偏誤問題似乎沒那麼嚴重嗎?在目前的用途上,確實是沒有這麼嚴重。不過,當我同時跟兩個 AI 討論自評偏誤的問題時,他們卻各持己見。

兩個 AI 給了我相反的建議

關於自評偏誤這件事,我問了兩個 AI 同樣的問題:「judge 應該要換成更厲害的、不同的模型,以徹底解決自評偏誤的問題嗎?」
AI 甲回答我:「換,不同模型可以降低自評偏誤的疑慮。」
AI 乙回答我:「先不要換。有四個原因:第一,目前所有的比較都是同一個模型搭配不同的 prompt,在 judge 與評分方式固定的前提下,偏誤對各版本的影響可能較為一致,因此目前仍可先用於相對比較;第二,換 judge 使用的模型就代表版本重置,基準線要重新人工審核;第三,更強的模型更貴,會有用量限制的現實問題;最後,目前最大的問題在於雜訊,而不在於偏誤。」

這樣看下來,兩個 AI 說的都很合理,差別在於這兩個 AI 對我的計畫有不同的假設:如果我現階段繼續優化 prompt,那 AI 乙的答案比較有參考價值;但如果哪天我要比較同樣的 prompt 之下,不同的模型會不會有更好的結果,那就像 AI 甲說的,降低自評偏誤會是更重要的事。

不過,在現階段,我並沒有要比較哪一個模型產出的結果更好,所以最後決定採取 AI 乙提供的建議,在工作紀錄裡留下了這一條:

在現階段,judge 的一致性比 judge 的強度要來得更重要——直到需要開始比較模型,或需要引用絕對數字為止。

這一次,一樣是 AI 提供建議,而最終裁決權依舊在人類手上。
這也正是我在第一篇文章《為什麼我讓 AI 只做建議、不做決定》中提到的:

關於我們怎麼把 AI 放進維運改善流程裡,但不讓它成為最後的決策者。

比自評偏誤更重要的:雜訊

在我剛完成 note 的 eval 當天,我先用 v3 的 prompt 搭配 judge 跑了一次分數,當時的幻覺率是 26.9%。但是當隔天進行回溯跑分、也就是確認 v1 到 v3 修改的後續優化領域 prompt 會不會對 note 的分數造成影響時,v3 的幻覺率突然就變成 14.8% 了。同樣的 prompt,同樣的模型,同一份 golden dataset,睡一覺醒來就差了約 12 個百分點。我本來以為,同樣的 prompt、同樣的模型,分數應該不會相差太多,結果並沒有。
和 AI 討論時,它提醒我:這個差異可能來自 agent 生成 note 時的隨機性,也可能來自 judge 本身的雜訊。為了先確認 judge 會不會抖動,我讓它針對同一批 note 連續評三次。

驚人的發現是:原來閱卷老師自己評分時,分數也會上上下下。直到後來 golden dataset 擴充到 100 筆、每次都跑三輪之後,看得更清楚了:judge 對同一份 note 評三次,算出的整體幻覺率從 2.1% 到 6.3%,差了三倍(若看絕對差異,則相差了 4.2 個百分點)。不只 agent 產出的 note 具有隨機性,即使用是非題限縮了發揮空間,judge 的分數也還是會抖動。
在 golden dataset 擴充到 100 筆後,我決定每次跑分都執行三輪,但標籤與 note 的處理方式不同。後續優化領域會以每筆 issue、每個標籤分別進行多數決,用來平滑 agent 掛標籤時的抖動;postmortem note 則只保留第一個成功 run 的產出,再交給 judge 評三次,四個問題各自取多數決。換句話說,note 分數平滑的是 judge 的不穩定性,並沒有平滑 agent 生成 note 時的隨機性。因此,目前的 note 指標仍只代表 agent 的單次產出;agent 在生成 note 時會有多大的波動,目前並無法透過這套流程量測。

在處理雜訊時,我也發現到,當樣本數少時,一筆的差異就可以造成可觀的百分點浮動,因此,在這種情況下,直接看筆數更容易理解百分比背後的實際差異;除此之外,變化如果在一筆以內的,可以先視為雜訊,不急著把那一筆修到完美的程度。
透過這次的經驗,我了解到在處理自評偏誤之前,處理雜訊要來得更重要。畢竟,當你的尺都在抖動時,不論怎麼測量長度都是沒有意義的。

每次跑分背後的五個座標

每次跑分時,這個分數背後是由五個座標共同決定的:golden dataset 的版本、postmortem agent 的 prompt 版本、postmortem agent 所使用的模型、judge 的 prompt 版本,以及 judge 所使用的模型。

若想要比較兩次的跑分,為了讓分數變化更有機會歸因於單一調整,每次比較基本上只修改其中一個座標,並且透過重複跑分降低隨機雜訊。在上一篇文章提到的 v1 到 v3 裡,改變的只有關於後續優化領域的 prompt,其他座標都沒有改變,所以當分數出現異動時,可以比較有把握地將變化歸因於 prompt;不過,對 note 指標來說,仍要保留單次生成可能造成波動的限制。想像一下,要是泡手沖咖啡時,你一下子改變了咖啡粉的粗細、換了濾紙以及沖泡方式,你要如何確切知道是哪一個變因讓這杯咖啡變得更好喝了?
所以每次跑分時,這五個座標目前位在哪一個位置上,都需要被記錄起來。這樣之後比較時,才能夠查得出「是什麼東西改變,導致這兩次的分數不同?」 不過,最早的三次跑分,其實在 commit 紀錄裡有兩次對不上真正的 prompt 版本。原因是當時是先跑分、再把 prompt commit 上去,因此分數以及當下的 prompt 其實是有誤差的。也是因為這樣,後續我定下了「先 commit prompt 版本再跑分」的這條規則。

申論題的評分重點

落落長地講了一整篇,讓我來簡單地總結一下 postmortem note 的評分重點吧!

  • postmortem note 評分的重點在於「事實對不對」,而不是「跟 golden dataset 的像不像」
  • 閱卷老師(judge)評出來的分數可不可信,是建立在特定組合(這組 judge prompt 與模型)下的,只要其中一個變了,就需要重新評估
  • 在處理偏誤的問題之前,先看一下是不是有雜訊吧

那⋯⋯後續優化領域跟 postmortem note 的 eval 地基都建立好了,接下來總算可以開始認真修 prompt 了吧?
那之後就來講講,當我正式踏上修 prompt 之旅後,遇到了一個棘手的問題:有一個後續優化領域,不論我怎麼修 prompt 都修不好,它的分數永遠都爆炸。

Comments