Files
pop-fem-audit/docs/output-validation.md
T
imacatandClaude Opus 5 85d776da8b Renumber the pipeline substeps to match the paper (5-1 becomes 5a)
prompts/ and runs/ move by git mv; zero padding dropped; the
arbitration and LLM-merge rows in the cost ledger carry no new
name -- their step column reads 已廢棄 with the original name
kept in a new last column.  Archived meta.json files and past
decision-log entries keep the names they were written with.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 23:37:32 +08:00

6.6 KiB
Raw Blame History

LLM 輸出的契約查核

2026-08-06 量測。對象為步驟 3 的三份執行歸檔 runs/3a-code/run1run3,共 883 首歌、44,149 筆標籤 指派、44,146 句引述。歌詞以模型實際看到的那一份為準,即 tools/instance/llm-input-code.jsonl。)

定義檔 prompts/3a-code.md 對輸出下了四條明確要求:只用 給定的碼且拼寫照給、每個標出的碼恰引一行歌詞、引述逐字、 輸出為合法 JSON 且無其他文字。本檔記錄這四條各自被遵守到 什麼程度。

詞彙表的遵守

詞彙表為 101 個碼。三次執行共出現 13 筆詞彙表外的碼 分屬 8 個字串:

字串 出現次數
alcohol-and-substance-use 6
sacrifice 1
travel-and-adventure 1
reputation-and-gossess 1
sacrifice-and-surrender 1
guilt-and-remorse 1
warning-and-danger 1
manipulation 1

其中兩個字串像是拼寫失誤(alcohol-and-substance-use 之於 alcohol-and-substance-abusereputation-and-gossess 之於 reputation-and-gossip),其餘六個看來是模型另行造出 的碼。

alcohol-and-substance-use 通過了多數決兩次——song-500 兩票、song-750 三票——因此未經處理的計票會在定案表寫出 第 102 個碼。

拼寫失誤的機制有紀錄可循。 輸出依字母序排列,錯拼的鍵 落在正確鍵該在的位置,其值為空陣列,而正確的鍵在同一份 輸出的稍後處重新出現、帶著引述:

song-500 run1: -use=[]  -abuse=["Smokin' the Zaza, ..."]
song-500 run3: -use=[]  -abuse=[同一句]
song-750 run3: -use=[]  -abuse=["I got a thing for the hard
                                 liquor on ice"]

模型寫錯後綴、已輸出的 token 收不回,遂以空陣列收束該鍵, 再於正確的鍵補上引述。song-750 的 run1 與 run2 則整筆使用 錯拼的鍵並附上引述,故該首的三票分裂於兩種拼寫之間。

引述的存在

三次執行共 3 筆空引述,全部是上述錯拼的鍵所留下的空 陣列。其餘 44,146 筆指派皆附引述。

引述的逐字性

逐層放寬比對,每一層新命中的數量:

判準 筆數 佔比
1 完全逐字為歌詞的子字串 43,098 97.63%
2 加上標點形態正規化 461 1.04%
3 再加上空白收合與大小寫折疊 421 0.95%
4 再加上去除標點 39 0.09%
5 仍無對應 127 0.29%

第 2 層全數為同一現象:歌詞用彎引號 U+2019,模型寫成直 引號 U+0027。全庫僅 61 首歌使用彎引號,屬來源排版差異。

第 3 層以句首大寫為主——356 筆大小寫差異中有 355 筆只差 第 0 個字元,即模型自句中取材後將首字母改為大寫。

第 5 層的 127 筆歸為 71 組相異的(歌, 引述),其中 15 組 三次執行皆出現、19 組出現兩次,故多數為系統性而非抽樣 雜訊。分類如下:

樣態 筆數
A 略去括號內的即興插話,其餘逐字 34
B 跨行拼接:字詞俱在,但非如引述般相連 16
C 首尾增刪一詞 24
D 轉錄差異:方言拼寫正規化,或逕自修正歌詞的錯字 22
E 同形異碼字污染 6
F 換詞但語意不變 14
G 換詞且語意改變 9
H 全無對應物 2

H 類:兩筆並非歌詞

song-513 的 impermanence,run2 與 run3 的引述皆為字串 love-as-fleeting-and-transient——那是同一份碼表中另一個 碼的名字,非歌詞。該首歌詞不含 fleeting 或 transient。 run1 未標此碼。屬槽位填錯,非杜撰。

G 類:九筆改動了語意

其中兩筆對本研究的判讀影響最大:

  • song-84run2relationship-complications):引述 為 Boys seem to like the girls / Who don't appreciate / All the money and the time that it takes。歌詞中 Boys seem to like the girls 之後接的是別的句子,而 Who don't appreciate 起的兩行屬於四行之後的 Girls seem to like the boys。模型將兩段焊接,主張的 性別因此顛倒
  • song-376run2heartbreak-and-grief):人稱代名詞 對調,願望的方向因而相反。

E 類:同形異碼字

6 筆引述含西里爾字母而其歌詞為純拉丁字母,例如 song-113 的 TекU+0435、U+043A)對應歌詞的 Tek、 song-622 的 IбаU+0431、U+0430)對應 Iba。語意無損, 但逐字比對會判為不符,讀者複製該引述亦會得到損壞的字串。

引述的形狀

  • 跨行3,740 句引述含換行(8.47%),其中跨兩行 3,528、三行 168、四行 41、五行 3。其中 3,615 句仍為歌詞 的逐字子字串,即誠實的多行引述。定義檔要求恰引一行, 模型約每十二句有一句將對句視為一行。
  • 共用:5,132 句相異引述各自撐起兩個以上的碼,涉及 10,961 筆指派(24.8%)。單句最多同時撐起 7 個碼。
  • 過短43 句引述短於 12 字元(如 TonightIt ain't me),皆為逐字,惟作為證據甚薄。

三次執行之間的差異

引述數 第 1 層 2 3 4 5
run1 14,711 14,363 153 147 12 36
run2 14,719 14,368 152 139 12 48
run3 14,716 14,367 156 135 15 43

偏離率 2.37%、2.39%、2.37%。三次執行在此指標上難以區辨。

第 5 層的 127 筆散布於 62 首歌、47 個碼,無明顯集中;居前 的碼即高頻碼。

兩類違規

上列樣態分屬兩類,對策不同。

詮釋分歧:比率高且穩定,模型對規則自有一套說得通的 讀法——「一行」視對句為一個意思單位(8.47%)、「逐字」 容許排版形態與句首大寫(2.37%)。此類可藉修訂定義檔壓 低:仲裁步驟曾實測 644 筆中 13 筆輸出夾帶散文,定義檔加上 「JSON 之外不得書寫任何文字」後重跑降至 0(詳見 decision-log.md 2026-08-06)。

機械性失手:比率極低(0.007%–0.029%),如錯拼的鍵、 空陣列、把碼名填入引述槽。song-500 的紀錄顯示模型於生成 中途已察覺並自行補救,惟已輸出的 token 無法收回。

單次執行觀察到零違規,不等於違規率為零:仲裁步驟的 644 筆與編碼步驟的 44,146 筆規模相差近七十倍。

對管線的意涵

每一條明確的格式要求都有非零的違規率,且 temperature=0 未 消除之。因此消費 LLM 輸出的確定性步驟須驗證其契約,而非 信任之——計票須對照詞彙表、失敗須出聲、丟棄須計數。