加班有據開發筆記(二):讓 AI 只負責「看」,對錯留給規則
上一篇寫引擎,這一篇寫資料怎麼進來。引擎再正確,餵進去的工時是錯的,算出來的就是錯的。而真實世界的打卡資料,比我想像的髒很多。
1. 真實的打卡資料長什麼樣
我原本以為會拿到一個乾淨的 CSV。實際上會遇到:Big5 編碼打開全是亂碼、日期寫 113/07/15 的民國年、夜班下班時間寫 02:00 但其實是隔天、一天六個欄位(上班、下班、休息開始、休息結束……)每家打卡機排列都不一樣。
所以我做了一個欄位對應精靈:匯入時讓使用者告訴我「這欄是上班、那欄是下班」,程式負責處理編碼、民國年、跨午夜。另外提供一份官方範本,下載時就預填好整個月的日期,表頭相符就直接跳過對應——多數人走這條路最快。
2. 很多老闆手上只有一張紙
更常見的情況是:根本沒有檔案,只有一張打卡表的照片,或是手寫的班表。這是我決定接 AI 的原因——拍照上傳,讓模型把表格裡的時間讀出來。我用 Gemini 的多模態能力,並且做了多模型備援:一個模型出錯或額度用完,自動換下一個。
金鑰一律藏在伺服器端,前端只打自己的 API。這是基本功,但很多人第一版會直接把金鑰放前端,我也差點。
3. 最重要的決定:模型只抄,不判斷
第一版我讓模型一次做完所有事:讀出時間、配對上下班、扣休息時間、算當天工時。結果是——大部分對,偶爾錯,而且錯的時候我看不出來它是哪一步錯的。
在一個「金額必須正確」的產品裡,這不能接受。所以我重新設計:模型只負責把原始時間原封不動抄下來,其餘全部交給程式端用確定性的規則處理——上下班怎麼配對、一天超過 9 小時的全天班扣 60 分鐘休息、不到 9 小時照實填並醒目提示「未扣休息」、奇數筆打卡一律標記請人確認。
AI 的工作從「判斷」降級成「看圖抄字」。這不是不信任 AI,是把可驗證的部分留在可驗證的地方。
4. 低信心的格子要標紅,而且要並排給人看
辨識結果不會直接丟進引擎。使用者會看到照片與辨識結果並排,信心不足的格子標紅,一眼看過去哪裡要改。這個畫面很樸素,卻是整條流程裡最重要的一步:AI 負責省掉 90% 的打字,人負責最後那 10% 的確認。
我後來發現,這個「並排確認」反而讓使用者更信任工具——因為他看得到機器在哪裡不確定。
5. 接 AI 的一個原則
做完這段,我給自己留了一句話:在輸出必須正確的系統裡,讓 AI 做它擅長的感知,把判斷留給規則,把確認留給人。
AI 很強,但強的方式不是「什麼都交給它」。下一篇要寫錢了——金流接上去的那幾天,我踩到的洞比寫引擎還多。