TalentX Tech Blog

Tech Blog

MLX-LMによるGPT-OSSファインチューニング実践

機械学習エンジニアの奥村です。
今回は、Apple Silicon Mac上でLLMのファインチューニングを行い、HR(人事・採用)領域に特化したモデルを構築した取り組みを紹介します。

背景:汎用LLMの限界

現在のLLMは汎用的に設計されているため、特定のドメインでは期待通りの性能を発揮しないことがあります。

例えば、求人と候補者のマッチング評価を依頼した場合、汎用LLMは一般的な営業スキルの有無を判断できます。
しかし「HRテック業界での採用マーケティング経験」や「リファラル採用の実務知識」といった業界固有の観点での評価は難しいことがあります。

職業に関する質問でも違いが出ます。

質問 汎用LLMの回答例 HR特化LLMに期待する回答
航空整備士の仕事は? 飛行機を直すことです。 日常点検からライン整備、ドック整備まで多岐にわたり、確認主任者の許可がないと飛ばせない責任ある仕事です。
採用担当者のスキル要件は? コミュニケーション能力が必要です。 タレントアクイジション、採用MA運用、リファラル採用施策の立案など、戦略的な採用マーケティングスキルが求められます。

この課題に対し、LLMにドメイン知識を注入するファインチューニングを試みました。

技術選定

ベースモデル:GPT-OSS 20B

OpenAIが公開したGPT-OSSの20Bパラメータモデルを使用しました。日本語性能が高く、かつオープンソースで利用可能な点が選定理由です。

モデルはLM Studioからダウンロードしました。

lmstudio.ai

学習フレームワーク:MLX-LM

Apple Silicon向けに最適化された機械学習フレームワーク「MLX」のLLM向けライブラリを使用しました。
M4 Max MacBook Pro(RAM 128GB)での学習を想定しているため、CUDA環境ではなくMLXを選択しています。

手法:LoRA

フルファインチューニングはリソース的に現実的ではないため、LoRA(Low-Rank Adaptation)を採用しました。一部のパラメータのみを学習することで、効率的にドメイン知識を注入できます。

データセットの準備

データソース

独立行政法人労働政策研究・研修機構(JILPT)が公開している「職業情報データベース(日本版O-NET)」を使用しました。職業情報提供サイト(job tag)より2025年11月18日にダウンロードした「解説系ダウンロードデータ ver.6.00」です。

このデータには541職種について、以下の情報が含まれています。

項目名 内容例(航空整備士)
D列 職業名 航空整備士
AR列 どんな職業か 航空機を構成する機体・エンジン・装備品が所定の強度や精度を保ち、正しく機能するように点検、保守する作業を行う...
AS列 就くには 一等航空整備士、二等航空整備士等の国家資格取得が必要...
AT列 労働条件の特徴 勤務形態は交代制が一般的。屋外作業もあるため天候の影響を受ける...
BO〜CW列 関連資格 一等航空整備士、二等航空整備士、航空工場整備士 など

学習データ形式

HuggingFace互換のmessages形式でJSONLファイルを作成しました。

{"messages": [{"role": "user", "content": "航空整備士はどんな職業ですか?"}, {"role": "assistant", "content": "航空機を構成する機体・エンジン・装備品が..."}]}
{"messages": [{"role": "user", "content": "航空整備士に就くにはどうすればいいですか?"}, {"role": "assistant", "content": "一等航空整備士、二等航空整備士等の..."}]}
{"messages": [{"role": "user", "content": "航空整備士の一般的労働条件は?"}, {"role": "assistant", "content": "勤務形態は交代制が一般的..."}]}
{"messages": [{"role": "user", "content": "航空整備士で取得できる資格を教えてください"}, {"role": "assistant", "content": "一等航空整備士、二等航空整備士、航空工場整備士..."}]}

各職業について4種類の質問パターンを作成し、合計1,977件のデータセットを構築しました。

用途 件数
訓練データ 1,581
検証データ 396

トークン数の分布確認

max_seq_lengthの設定のため、データセット内のトークン数分布を確認しました。

データセットのトークン数分布

大半が2,048トークン以内に収まっているため、max_seq_lengthは2,048に設定しました。3,000トークンを超えるデータが1件ありましたが、今回は対象外としています。

補足: 今回はデータ拡張(Chain-of-Thoughtによる要約・口調変換など)を行わず、元データをそのまま使用しました。これはデータ加工なしの最小構成での効果を確認するためです。

実験設定

設定ファイル

以下の config.yamlで学習を実行しました。

# モデル設定
model: "./mlx_test/mlx_model"
train: true
fine_tune_type: lora

# データ設定
data: "./mlx_test/data"
seed: 42

# 学習設定
num_layers: 16
batch_size: 4
iters: 800  # 約2エポック相当
learning_rate: 1e-5
max_seq_length: 2048

# 評価・保存設定
steps_per_report: 10
steps_per_eval: 100
save_every: 100
val_batches: 2
adapter_path: "adapter"

