Back to Headlines

LLMから構造化出力を生成する3つの方法:エンジニア必見の実践ガイド

5日前

大規模言語モデル(LLM)から構造化出力を生成する技術は、AIをソフトウェアアプリケーションに統合する上で不可欠な課題です。現在のチャットUIは人間向けに最適化されており、自由な自然言語で入出力が可能ですが、プログラムは構造化データしか扱えません。そのため、LLMの出力をJSONや正規表現(RegEx)など定義済みのスキーマに従わせる技術が求められています。 この記事では、構造化出力生成の代表的な3手法を紹介します。まず、APIプロバイダーによる「マジック」方式。OpenAIやGoogle Geminiなどは、Pydanticクラスでスキーマを定義し、APIに渡すことで自動的に構造化出力を返します。簡単で使いやすい反面、プロバイダー依存でコスト増や自由度の低下が懸念されます。 次に、プロンプトと再プロンプトによるアプローチ。モデルに「JSON形式で出力して」「余計な説明はしない」と指示し、出力後にパーサーで構文チェックを行う方法です。しかし、LLMはプロンプトに従わないことが多く、パース失敗が頻発します。このため、再試行が必要となり、APIコストが増加します。この問題を緩和するには、再試行回数に上限を設けるなどの制御が有効です。 最も効率的な手法は「制約付きデコード(Constrained Decoding)」です。この方法では、出力の各トークン生成段階で、正しく構造化された出力を保証するためのルールを適用します。具体的には、正規表現で定義されたスキーマを「決定性有限オートマトン(DFA)」に変換し、モデルが生成するトークンの候補をその状態遷移に限定します。softmax前段階で不正なトークンの確率を0に設定することで、常に構造化された出力が生成されます。コストは追加のリトライが不要なため、非常に低く、効率的です。 代表的なライブラリとして「Outlines」が挙げられ、PydanticクラスやRegExを直接サポートし、OpenAIやOllamaなど多数のモデルと連携可能です。コード例では、ユーザーの入力から「名前」「緊急度」「問題内容」を正確に抽出し、常に有効なオブジェクトを返すことが確認できます。 結論として、構造化出力の生成において、制約付きデコードが最も柔軟でコスト効率に優れています。特に、AIをシステムに組み込む開発者にとって、Outlinesなどのツールと併用することで、信頼性の高いAIアプリケーション開発が可能になります。

Related Links