楊本顥筆記・知識・作品

首頁 / 作品 / jobradar

個人專案 · 資料整理與 LLM 驗證 01 / TL;DR

JobRadar 職缺整理工具

整理求職平台的職缺與技能要求,將模型判斷連回原文,讓每天找工作時多一份可以核對的資料。

PythonSQLiteOllama資料管線pytest
看架構流程 ↓操作影片位置 ↓
JobRadar 職缺整理工具的主題示意插畫
專案主題示意圖 · 非實際操作畫面

操作影片

跟著畫面走一遍

從職缺清單、技能判斷到原文核對與報告查看。

操作影片準備中

錄製完成後會放在這裡。

02 / WHY

職缺很多,讀完還要重新整理

找職缺時,我會反覆比較職稱、工作內容與技能要求。相同關鍵字不一定代表相同工作,列表摘要也常常不足以支持判斷。

這個工具先服務自己的資料整理流程:留下來源、整理變動,再請模型協助判讀。我更在意判斷能不能回頭查證,而不是只得到一個看似精準的分數。

來源找得到
職缺與判斷保留關聯,方便回到原文查看。
新舊分得開
追蹤內容與狀態,避免摘要覆蓋完整描述。
判斷可核對
檢查引用是否存在;投遞決定仍需本人確認。
03 / ARCHITECTURE & CHOICES

架構與技術選型

從輸入到結果

由上往下沿藍色箭頭閱讀,右側是各階段的工作。小螢幕可在圖內左右滑動。

JobRadar 職缺整理工具架構流程收集職缺資料 → 整理與補齊詳情 → SQLite 保存版本 → LLM 判讀與引文檢查 → 清單與整理報告01收集職缺資料保存來源與擷取狀態02整理與補齊詳情區分列表摘要和完整工作內容03SQLite 保存版本職缺、快照與處理狀態04LLM 判讀與引文檢查記錄模型、提示版本及引用結果05清單與整理報告回看原文,由本人判斷下一步
圖中聚焦資料整理與可核對的判讀流程。模型結果帶有驗證狀態;引用檢查通過也不代表語意判斷一定正確。

SQLite 支援本機工作流

資料與狀態集中在本機,部署簡單;但模型呼叫時間很長,所以資料庫交易要保持短小。

取捨:多個工作同時寫入時仍要處理競爭,不能把單檔資料庫當成沒有並行問題。

Ollama 模型加上機械檢查

使用本機模型協助整理文本,對引用原文做可重複的逐字驗證,保存模型與提示版本。

取捨:逐字存在只能證明出處,不能證明推論成立;模型品質仍需人工標註資料評估。

狀態守衛與唯一約束

排程與手動操作可能同時發生,用條件更新及資料庫唯一性約束保護最後的寫入。

取捨:跨行程鎖只能協調工作順序,資料正確性仍要由每次狀態轉移自己保證。

04 / DEEP DIVE

兩個實作差異與內容

A讓模型的引文回到原文裡

模型輸出可以很流暢,卻引用了一句原文沒有的話。把「有引用」與「引用真的存在」分成不同狀態,才能避免將格式完整誤認為內容可靠。

做法差異 · A只看模型輸出的等級與說明。

本專案採用 · B每筆判斷保留引文檢查結果,失敗時可追查。

核心邏輯示意 · Python 風格偽程式碼,含說明註解;非原始碼節錄
# 示意:缺資料與比對失敗是不同狀態
if not quote or not description:
    quote_valid = None
else:
    quote_valid = quote in description
# True 只表示逐字存在,不能保證語意判斷正確
save_result(level, quote, quote_valid, model_version)

保留未能驗證的狀態,避免把缺少引文當作已通過。下一層仍需人工檢查引文是否真的支持該技能判斷。

B等模型的時候,不占住資料庫寫鎖

模型可能需要數十秒才回覆。在等待期間保留 SQLite 寫交易,其他工作就可能被擋住。先讀取快照,完成推論後,再用條件更新確認狀態仍然符合。

做法差異 · A開啟寫交易後呼叫模型,其他寫入一起等待。

本專案採用 · B模型在交易外執行,寫回時以原狀態作守衛。

核心邏輯示意 · Python 風格偽程式碼,含說明註解;非原始碼節錄
# 示意:讀取完畢即結束資料庫交易
snapshot = read_job(job_id)
result = call_model(snapshot)
# 短交易寫回;期間狀態改變就放棄這次結果
changed = update_if_state_matches(
    job_id, expected=snapshot.state, result=result
)
if not changed:
    discard_stale_result()

條件更新避免覆蓋其他操作。跨行程協調、短交易、狀態守衛與唯一索引各管一層,不能只加一把鎖就視為完成。

05 / TROUBLESHOOTING

遇到的問題

看似完整的內容,其實只是摘要

發現:104 列表內容可能是關鍵字附近的短片段,不能直接當完整工作說明。

排查與處理:補抓詳情後記錄完成時間,後續列表更新不可再用摘要覆蓋,避免模型輸入倒退。

程式能跑,不代表判讀已經可靠

發現:引文不在原文、缺少人工標註,都會讓漂亮的分類統計失去依據。

排查與處理:將引文檢查與模型品質分開量測。歷史紀錄沒有完成金標準驗證,因此不把整理量當分類準確率。

06 / IMPACT & TAKEAWAYS

成果

引用原文檢查:1,434 筆歷史 Lv1+ 樣本

有出處仍不代表推論正確;這張圖呈現引用檢查,沒有衡量技能分類的準確率。

以下為 2026 年 9 月整理的歷史開發紀錄;數據依各自的樣本與量測情境解讀,並非即時統計。

5,489 筆 / 18 天

歷史職缺整理量

2026-09-01 快照,累積 18 天資料。數量說明資料流程的使用範圍,不代表涵蓋所有職缺或每筆都完整。

537 / 1,434

引用未逐字對上的樣本

歷史 Lv1+ 子集有 37.4% 引文不在原文。這是引用檢查失敗比例,不是所有模型輸出的幻覺率,也不是分類錯誤率。

尚未完成

人工金標準驗證

該次快照沒有完成標註資料,無法報告可信的分類 accuracy、macro-F1 或一致性指標。引用通過也不能取代這一步。

回顧

我學到的是讓結果帶著證據與狀態一起留下來。若重新安排,會先做小批人工標註,再擴大每日處理量,讓模型更換前後有共同的比較基準。

07 / ROADMAP

未來展望

以下是依目前限制整理的後續方向,尚未完成,也尚未排定時程。

待規劃 · 01

先完成一組人工標註資料

從不同來源與技能等級抽樣,先盲標,再整理容易分歧的判準,避免被模型既有答案影響。

怎麼確認有改善:分開量測分類表現、標註一致性及引文有效率,附上樣本數與錯誤分布。

待規劃 · 02

把擷取品質也放進報告

清楚顯示詳情是否補齊、最後成功時間與來源失敗狀態;遇到來源限制時降低請求並停止無效重試。

怎麼確認有改善:讓讀者能判斷資料新鮮度,不把擷取中斷造成的缺漏誤讀成職缺市場變化。

待規劃 · 03

比較模型與提示版本

在同一組已標註資料上比較模型及提示,保留成本、耗時和不合格原因。

怎麼確認有改善:以可重現的品質差異決定更換,而不是只看回覆速度或少數成功範例。