跳至主要內容

開發紀錄

AI 誤判之後,先撤回結論,再修正證據

從一次文章標題的輸出檢查誤判,說明 AI 協作遇到錯誤時,如何保留原始內容、找出比較規則的問題,並用正反案例確認修正沒有放寬要求。

林予晴
發布
  • AI 協作
  • 錯誤修正
  • 驗證
  • HTML

檢查回報「文章標題不存在」,最直接的反應是去改文章。但如果標題其實已經正確出現在 HTML,只是檢查程式拿錯形式來比較,這個反應就會改掉原本沒有壞的內容。

本站在 2026 年 10 月的筆記輸出檢查裡,曾經遇到這種誤判:標題包含 <button>,HTML 裡保留的是經過跳脫的文字,檢查卻直接搜尋原始標題。沒有找到那串字元,被誤當成沒有輸出標題。

和 AI 一起工作時,我在意的不是它能不能立刻說一句「抱歉,我錯了」,而是它會不會停止沿用錯誤結論,保留現場,再用可檢查的方式修正原因。

先撤回超出證據的那一句

「檢查沒有找到」和「頁面沒有輸出」,中間還隔著比較方法是否正確。

在這個案例裡,失敗結果能先支持的只是:目前的搜尋規則沒有命中。要把它提升成頁面缺少標題,還需要看實際 HTML,確認搜尋對象、文字表示方式與頁面結構。

如果 AI 已經把它說成文章缺漏,就應該先撤回那個判斷。不能繼續以「文章有問題」安排修改,等到最後才把檢查規則的錯誤塞進附註。

撤回也不等於立刻換一個猜測,例如斷言是快取或套件版本造成。比較可靠的做法,是先把已知的範圍縮回來:輸出檢查失敗,原因尚待對照;原稿暫時不動。

把比較差異縮成看得懂的例子

這個案例可以用很小的片段重現。下面沿用現有測試的示例文字,不是另一篇實際文章的標題:

const title = '使用 <button> & links'
const html = '<h3>使用 &lt;button&gt; &amp; links</h3>'

html.includes(title) // false

讀者看到的標題文字可以包含 <button> 與 &,但在這份 HTML 字串裡,它們以 &lt;button&gt; 和 &amp; 表示。拿未跳脫的標題直接做子字串搜尋,結果就不同。

本站後來讓這項比較使用 Astro 的 escapeHTML,將來源標題轉成與輸出相同的文字表示,再進行搜尋。以目前 helper 重現上面的片段,原始比較為 false,經過跳脫的比較為 true;這證明的是這組輸入的比較差異,不是所有頁面都已正確。

這個最小例子讓修正方向變得明確:要調整的是驗證器對文字的預期,而不是拿掉標題裡合法的技術識別字。至於那篇文章應該使用連結還是按鈕,是另一個 HTML 語意問題,不應被輸出檢查的誤判打斷。

正確案例要通過,錯誤案例也要繼續失敗

修正檢查規則時,最容易走偏的做法是把規則放寬,直到這次的案例變綠。

例如,只要某處出現 button 就算通過,確實可能避開跳脫差異,卻已經失去比對完整標題的要求。把所有 HTML 實體一律解碼再比較,也可能混淆原本就想顯示 &lt;button&gt; 這串字面文字的情況。

現有回歸測試因此不只保留一個會通過的例子:

輸入情況 檢查應保留的區別
標題含 <button> 或 &,HTML 正確跳脫 應辨認為文字存在
標題本身就是 &lt;button&gt; 這串字 不能與顯示 <button> 的情況混為一談
HTML 裡真的有一個 button 標籤 不能因此當成出現了同名的字面文字
輸出的是另一個標題 仍然必須拒絕

這些案例是在保護原本的要求。修正完成的意思,不是讓錯誤訊息消失,而是讓原本不該失敗的情況通過,同時留下拒絕真正錯誤的能力。

也要承認這個 helper 的範圍:它檢查的是序列化 HTML 裡有沒有對應字串,不能單獨證明文字位於正確的 h1、頁面只有一個 h1,或整份 HTML 都安全。那些需要另外的結構與輸出檢查。

不要讓「讓測試過」偷偷改變需求

如果當時直接把 <button> 從文章標題刪掉,讀者會失去一個有意義的識別字,驗證器的問題卻仍在。下一篇碰到 & 或其他需要跳脫的內容,還可能再發生相同誤判。

所以遇到失敗時,我會先分開看:產品或內容真的錯了、檢查規則錯了,還是這次環境讓結果不能成立。這不是固定的三選一流程;原因也可能同時存在。重點是不要預先認定被檢查的內容一定有錯。

最小重現用來隔離問題,後續仍要重跑受影響的檢查,讀取真正的輸出。如果只是改了一份測試預期,卻沒再看原本被判定有問題的頁面,就還沒有把修正接回使用者在意的結果。

修正回報要取代舊結論,不只多一段解釋

依這個案例,可以把回報整理成下面這樣。這是寫法示例,不是當時的逐字對話:

先前把標題檢查失敗判定成文章缺漏,這個結論不成立。實際差異是來源文字與 HTML 跳脫形式;原稿保留,修正比較規則,並確認正確文字、實體字面值與錯誤標題仍能被區分。這項修正不代表整頁的結構檢查可以省略。

這段說明讓人知道原判斷已被撤回、真正原因在哪裡,以及修正沒有證明什麼。若還沒有重跑完整檢查,也應該把那個狀態說出來,不能提前補上一句「現在全部正常」。

事實、推論與未知處理的是怎麼讀一份結論;這個案例再往前一步:當產生結論的檢查本身有錯,就要修正它,而不是要求正確內容配合它。

一次修正也不能證明 AI 之後不會再犯錯。可以留下的是能重現的差異、保護需求的回歸案例,以及一份已經更新、不再讓人沿用舊判斷的說明。