六百萬筆職缺,現已上架 Hugging Face
freehire 從數十個 ATS 平台匯入職缺,把它們正規化成統一 格式,再讓每一筆跑過 facet pipeline——有些是純字典查詢,有些是 LLM 呼叫。這次匯出的原始計畫其實範圍更小:拉出原始職缺資料,在上面訓練一個小型分類器,看看能不能用比每筆職缺一次 LLM 呼叫更便宜的方式,產出資歷與類別的標註。結果我們反而發現,現行已上線的字典加 LLM pipeline 表現勝過從零開始的分類器,領先幅度大到目前不值得把分類器做完。所以,與其給模型,不如直接給資料:freehire jobs on Hugging Face,共 6,041,471 筆職缺,歡迎自由探索。
一列裡有什麼
每一列就是一個 JSON 物件:原始職缺——職稱、公司、地點、描述、URL、來源、posted_at——再加上 pipeline 從中衍生的所有 facets。各個 facets 的衍生方式並不一致,而某個欄位是用哪種方法產出的,也代表著你應該多信任它一些:
- 純字典、決定性:
skills、seniority、category、work_mode、posting_language、employment_type、education_level、english_level、experience_years_min。這些欄位來自別名表與職稱/描述的樣式比對——沒有 LLM 參與其中,沒有 hallucination 風險,但也只能涵蓋字典詞彙範圍內的東西。沒列在字典裡的技能或不常見的職稱,就完全不會被標註;它也不會被猜測標註。 - 字典優先、LLM 補完:
countries、regions、cities。地點字典會釘住它認得的項目;LLM 只負責補上字典無法歸類的其餘部分(大多數是語意模糊或非正式寫法的地點)。只要字典有答案,就一律以字典為準。 - 純 LLM:
salary_min、salary_max、salary_currency、salary_period。職缺裡的薪資寫法五花八門——範圍、單一數字、時薪或年薪、十幾種幣別——而且這部分沒有字典可用。這是唯一一個你必須信任模型對文字的解讀、而非查表結果的 facet 群組。
公司資料列帶有各自的 facets——industries、hq_country、規模與類型分組、已知網域,以及適用時的 YC 梯次/狀態/階段——這些是從 freehire 的公司目錄併入,而非逐筆職缺重新衍生。
沒包含哪些內容
從未公開的職缺——貼上的履歷、有人用 freehire 的調整工具跑過一次的零散 JD 文字——會直接排除;它們本來就不是職缺。另外還有一列被剔除,但原因與資料品質無關:有一筆職缺的描述在 Postgres 儲存中實體遺失(一塊資料庫無法取回的 TOAST chunk),導致該筆職缺完全讀不到。六百萬列裡犧牲了一筆,與 pipeline 完全無關。
格式
20 個 gzip 壓縮的 JSONL 分片,依內部列範圍切分而非合併成單一檔案——串流更順,中途被中斷時要重試某個分片也更方便。
試試看
如果你想在真實的就業市場文字上訓練模型、比較不同分類方法與我們做法的差異,或只是想看看六百萬筆職缺實際上都寫了些什麼——資料集就在這裡: huggingface.co/datasets/istrelov/freehire-jobs。 產生這份資料集的 pipeline 也有開源,網址在 github.com/strelov1/freehire。發現了什麼有趣的東西,或用它做出了什麼嗎?我很樂意聽你分享——聯繫我最快的方式是 LinkedIn。