Michael Jackson 事件 — 一次「假滿分」的 debugging 全記錄
語意搜尋 demo 站上,搜「Michael Jackson」,第一名是一部戰爭犯罪片, 分數還標著 100%。這頁記錄從現象到根因、到量測校準、到修法的完整過程。
1. 現象

當時的實際畫面:第一名是戰爭犯罪片《一戰再戰》,標 100%。
- 片庫 600+ 部全是電影,沒有任何 MJ 相關內容(演唱會 / 音樂紀錄片皆無)
- 查詢卻回了一部戰爭犯罪大片,顯示 100% 匹配
- 卡片上的標籤(驚悚 / 犯罪 / 逃亡)跟 Michael Jackson 毫無關聯 — 使用者完全無從理解
2. 根因拆解
(a) 100% 是顯示假象。 排序內部分數是相對值 — RRF 融合分經 min-max 正規化, cross-encoder 混分也是 — 所以「這批裡的第一名」永遠被映射成 1.0。 就算整批都不相關,第一名照樣顯示 100%。
(b) 為什麼是這部片? 查詢經 LLM 展開時,HyDE 會生成一段「假想劇情」—— 對 Michael Jackson 它想像出「傳奇人物的崛起與抗爭」式敘事,embedding 後拿去召回, 語意上漂向片庫裡戲劇張力最強的得獎片;此外 LLM 也展開出「美式」標籤, 讓帶有 american 標籤的得獎大片再吃到一次條件加分。
3. 量測:先確認「有沒有真命中」量得出來
拿使用者原句向量對片庫的最佳 cosine(不能用 HyDE 向量 — 那是照著劇情寫的, 天生偏高),好查詢與壞查詢之間有清楚的 gap:
| 查詢 | top-1 cosine |
|---|---|
| 韓國犯罪驚悚片 | 0.626 |
| 母親節溫馨片 | 0.603 |
| family adventure | 0.578 |
| dark comedy | 0.531 |
| 類似寄生上流的片 | 0.488 |
| Michael Jackson | 0.371 |
→ 用這個 cosine 分三段信心(門檻 0.52 / 0.45),做成熱載設定隨時可調。
4. 修法(演進到三段信心帶)
- 三段信心(cosine):用最佳原句 cosine 分 high(≥0.52)/ mid(0.45–0.52)/ low(<0.45)。 low → 亮警示「片庫中沒有高度相關的結果」,仍給推測結果供編輯延伸發想。
- 天花板帶誠實訊號:high 頂 95% / mid 頂 68% / low 頂 42% — 第一名的 % 反映 「片庫到底有沒有這片」,永遠不再出現假滿分;條件加分也推不回去。
- CE 不當絕對品質:後來實測 cross-encoder 對無關片照樣給高分(MJ 頂分 0.88), 所以 CE 只決定排序,信心一律錨定 cosine。
- 對整個候選池 min-max(非顯示切片)→ 同一部片換顯示筆數,分數不變。
- 可解釋卡片:每個結果標明「符合哪些條件」與「怎麼找到的(語意/推想/字面)」。
完整設計與校準見 誠實匹配;決策記錄見 ADR 0009。
5. 結果
修完後同一個查詢:歸 low 段、黃色警示出現、分數封頂 42%、 而且因為「音樂 / 舞蹈」條件加分開始正確作用,排上來的反而是音樂相關電影 — 比修之前更合理。誠實機制沒有犧牲體驗,反而讓推測結果變得可用。

帶走的教訓
- 相對分數絕不能直接當絕對信心展示 — min-max 後的第一名永遠是 1.0
- 「多一層 AI 打分」不等於有了絕對品質 — cross-encoder 對離題片也給高分(MJ 0.88),只能信它的排序,不能信它的數值
- 生成式查詢擴展(HyDE)在 out-of-domain 查詢上會「幻想出」漂移向量, 信心判斷必須錨定使用者原句
- 門檻不用猜 — 拿真實查詢量一次,gap 自己會說話
- 「誠實告訴使用者查不到」是功能,不是缺陷