AI・機械学習
初級

JSONformer(ジェイソンフォーマー)

JSON Schemaに準拠したJSONのみを生成するようLLMを制限するPythonライブラリ。構造部分(括弧・キー・コロン等)をハードコードし、LLMに値だけを生成させることで確実なJSON出力を実現。

0 回閲覧
0 いいね
2026/6/4 更新
関連タグ
LLM
JSON
構造化出力
Transformers
ローカルLLM

JSONformer — 確実なJSON生成のためのLLMラッパー

JSONformerはHugging FaceのTransformersと統合されたシンプルなLLM出力制約ライブラリ。2023年初頭に公開され、LLMからJSONを確実に取得する問題に対してひとつのエレガントな解法を示した。

動作原理: 値だけをLLMに生成させる

JSONformerの核心的なアイデアは非常にシンプル:

  • JSONの構造部分({ } [ ] : , キー名など)はJSONformer自身がハードコードで出力
  • 値の部分(文字列・数値・真偽値)だけをLLMに生成させる

この分担によって、JSON構造の破損(閉じ括弧の欠落・キー名の誤り等)が原理的に起こり得なくなる。

入力: JSON Schema + プロンプト
出力フロー:
JSONformer: {
LLMが生成: "Ryzen 9 9900X"
JSONformer: ,
LLMが生成: 9
JSONformer: ,
LLMが生成: true
JSONformer: }

基本的な使い方

from jsonformer import Jsonformer
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "meta-llama/Llama-3.2-3B-Instruct"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

json_schema = {
    "type": "object",
    "properties": {
        "product_name": {
            "type": "string",
            "description": "商品名"
        },
        "price_jpy": {
            "type": "number",
            "description": "価格(円)"
        },
        "in_stock": {
            "type": "boolean",
            "description": "在庫あり"
        },
        "specs": {
            "type": "array",
            "items": {"type": "string"},
            "description": "主要スペック一覧"
        }
    }
}

prompt = "Ryzen 9 9900Xについて以下の情報をJSON形式で答えてください:"

jsonformer = Jsonformer(model, tokenizer, json_schema, prompt)
result = jsonformer()

対応するJSONスキーマ型

  • string: LLMが文字列を生成(終端検知で区切り)
  • number / integer: LLMが数値文字列を生成しfloat変換
  • boolean: true / false のどちらかを選択させる
  • array: 要素数を動的に生成しループ
  • object: 再帰的にネストされたスキーマを処理

軽量さとシンプルさの強み

JSONformerはコアのPythonコードが非常に少なく、動作原理が理解しやすい。XGrammarやLM Format Enforcerと比べて:

  • 依存ライブラリが少ない
  • Transformersモデルと直接統合(ローカルLLM向け)
  • LLM初学者でも実装原理を把握しやすい

制限事項

  • vLLM・SGLangなど推論サーバーとの統合なし: Transformers直接呼び出し専用
  • anyOf / oneOf 等の複合スキーマ非対応: 基本型のみ
  • 正規表現制約なし: フォーマット(電話番号・日付等)の詳細制約は別途実装が必要

実用ユースケース

自作PC価格比較情報の抽出

pc_part_schema = {
    "type": "object",
    "properties": {
        "part_name": {"type": "string"},
        "category": {"type": "string"},
        "price_jpy": {"type": "number"},
        "shop": {"type": "string"},
        "is_sale": {"type": "boolean"}
    }
}

# Qwen2.5-3B-Instructをローカルで使った価格抽出
prompt = f"以下のテキストから商品情報を抽出してください:
{raw_text}"
jf = Jsonformer(model, tokenizer, pc_part_schema, prompt)
part_info = jf()

ガジェットレビューのスコアリング

review_schema = {
    "type": "object",
    "properties": {
        "overall_score": {"type": "integer"},
        "pros": {"type": "array", "items": {"type": "string"}},
        "cons": {"type": "array", "items": {"type": "string"}},
        "recommended": {"type": "boolean"}
    }
}

LM Format Enforcerとの使い分け

  • JSONformer: シンプル・学習用・プロトタイプ・Transformers直接利用
  • LM Format Enforcer: 複雑なスキーマ・正規表現対応・複数バックエンド対応・プロダクション向け

実装の透明性が高く、LLMの構造化生成を学習するための入門ライブラリとしても最適。

この記事について
カテゴリーAI・機械学習
難易度初級
作成日2026/6/4