LLM Decoding 時の出力制御
ライブラリや API 利用の観点からは主に以下の3つ
スキーマ指定の Structured Output
Function Calling
プロンプトでの指示 & パース時の工夫 (JSON としてパースできる範囲だけを切り出して使うなど)
ここでは Decoding 時の工夫を見る
だいたい JSON Schema や BNF を入力して、ステートマシンで次取りうるトークンの確率以外を 0 にして(logits masking, logits modification) 拾っていく形だろう
実装
JSON Schema, 文脈自由文法を入力、↑ の説明や直感に一番合ってそう
JSON Structured Output 特化
{ や : やキー名は jsonformer が decoding 時に追加して値だけ推論させている形
decoding の過程で既に生成したトークンを参照している自己回帰的なところに介入しているのがおもしろい
logits 操作周りはリテラル関係だけやっていてシンプル
llama.cpp の Grammar 機能、BNF で出力制御できる、これも冒頭の説明のような処理
出力テンプレートの構文から段階的に生成していく
OpenAI や VertexAI モデルに対しても実行できる(トークン分布を調整しているわけではない? ここだけ実装別?)
構造化データだけでなくコード生成も文法から(Go や Python の文法指定して)生成できる
論文
使い分け with gemini-2.5-pro-exp
出力形式はJSONで、APIコストを最重視するなら → Jsonformer
Pythonicに開発したい、Pydantic/正規表現/多様な文法で出力を制御したい、ローカルLLMで効率よく制御したいなら → Outlines
複雑な条件分岐や繰り返しを含む制御フローが必要、プロンプトとロジックを一体管理したい、API/ローカル問わず使いたいなら → Guidance
table:situations
ユースケース 状況・要件 最も向いているライブラリ 次点・他の選択肢 理由
1. Web APIでユーザー入力からJSON生成 確実なJSONスキーマ準拠が必要。APIコスト(トークン数)を抑えたい。Pythonバックエンド (FastAPI等)。 Jsonformer Outlines JsonformerはJSON特化でトークン効率が良い。OutlinesはPydantic/JSON Schema連携が強力でPythonic。Guidanceはこの用途ではややオーバースペック。
2. ローカルLLMで正規表現に合うテキスト生成 ローカル環境 (Llama 3等)。出力が特定の正規表現パターンに従う必要がある。 Outlines Guidance (ローカル対応時) OutlinesはローカルLLMでの正規表現制約付きデコーダー制御が得意。Guidanceも可能だがOutlinesの方が特化している。Jsonformerは用途外。
3. 複雑な対話フローを持つエージェント/チャットボット構築 状態管理、条件分岐、ループが必要。生成とロジックが絡み合う。APIモデル (GPT-4, Claude 3等) 利用。 Guidance - Guidanceのテンプレート言語は複雑な制御フローを記述しやすい。APIモデルとの連携もスムーズ。Outlines/Jsonformerはこのような制御フロー記述には特化していない。
4. 既存Pythonプロジェクト (Pydantic多用) へのLLM組込み Pythonコードベース。Pydanticモデル定義済み。LLMにPydanticモデルに合ったデータを生成させたい。 Outlines - OutlinesはPydanticモデルから直接制約を生成でき、既存のPythonエコシステムとの連携が非常にスムーズ。他のライブラリより導入しやすい。
5. とにかくJSON生成のAPIコスト/トークン数を削減したい コスト最優先。出力はJSON形式。 Jsonformer Outlines Jsonformerは固定トークンを生成しないため効率が最も高い可能性。Outlinesも効率的だがJsonformerほど特化していない。GuidanceはAPI利用時に複数コールになりがち。
6. 特定の形式 (XML, CSV, SQLなど) で出力させたい JSON以外の構造化データやドメイン固有言語。 Outlines Guidance Outlinesは正規表現やカスタム文法で多様な形式に対応可能。Guidanceも可能だが、Outlinesの方が文法定義の柔軟性が高い場合がある。Jsonformerは用途外。
7. プロンプトと制御ロジックを一体化して管理したい プロンプトのテンプレート化と、その中での動的な変更や制御を同じ場所で記述したい。可読性を重視。 Guidance - Guidanceのテンプレート言語はこの目的のために設計されている。OutlinesはPythonコード内に記述、JsonformerはJSONスキーマとコードが分離する形になりやすい。
記事
ひらがな・カタカナだけ
正則言語に合うトークンをデコードしていく
GreederDecoder に手を入れる