AI・機械学習
上級

XGrammar(エックスグラマー)

コンテキストフリー文法(CFG)を用いてLLMのトークン生成を制約し、任意のスキーマ準拠の構造化出力を高速生成するライブラリ。MLC-AI(TVM)チームが開発。

0 回閲覧
0 いいね
2026/6/4 更新
関連タグ
LLM
構造化出力
CFG
コンスト制約
vLLM

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を使ったサーバーサイドでのバッチ推論と組み合わせることで、数千件のレビューを並列処理しつつ構造化データを確実に取得できる。

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