【ITニュース解説】Why JSON Mode Fails (and How to Fix It)
2025年09月10日に「Dev.to」が公開したITニュース「Why JSON Mode Fails (and How to Fix It)」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
大規模言語モデル(LLM)にJSON出力を求めても、形式が崩れる問題は多い。モデルの「JSONモード」だけでは不十分で、手動での検証は非効率である。期待するデータ構造(スキーマ)を定義し、不正な出力を自動で検証・再試行するライブラリの活用が有効だ。
ITニュース解説
大規模言語モデル、通称LLMは、現代のITシステム開発において強力なツールであり、自然言語のテキストから構造化されたデータを抽出する際によく利用される。その代表的なデータ形式がJSONだ。JSONは { "key": "value" } のようなキーと値のペアで構成され、プログラム間のデータ交換に適しているため、多くの開発者はLLMに「この情報をJSON形式でまとめてほしい」と指示する。しかし、LLMの応答には本質的な不確実性が伴う。LLMは厳密な構文規則ではなく、統計的な確率に基づいてテキストを生成するため、JSONの出力はしばしば不完全になる。例えば、オブジェクトを閉じる波括弧 } が欠落していたり、JSONデータの前後に「こちらが結果です」といった無関係なテキストが混入したり、出力が長すぎて途中で途切れてしまったりすることがある。多くのLLM APIが提供する「JSONモード」という機能も、これらの問題を完全に防ぐことはできず、システム障害の直接的な原因となり得る。
この問題に直面した開発者の多くは、LLMの出力を受け取った後にその正しさを検証し、修正するためのプログラムを自前で実装しようと試みる。正規表現を使って不要な文字列を削除したり、例外処理構文を用いてJSONとして解析できるかを確認したりする方法が一般的だ。しかし、これらの手作業による対策は場当たり的になりがちで、LLMが予期せぬ形式でエラーを出力するたびに、検証ロジックを修正し続けなければならない。これは、本来の機能開発に費やすべき時間を奪う非効率な作業であり、コードの複雑性を増大させ、新たなバグの温床にもなりかねない。根本的な問題は、LLMが常に正しい出力をすることを前提として、後処理でなんとかしようとするアプローチそのものにある。
より堅牢で本質的な解決策は、LLMの出力が不完全であることを前提とし、「厳格な基準で検証し、基準を満たさなければ自動的にやり直させる」という仕組みを構築することだ。このアプローチの核となるのが「スキーマ検証」と「自動リトライ」である。スキーマとは、期待するJSONデータの構造を定義した「設計図」のことだ。例えば、「nameというキーの値は文字列で、ageの値は数値でなければならない」といったルールをあらかじめ定めておく。スキーマ検証とは、LLMの出力がこの設計図通りになっているかを厳密にチェックするプロセスを指す。そして自動リトライは、検証に失敗した場合、つまりLLMの出力が設計図と異なっていた場合に、一度で諦めずに同じ要求を自動で再試行する仕組みである。この二つを組み合わせることで、LLMの出力が不安定であっても、最終的に設計図通りの正しいJSONデータを安定して取得する確率を劇的に高めることができる。
この記事で紹介されているAgent Validatorは、この「スキーマ検証」と「自動リトライ」を簡単に実現するためのライブラリだ。開発者はまず、期待するJSONのスキーマを{"name": str, "age": int}のようにシンプルに定義する。次に、LLMから得られた出力をvalidate関数にこのスキーマと共に渡すだけで、検証が実行される。retries=3といったオプションを指定すれば、検証に失敗した際に3回まで自動で再試行が行われる。さらにCOERCEモードという便利な機能も備わっている。これは、LLMが数値を30ではなく文字列の"30"として出力してしまった場合でも、スキーマ定義に基づき自動で正しい数値型に変換してくれる機能だ。これにより、厳密な検証を行いつつも、軽微な表現の揺れは柔軟に吸収でき、システムの安定性をさらに向上させることが可能になる。
また、安定したシステム運用には、問題発生時の原因究明を容易にする「可観測性」が不可欠である。Agent Validatorは、実行した全ての検証の試行履歴を成功・失敗にかかわらずローカルにログとして記録する。これにより、後からエラーの原因を追跡し、デバッグすることが容易になる。さらに、クラウドの監視サービスと連携する機能も提供しており、検証の成功率やエラーの傾向などをダッシュボードで視覚的に把握することもできる。このように、LLMの出力を検証するだけでなく、その後の運用まで見据えた機能が提供されている。結論として、LLMからJSONデータを取得する際は、出力の不完全性を前提とし、手作業の検証コードではなく、スキーマ定義と自動リトライを組み合わせた体系的なアプローチを採用することが極めて重要である。Agent Validatorのようなツールを活用することで、開発者はLLMの出力の不安定さに悩まされることなく、信頼性の高いアプリケーションを効率的に構築することに集中できる。