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標準)を利用して動作する。デコードの各ステップで以下を実行:
- 現在の出力バッファを解析して「どの続きが合法か」を計算
- 合法でないトークンのロジットを
-infに設定 - 残ったトークンの中から確率サンプリングが行われる
このアプローチは「出力の自由度を保ちながら制約を満たす」という特性がある。
対応フレームワーク
# 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推論による構造化抽出パイプラインを構築できる。