AI・機械学習
中級

LM Format Enforcer(エルエムフォーマットエンフォーサー)

LLMのトークン生成時にJSON Schema・正規表現などのフォーマット制約をトークンレベルで強制するPythonライブラリ。Transformers・vLLM・ExLlamaV2等に対応。

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

LM Format Enforcer — トークンレベルLLMフォーマット制約ライブラリ

LM Format Enforcer(lm-format-enforcer)は、noamgat氏が開発したオープンソースのPythonライブラリ。LLMのデコードプロセスに割り込み、現在の出力状態に続けられる合法的なトークンのみを許可するマスキングを行うことで、JSON Schema・正規表現・カスタム文法に準拠した出力を保証する。

動作原理

LM Format EnforcerはLogitsProcessorインターフェース(Transformers標準)を利用して動作する。デコードの各ステップで以下を実行:

  1. 現在の出力バッファを解析して「どの続きが合法か」を計算
  2. 合法でないトークンのロジットを-infに設定
  3. 残ったトークンの中から確率サンプリングが行われる

このアプローチは「出力の自由度を保ちながら制約を満たす」という特性がある。

対応フレームワーク

# Hugging Face Transformers
from lmformatenforcer import JsonSchemaParser
from lmformatenforcer.integrations.transformers import (
    build_token_enforcer_tokenizer_data,
    generate_enforced
)

tokenizer_data = build_token_enforcer_tokenizer_data(tokenizer)
parser = JsonSchemaParser(schema)

output = generate_enforced(
    model, tokenizer, tokenizer_data, parser,
    prompt=prompt_tokens
)

対応フレームワーク一覧:

  • Hugging Face Transformers: lmformatenforcer.integrations.transformers
  • vLLM: lmformatenforcer.integrations.vllm
  • ExLlamaV2: lmformatenforcer.integrations.exllamav2
  • llama-cpp-python: lmformatenforcer.integrations.llamacpp
  • LangChain: lmformatenforcer.integrations.langchain

JSON Schema制約

from pydantic import BaseModel
from lmformatenforcer import JsonSchemaParser

class CPUSpec(BaseModel):
    model_name: str
    core_count: int
    tdp_watt: int
    socket: str

parser = JsonSchemaParser(CPUSpec.schema())

# vLLMでの使用例
from lmformatenforcer.integrations.vllm import build_vllm_logits_processor
logits_processor = build_vllm_logits_processor(tokenizer, parser)

正規表現制約

JSON以外の制約にも対応。郵便番号・電話番号・ISO日付など決まったフォーマットを強制できる:

from lmformatenforcer import RegexParser

# 日本の郵便番号フォーマット強制
parser = RegexParser(r"\d{3}-\d{4}")

# 日付(YYYY-MM-DD)
parser = RegexParser(r"\d{4}-\d{2}-\d{2}")

ユニオン型(複数パーサー)

複数の許容フォーマットを組み合わせることも可能:

from lmformatenforcer import UnionParser

# JSON か "N/A" のいずれか
parser = UnionParser([
    JsonSchemaParser(schema),
    RegexParser(r"N/A")
])

XGrammar・Outlinesとの使い分け

  • LM Format Enforcer: ローカルLLM環境での手軽な導入に優れる。ExLlamaV2対応が強み。
  • XGrammar: 高スループット推論サーバー(vLLM・SGLang)向け。ほぼゼロオーバーヘッド。
  • Outlines: FSMベースで長い歴史がある。Regex制約の表現力が高い。

自作PC情報抽出での活用

ローカルでGemma・Qwen等を動かしながらパーツスペックを抽出する場面に適合:

from llama_cpp import Llama
from lmformatenforcer.integrations.llamacpp import build_llamacpp_logits_processor

llm = Llama(model_path="./qwen2.5-3b-instruct.gguf", n_gpu_layers=-1)

spec_parser = JsonSchemaParser({
    "type": "object",
    "properties": {
        "product_name": {"type": "string"},
        "price": {"type": "integer"},
        "in_stock": {"type": "boolean"}
    }
})

logits_processor = build_llamacpp_logits_processor(llm, spec_parser)

省メモリなGGUFモデルと組み合わせることで、GPU非搭載マシンでもCPU推論による構造化抽出パイプラインを構築できる。

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