コンテンツにスキップ
メインサイト ニュース コンソール

100ステップのGRPOファインチューニングで3.5億パラメータモデルの構造化出力能力を向上

· Hugging Face 翻訳済
教程模型卡

本ガイドでは、小規模モデルの構造化出力への準拠能力を大幅に向上させる、完全に公開された低コストの手法を紹介します。TRL ライブラリのグループ相対方策最適化(Group Relative Policy Optimization、GRPO)を使用して LFM2.5-350M を微調整し、IFStruct ベンチマークで評価します。実行全体に必要なのは約 500 サンプルと 100 回の学習ステップだけです。無料版の Colab または Kaggle GPU で実行できる十分に小さな規模であり、関連する内容は GitHub で公開されています。その結果、軽量な微調整パイプラインであっても、IFStruct ベンチマークの性能を22.6% から 29.7% に向上できることが分かりました。

構造化出力は、大規模言語モデル(LLM)における最も一般的な実用タスクの一つです。しかし、多くのベンチマークでは、構造化出力を独立した指標として測定せず、より広範な推論または情報抽出のスコアに含めています。モデルが要求された形式と構造に従って、有効かつ解析可能な出力を安定して返せるかどうか、つまりスキーマ準拠(schema compliance)が、下流システムに実際に組み込めるかどうかを左右することは少なくありません。

ここで紹介する学習パイプラインは、IFStruct ブログで説明されている強化学習モデルの学習パイプラインとは異なる点に注意してください。この Notebook は IFStruct ベンチマークのスコアを再現することを目的としたものではありません。特定のタスク向けに小規模なモデルを微調整することで、その性能をどのように向上させ、はるかに大規模なモデルに匹敵する水準まで引き上げられるかを示すことを目的としています。

前提条件

本ガイドは、異なる環境で実行する 2 つのパートに分かれています。

  • 微調整には GPU が必要です。付属の Notebook は、無料版の Colab または Kaggle GPU で実行できる規模になっています。

  • 評価は、ローカルの MacBook 上で llama.cpp を使って実行できます(本稿では、Apple M5 Max チップと 36 GB のユニファイドメモリを搭載した MacBook Pro を使用しています)。llama.cpp が OpenAI 互換サーバーを提供し、IFStruct 評価ツールがそのサーバーと通信します。

Python ツールの管理には uv を使用し、モデルの提供には llama.cpp を使用します。Liquid AI の llama.cpp デプロイドキュメントに従って Homebrew で llama.cpp をインストールし、llama-server が利用可能であることを確認します。

brew install llama.cpp
llama-server --version

LFM2.5-350M(ベースモデル)で IFStruct を評価する

まず、IFStruct ベンチマークで LFM2.5-350M を評価し、報告されている 21.1% のスコアを再現できるかを確認します。

IFStruct は、大規模言語モデルの出力の有効性とスキーマ準拠能力をテストするベンチマークです。このベンチマークは Liquid4All/ifstruct でオープンソースとして公開されており、公開ベンチマークデータセットは Hugging Face の LiquidAI/ifstruct-v1.0 でホストされています。

git clone https://github.com/Liquid4All/ifstruct.git

評価結果を比較するため、llama.cpp を使って MacBook 上でモデルをローカル提供します。ここでは BF16 GGUF モデル(LiquidAI/LFM2.5-350M-GGUF)を使用します。

次のコマンドを実行して、ベースモデルのサーバーを起動します。

llama-server \
-hf LiquidAI/LFM2.5-350M-GGUF:BF16 \
-c 32768 \
-np 4 \
-ngl 99 \
--alias LiquidAI/LFM2.5-350M \
--host 127.0.0.1 \
--port 8080
  • --alias:IFStruct が OpenAI 互換エンドポイントにリクエストを送信する際に使用するモデル名

  • -ngl 99:利用可能な場合、すべての層を GPU にオフロードするよう llama.cpp に指示

  • -np 4:4 件のリクエストを並列処理

  • -c 32768:プロンプトコンテキストのサイズ

サーバーが起動したら、2000 サンプルを使用してベンチマーク全体を実行できます。

