LLMの真価:ソフトウェア向け構造化出力の実現

Towardsdatascience

ChatGPTやGeminiのような大規模言語モデル(LLM)は、直感的なチャットインターフェースを通じて人間とAIの対話を革新しましたが、その有用性は単なるカジュアルな会話をはるかに超えています。これらの強力なモデルの広大で成長中のユーザーベースを形成するソフトウェアアプリケーションにとって、一般的なチャットインターフェースの自由形式で非構造化なテキスト出力は大きな課題を提示します。人間とは異なり、ソフトウェアプログラムはデータを効果的に処理するために、特定の形式またはスキーマに準拠する必要があります。この根本的な違いにより、LLMに構造化出力を生成させ、自動化タスクにおけるその潜在能力を解き放つ技術が必要とされます。

構造化出力の生成には、LLMをガイドして、事前定義された形式(最も一般的なのはJSONまたは正規表現(RegEx))に準拠するデータを生成させることが含まれます。たとえば、JSONスキーマは、期待されるキーとその関連データ型(例:文字列、整数)を指定し、LLMが完全にフォーマットされたオブジェクトを確実に配信するようにします。この機能は、大量のテキストや画像(マルチモーダルLLMを使用)から正確な情報を抽出するアプリケーションにとって重要であり、例えばデジタルレシートから購入日、合計価格、店舗名を抽出するなどが挙げられます。このニーズに対応するため、エンジニアはいくつかの一般的なアプローチを開発してきました。

一つの簡単な方法は、構造化出力機能を内蔵したLLM APIプロバイダーに依存することです。OpenAIやGoogleのGeminiのような企業のサービスでは、開発者はPydanticのようなPythonクラスを使用して出力スキーマを定義し、それを直接APIエンドポイントに渡すことができます。このアプローチの主な魅力はそのシンプルさにあります。プロバイダーが基盤となる複雑さを処理するため、開発者はデータ構造の定義に集中できます。しかし、この利便性には重大な欠点も伴います。これはベンダーロックインを引き起こし、プロジェクトを特定のプロバイダーに限定し、多くの強力なオープンソースの代替を含むより広範なモデルエコシステムへのアクセスを排除する可能性があります。さらに、アプリケーションを潜在的な価格変動にさらし、動作している技術的メカニズムを不明瞭にし、デバッグとより深い理解を妨げます。

2番目の一般的な戦略は、プロンプティングとリプロンプティングのテクニックを採用することです。これには、LLMに(通常はシステムプロンプト内で)特定の構造に従うよう明示的に指示し、多くの場合、例で補強することが含まれます。LLMが応答を生成した後、パーサーは目的のスキーマに対して出力を検証しようとします。解析が成功すれば、プロセスは完了です。しかし、プロンプティング単独の固有の信頼性の低さは、LLMが指示から逸脱し、余分なテキストを追加したり、フィールドを省略したり、不正確なデータ型を使用したりする可能性があることを意味します。解析が失敗した場合、システムはエラー回復プロセスを開始する必要があります。多くの場合、LLMにフィードバックを与えて出力を修正させる「リプロンプティング」を行います。パーサーは特定のエラーに関する詳細な洞察を提供できますが、リプロンプティングの必要性は大きなコスト要因を導入します。LLMの使用は通常トークンごとに課金されるため、各再試行はその対話のコストを実質的に2倍にします。この方法を採用する開発者は、予期せぬ高額な請求を防ぐために、再試行回数にハードコードされた制限などの安全策を実装する必要があります。これらの課題にもかかわらず、instructorのようなライブラリが登場し、スキーマ定義の自動化、様々なLLMプロバイダーとの統合、自動再試行により、このアプローチを簡素化しています。

最も堅牢で、しばしば推奨される方法は制約付きデコーディングです。プロンプティングとは異なり、この技術は、高価な再試行を必要とせずに、有効でスキーマに準拠した出力を保証します。これは計算言語学と、LLMがトークンごとにテキストを生成する方法の理解を活用しています。LLMは自己回帰的であり、先行するすべてのトークンに基づいて次のトークンを予測します。LLMの最終層は、その語彙内のすべての可能なトークンの確率を計算します。制約付きデコーディングは、この段階で介入し、各生成ステップで利用可能なトークンを制限します。

これはまず、正規表現(RegEx)を使用して目的の出力構造を定義することによって達成されます。このRegExパターンは、決定論的有限オートマトン(DFA)、つまりテキストのシーケンスがパターンに準拠しているかどうかを検証できる状態機械にコンパイルされます。DFAは、任意の時点で、スキーマに準拠しながら現在のシーケンスに続くのにどのトークンが有効であるかを決定する正確なメカニズムを提供します。LLMがトークン確率を計算する際、DFAによって許可されていないすべてのトークンのロジット(ソフトマックス前の値)は実質的にゼロに設定されます。これにより、モデルは有効なセットからのみ選択することを強制され、生成された出力が必要な構造に厳密に従うことが保証されます。重要なことに、このプロセスはDFAが確立された後、追加の計算コストを発生させません。Outlinesのようなライブラリは、制約付きデコーディングの実装を簡素化し、開発者がPydanticクラスまたは直接RegExを使用してスキーマを定義し、多数のLLMプロバイダーとシームレスに統合できるようにします。

結論として、LLMから構造化出力を生成することは、その応用範囲を人間中心のチャットをはるかに超えて拡大する極めて重要な能力です。APIプロバイダーに依存する方法は初期のシンプルさを提供し、エラー回復を伴うプロンプティングは柔軟性を提供しますが、制約付きデコーディングは最も強力で費用対効果の高いアプローチとして際立っています。LLMのトークン生成プロセスを根本的にガイドすることにより、信頼性があり、スキーマに準拠した出力を保証し、洗練されたソフトウェアシステムにLLMを統合するための好ましい方法となっています。