楊本顥筆記・知識・作品

首頁 / 筆記

NOTE · · 應用於 教學出卷助手

把流程寫成狀態機,不讓模型決定下一步

拆一份考卷要經過八個步驟。我沒有讓 LLM 自己決定順序,而是把流程寫成程式控制的狀態機,模型只負責單一步驟裡的判斷。

看這篇筆記應用的作品
情境
上傳一份考卷 PDF,系統要把它變成可搜尋、可組卷的題庫:拆題、去重、分類章節、檢查公式、比對原卷、驗算答案。常見的做法是給模型一組工具讓它自己編排,但那樣失敗的時候沒有人知道它停在哪裡,而且同一份卷跑兩次可能走不一樣的路。
做法
流程是程式寫的狀態機,八個節點固定順序:extract → dedup0 → classify → lint → source_check → verify → dedup1 → save。節點之間是伺服器端的閘門,推進與放棄由程式決定,LLM 只在單一節點內做判斷。每個 agent 都是純函式,輸出先過 JSON Schema(ajv)與章節白名單驗證才往下走——模型講錯章名、少欄位,在進資料庫之前就被擋下來。
部分入庫
失敗不是整批退回。通過的題直接入庫,沒通過的附上 12 種複核原因之一,停在人工複核佇列——一份十題的卷可以七題入庫、三題待確認,而我看得到那三題各自卡在哪一個閘門、為什麼。(補充一個限定:這台純 CPU 的機器以 OCR 為主拆題,沒有第二條路可以互相比對,所以我把它設成每一題都要人工確認;上面那種分流是雲端模型模式下的行為。)
便宜的路也要有防線
拆題模型其實會順手給出章節與信心值。信心夠高就直接採用、省掉一次分類呼叫,這是零成本閘門。但它會猜錯:有一題「物體由靜止出發,以 2 m/s² 的等加速度直線前進,求 5 秒後的位移」被標成「位能與能量守恆」,信心 0.9,閘門直接放行。修法是加一道證據否決——模型給的章若在否決表內、而題幹連一個那一章的線索都沒有(功、能量、高度、彈簧、重力場……),就不採用這條便宜的路,改走完整的分類。驗證時刻意以正解當成模型的答案跑過 classify golden 92 題、化學 golden 24 題與 fixture 62 題:誤否決 0。
中斷之後要接得回去
本機模型跑一題要好幾分鐘,所以「中途關掉電腦」是常態而不是例外。worker 認領工作用 FOR UPDATE SKIP LOCKED 加租約,兩個 worker 會互相禮讓,前一輪沒做完的租約到期後會被重新認領。桌面版關視窗時可以選擇「現在放棄」:中止在途節點、只放掉自己的租約就結束,下次開啟立刻重新認領,不必等租約自然過期。
邊界
這套設計換來的是可預測與可診斷,代價是不靈活:要支援新的題型或新的檢查,得自己加節點、寫閘門、補測試,不是改一段 prompt 就好。另外證據否決目前只蓋一章(物理的位能與能量守恆),因為那一章的題幾乎一定會寫到位能的來源,線索列得出來;動量守恆與碰撞那一章我刻意不收——反衝題的寫法列舉不完,硬寫規則只會製造誤判。

這篇筆記的實際應用

數學試卷與寫有「2 小時 → 數分鐘」的便條紙,教學出卷助手概念封面

教學出卷助手

把散落在考卷裡的題目,變成能依學生需求組卷的題庫。

看個案研究 →