XGrammar(エックスグラマー)
コンテキストフリー文法(CFG)を用いてLLMのトークン生成を制約し、任意のスキーマ準拠の構造化出力を高速生成するライブラリ。MLC-AI(TVM)チームが開発。
XGrammar — 高速文法ベースLLM構造化生成ライブラリ
XGrammarは、MLC-AI(Machine Learning Compilationチーム、TVM開発元)が2024年に公開した構造化生成ライブラリ。LLMのデコード時に**コンテキストフリー文法(CFG)**ベースのトークンマスクを適用することで、任意のJSON Schema・正規表現・EBNFに準拠した出力を確実に生成できる。
なぜ文法ベース制約が必要か
プロンプトエンジニアリングだけでJSONを生成させると、閉じ括弧の欠落・型の不一致・余分なテキスト混入などが頻繁に発生する。文法ベース手法ではデコード時のロジット(次トークンの確率分布)に直接マスクをかけるため、文法違反トークンが選択される確率を物理的にゼロにする。
XGrammarのアーキテクチャ
XGrammarの技術的特徴は以下の3点:
1. アダプティブトークンマスクキャッシング
従来手法では各デコードステップで全トークン(語彙数=10万以上)の適合性をチェックするため大きなオーバーヘッドが生じていた。XGrammarはコンテキスト依存トークンとコンテキスト独立トークンを分離してキャッシュし、再計算コストを最小化する。
2. CPUとGPUの並列実行
トークンマスクの計算をCPUスレッドで非同期実行し、GPU側のLLMデコードと完全にオーバーラップさせる。これにより制約あり生成のオーバーヘッドが実質ゼロに近づく(ベンチマークで制約なし生成との速度差1%未満)。
3. EBNF文法エンジン
JSON Schemaだけでなく、任意のEBNF文法をXGrammarに与えることができる。SQLクエリ・数式・カスタム構造化フォーマットなど、JSON以外の制約にも対応可能。
セットアップと基本使用法
import xgrammar as xgr
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
tokenizer_info = xgr.TokenizerInfo.from_huggingface(tokenizer)
grammar_compiler = xgr.GrammarCompiler(tokenizer_info)
# JSON Schema から文法コンパイル
json_schema = '''{
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer", "minimum": 0}
},
"required": ["name", "age"]
}'''
compiled_grammar = grammar_compiler.compile_json_schema(json_schema)
logits_processor = xgr.contrib.hf.LogitsProcessorForXGrammar(compiled_grammar)
推論フレームワークへの統合
XGrammarは主要な推論フレームワークに統合済み:
- vLLM: v0.6.0以降でデフォルトの構造化生成バックエンドとして採用
- SGLang: ネイティブ統合済み(
--grammar-backend xgrammar) - TensorRT-LLM: NVIDIA公式エコシステムへの統合
- MLC-LLM: TVM/MLCLLMのネイティブバックエンド
- Hugging Face Transformers:
LogitsProcessorForXGrammar経由
vLLMとの統合例
from vllm import LLM, SamplingParams
from pydantic import BaseModel
class Response(BaseModel):
product: str
price: int
available: bool
llm = LLM(model="meta-llama/Llama-3.2-3B-Instruct")
params = SamplingParams(
temperature=0.7,
guided_json=Response.model_json_schema() # XGrammarが内部で処理
)
outputs = llm.generate(prompts, sampling_params=params)
他ライブラリとの比較
- XGrammar vs Outlines: XGrammarはCFG+ビットマスクキャッシュ、OutlinesはFSM(有限状態機械)。XGrammarのほうがオーバーヘッドが小さい。
- XGrammar vs LM-Format-Enforcer: XGrammarはvLLMデフォルト採用、LM-Format-Enforcerはローカル個人利用で手軽。
- 開発元: XGrammar=MLC-AI(TVM)、Outlines=.txt社、LM-Format-Enforcer=noamgat氏。
自作PC・ガジェット価格抽出への応用
ECサイトのHTMLやレビューテキストからパーツ情報を構造化抽出するバッチ処理にXGrammarを組み込むと、出力のパース失敗率をほぼゼロにできる:
pc_part_schema = {
"type": "object",
"properties": {
"model_name": {"type": "string"},
"price_jpy": {"type": "integer"},
"socket": {"type": "string", "enum": ["AM5", "LGA1851", "LGA1700"]}
},
"required": ["model_name", "price_jpy"]
}
compiled = grammar_compiler.compile_json_schema(json.dumps(pc_part_schema))
vLLMを使ったサーバーサイドでのバッチ推論と組み合わせることで、数千件のレビューを並列処理しつつ構造化データを確実に取得できる。