uv run ifstruct-eval \
--model LiquidAI/LFM2.5-350M \
--base-url http://localhost:8080/v1 \
--api-key dummy \
--dataset data/test.jsonl \
--results-file results/lfm2.5-350m-llamacpp-base.json \
--n-threads 4 \
--max-tokens 2048 \
-v
============================================================
Model: LiquidAI/LFM2.5-350M
============================================================
Overall: 452/2000 passed (22.6%)
Average latency: 1453ms
By format:
JSON: 180/1000 passed (18.0%)
YAML: 272/1000 passed (27.2%)
By top-level structure:
Wrapper key 288/1011 passed (28.5%)
Bare list 164/989 passed (16.6%)
By entity type:
test__camera_review 6/83 passed (7.2%)
test__clinical_trial 20/104 passed (19.2%)
test__conference_schedule 7/87 passed (8.0%)
test__escaping__bug_report_batch 24/89 passed (27.0%)
test__escaping__config_snippet_audit 15/85 passed (17.6%)
test__escaping__customer_email_thread 5/73 passed (6.8%)
test__escaping__dialogue_sample 14/95 passed (14.7%)
test__escaping__interview_transcript_segment 21/80 passed (26.2%)
test__escaping__log_parser_examples 21/72 passed (29.2%)
test__escaping__pr_discussion 22/87 passed (25.3%)
test__escaping__repro_steps_batch 16/73 passed (21.9%)
test__escaping__screenplay_scene 16/92 passed (17.4%)
test__escaping__short_story_chapter 15/84 passed (17.9%)
test__escaping__support_ticket_batch 27/73 passed (37.0%)
test__escaping__terminal_session_notes 20/70 passed (28.6%)
test__event_ticket_booking 49/107 passed (45.8%)
test__gpu_review 6/94 passed (6.4%)
test__invoice 28/86 passed (32.6%)
test__job_posting 25/85 passed (29.4%)
test__real_estate_listing 31/82 passed (37.8%)
test__recipe 3/70 passed (4.3%)
test__rental_car_booking 27/79 passed (34.2%)
test__scientific_experiment 13/69 passed (18.8%)
test__travel_itinerary 21/81 passed (25.9%)
Common errors:
7228x required field missing
738x wrong item count
540x type mismatch
317x Unclosed code block
190x extraneous field 'notes'
181x extraneous field 'path'
175x extraneous field 'constraints'
170x extraneous field 'type'
170x missing code block
100x expected bare list, got wrapper

IFStruct の公開ブログでは、LFM2.5-350M のスコアは 21.1% と報告されています。ローカル環境で llama.cpp と BF16 の構成を使用して測定した結果は 22.6% であり、IFStruct ブログで報告されている 21.1% に近い値となりました。このローカル結果を、同一のサービススタックで比較する際のベースラインとします。

TRL を使用した構造化出力向け GRPO 微調整

完全に実行可能なパイプラインは、付属の Notebook にあります。本節では、その中から関連する部分のみを説明します。

学習データ

nvidia/Nemotron-RL-instruction_following-structured_outputs データセットを使用します。このデータセットでは、各プロンプトに目標 JSON Schema と想定されるフィールド数が対応付けられています。学習には約 500 サンプルを使用します。

Nemotron のデータ分布は IFStruct の評価データとは異なるため、両者の 2 つの差異を埋めるためにプロンプトを拡張します。

  • 40% のサンプルには、「出力をフェンス付きコードブロックに入れて返す」という指示を追加します。これにより、モデルは常に生の JSON を出力するのではなく、形式の指示に従うことを学習します。

  • それとは重複しない別の 20% のサンプルは、トップレベル配列のタスクに変換します(Schema を array でラップし、指定された要素数を要求します)。これにより、ラップされていないリストの出力と、要素数への準拠能力を学習させます。

モデルと LoRA

LiquidAI/LFM2.5-350M を読み込み、LoRA アダプターを追加します。LFM2.5 は注意機構と畳み込みを組み合わせたアーキテクチャを採用しているため、LFM 固有のモジュール名を対象にします。

lora_config = LoraConfig(
r=16,
lora_alpha=32,
bias="none",
task_type="CAUSAL_LM",
target_modules=[
"q_proj", "k_proj", "v_proj", "out_proj
#教程#模型卡#Omniapi.co

4All API チームによる投稿

原文リンク:https://huggingface.co/blog/grpo-with-trl-ifstruct

主流 AI モデル API をお探しですか?4All API は OpenAI / Anthropic / Google Gemini / Qwen / DeepSeek など数十種類のモデルを単一の API キーで呼び出せます。公式準拠の価格、エンタープライズ品質の通信路、5 分で接続完了。

4All API コンソールに登録 →