# LoRA設定
lora_parameters:
  keys: [
    "model.layers.7.mlp.experts.gate_proj",
    "model.layers.7.mlp.experts.up_proj",
    "model.layers.7.mlp.experts.down_proj",
    "model.layers.15.mlp.experts.gate_proj",
    "model.layers.15.mlp.experts.up_proj",
    "model.layers.15.mlp.experts.down_proj",
    "model.layers.23.mlp.experts.gate_proj",
    "model.layers.23.mlp.experts.up_proj",
    "model.layers.23.mlp.experts.down_proj"
  ]
  rank: 8
  scale: 8.0
  dropout: 0.0

# 学習率スケジューラ
lr_schedule:
  name: cosine_decay
  warmup: 80
  warmup_init: 1e-7
  arguments: [1e-6, 800, 1e-7]

LoRAターゲット層の選定について

今回はMLP expert層の7層目、15層目、23層目をターゲットにしました。

この選定は、複数パターンを試した中で最も精度が良かった組み合わせです。試行の背景には以下の仮説がありました:

  • 前半層(7層目付近): 基本的な概念・語彙の表現に関与
  • 中間層(15層目付近): 推論・関係性の処理に関与
  • 最終層(23層目付近): 出力の整形・タスク固有の処理に関与

なお、一般的なLoRAの実践では全Attention層やLinear層をターゲットにすることが多いですが、GPT-OSSのMoE(Mixture of Experts)アーキテクチャに対してMLX-LMの自動モジュール検出が機能しなかったため、手動で層を指定する必要がありました。結果として、MLP expert層に絞った構成が本タスクでは有効でした。

実行

学習は以下のコマンド1行で開始できます。

uv run mlx_lm.lora --config mlx_test/config.yaml

学習時間とリソース使用量

  • 所要時間: 約2〜3時間(800イテレーション)
  • メモリ使用量: 平均約94GB
  • GPU使用率: ほぼ100%

GPU使用率

M4 Max MacBook Pro(RAM 128GB)で問題なく学習が完了しました。

評価

評価タスク

実際の採用業務に近いタスクとして、「求人と候補者のマッチング評価」を設定しました。弊社の求人とサンプルデータ10件を用い、人事担当者の判定結果との一致率を比較しました。

評価条件

  • プロンプト: Before/Afterで同一のプロンプトを使用
  • 推論パラメータ: temperature=0(決定的な出力)
  • 評価基準: 人事担当者の合否判定との一致

結果

ID 人事判定 Before After Before一致 After一致
1 合格 不合格 B(合格)
2 不合格 B(合格) 不合格
3 合格 B(合格) B(合格)
4 合格 B(合格) B(合格)
5 合格 D(不合格) C(不合格)
6 合格 C(不合格) 不合格
7 不合格 不合格 D(不合格)
8 不合格 A(合格) 不合格
9 不合格 B(合格) C(不合格)
10 不合格 不合格 不合格

精度サマリー

モデル 精度 一致数
Before(ベースモデル) 40.0% 4/10
After(ファインチューニング後) 80.0% 8/10
改善幅 +40.0pt +4件

ファインチューニング後のモデルは、訓練データより得られた職種知識により、人事の判定結果との一致率が40%から80%へと倍増しました。

判定理由の変化(例)

ファインチューニングにより、判定理由がどのように変化したかを示します。以下は実際の評価ログからの抜粋です。

例:ID 9(B→C、不合格者の誤判定を修正)

人事判定: 不合格

Before(ベースモデル)の判定:

総合評価: B(適合)

  • SaaS・業務支援ツールの営業経験があり、顧客課題を構造的に捉えて提案するスキルは、TalentXの「MyTalent」や「MyRefer」などのサービスを顧客に提案する際に活かせる。
  • 営業チームをマネジメントした経験や、SFA・Excelを用いた業務改善は、営業プロセスの最適化やデータドリブンな採用マーケティングに貢献できる。

問題点: 汎用的な営業スキル(SaaS営業、チームマネジメント)を評価しているが、HR業界・採用領域の専門知識の有無を十分に考慮していない。

After(ファインチューニング後)の判定:

総合評価: C(条件付き適合)

  • 直接的なHRテック経験が無い点はマイナス要因。
  • 採用マーケティング(リファラル採用・タレントプール・採用MA)に関する実務経験が見当たらない。

改善点: 求人が求める「採用マーケティング」「リファラル採用」「タレントアクイジション」といったHR領域固有の要件との適合度を評価し、経験不足を正しく指摘できるようになった。

まとめ

本記事では、Apple Silicon Mac上でMLX-LMを用いてGPT-OSS 20BをHR領域に特化させるファインチューニングの実践を紹介しました。

541職種の職業説明や労働条件から約2,000件のQ&Aペアを構築し、特別なデータ加工なしで作成したデータセットでしたが、採用マッチングタスクにおいてベースモデルの40%から80%へと精度が向上する結果を得ました。

ただし、今回の評価はサンプル数10件と限定的であり、統計的な有意性は確認できていません。また、特定の求人に対する評価であるため、他の職種や求人タイプへの汎化性能は未検証です。

MLX-LMを使ったファインチューニングについて気になった方はぜひお手元で実践してみてください!

参考リンク

最後に

最後までご覧いただきありがとうございました!
現在TalentXでは一緒に働く仲間を募集しております。
talentx.brandmedia.i-myrefer.jp

また、カジュアル面談も行っていますのでぜひご応募ください!
i-myrefer.jp