Files
pop-fem-audit/docs/output-validation.md
T
2026-08-19 20:01:59 +08:00

165 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LLM 輸出的契約查核
2026-08-06 量測。對象為步驟 3 的三份執行歸檔
`data/runs/3a-code/run1``run3`,共 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-abuse``reputation-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"]
```
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-84**run2`relationship-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-376**run2`heartbreak-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 字元(如 `Tonight`
`It 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 輸出的確定性步驟須驗證其契約,而非
信任之——計票須對照詞彙表、失敗須出聲、丟棄須計數。