AIエージェントにWebツールを生成させる際、最も頭を悩ませるのがJSON出力の不安定さだ。プロンプトで「JSONで返せ」と指示しても、LLMは平気でコードフェンスや余計な解説文を混ぜ込み、時にはJSONの末尾を切り落とす。この問題は開発の初期段階では無視できても、本番運用では致命的な例外を引き起こす。今回は、LLMのJSON出力を「抽出・修復・検証」の3段階で確実に受け止め、システムを堅牢にするための全技術をまとめる。
SNS運用を自動化しませんか?
ThreadPostなら、投稿作成・画像生成・スケジュール管理までAIがサポート。
1. 抽出プロセス:ノイズの除去とパース
LLMの出力から純粋なJSON文字列だけを抜き出す作業が最初の一歩だ。まず、コードフェンス(```json ~ ```)のような不要な装飾を剥がす。その上で、JSONの開始位置である「{」を見つけ、括弧の対応を追跡する。文字列リテラル内の括弧を誤ってカウントしないよう、文字列の内外を判定しながら深さを計算するのがコツだ。この段階で閉じ括弧が足りない場合は、次の修復プロセスへ回す。
2. 修復プロセス:軽微なエラーの自動救済
抽出した文字列がパースできない場合、定番のエラーだけを自動修正する。末尾の余計なカンマを削除したり、不足している閉じ括弧を補完したりするのが有効だ。ここで重要なのは「欲張らない」ことである。無理に複雑な修正を行うと、データ内容が歪むリスクがある。json-repairのような既存ライブラリに任せるか、単純なパターンマッチングに絞るのが安全だ。
3. Pydanticによるスキーマ検証
パースが通った後のJSONに対して、Pydanticを用いて型や必須キーの有無を厳密にチェックする。どの段階でパースが成功したかを計測しておくことで、プロンプト改善の指標にする。検証ロジックの実装にはコストがかかるが、データの整合性をプログラムレベルで保証できるメリットは大きい。
4. UIキットとCSS変数によるデザイン固定
JSONでレイアウトを完全に固定すると、表現力が極端に低下する。CSS変数やUIコンポーネントの仕様をAIに提供し、構成は自由に組ませる手法がおすすめだ。パレットや角丸などのデザイン体系だけを固定することで、ブランドの一貫性と表現の自由度を両立できる。

ここまで読んだあなたに
今なら無料で全機能をお試しいただけます。設定後はAIが投稿案を毎日生成。確認して選ぶだけ。
5. エンジニアの「心構え」のプロンプト化
単なるタスク手順ではなく、客観視や目的の再定義といった「判断軸」をシステムプロンプトに注入する。AIが自律的に「作らない判断」や「差分の指摘」を行えるようになるだけで、品質は劇的に向上する。エンジニアが普段行っている思考プロセスを言語化し、AIに持たせるのがポイントだ。
6. セルフレビューと独立サブエージェント
成果物を独立した別コンテキストのレビュアーに回す仕組みを構築する。自己申告に頼らず、ダブルチェックを自動化することでヒューマンエラーを大幅に減らせる。処理時間とコストは増えるが、品質担保には代えられない投資だ。
7. 失敗のログ管理
失敗した操作やエラー内容を記録し、次回のセッションでエージェントがそれを参照できるようにする。同じ失敗を繰り返さない学習サイクルを回すことで、長期的にはエージェントの推論精度が安定する。
8. システムプロンプトのトークン圧縮
プロンプトに指示を詰め込みすぎると、AIの集中力が削がれる。重要な判断軸だけを効率的に伝える「トークン予算」の管理が必要だ。不要な記述を削り、エージェントが常に重要な規律を意識できる環境を作る。

| プロセス | 手法 | メリット | デメリット |
|---|---|---|---|
| 抽出 | 文字列パース | ノイズを確実に排除できる | 不完全なJSONには弱い |
| 修復 | 自動補完 | 軽微なエラーを救済できる | データ内容を歪めるリスク |
| 検証 | Pydantic | 型の整合性を保証できる | 実装コストがかかる |
| デザイン | CSS変数 | ブランドの一貫性を維持 | 保守の手間が増える |
しんたろー:
Claude Codeで毎日コードを書いてる身からすると、この3段構えのフォールバックは必須だ。
特に抽出の段階でノイズを除去するロジックを挟むだけで、パースエラーの発生率は劇的に下がる。
しんたろー:
結局のところ、AIに「作らない判断」をさせる心構えの注入が最強の安定化策だった。
手段を目的へ戻す思考を持たせるだけで、無駄な生成と手戻りが驚くほど減る。
FAQ
Q1: JSONが途中で切れてしまう場合はどうすればいいか。
A1: LLMの出力トークン上限に達している可能性が高い。プロンプトでJSONのみを出力するように指示し、出力トークン数を調整する。それでも切れる場合は、修復プロセスで不足している閉じ括弧を補完するロジックを組み込むか、専用ライブラリを使用して強制的に閉じるのが現実的な解決策だ。
Q2: JSONのスキーマが守られない時はどうすればいいか。
A2: Pydanticなどのバリデーションライブラリを導入し、エラー時にその内容をLLMへフィードバックして再生成させる自己修復ループを実装する。スキーマ定義をJSON Schema形式でプロンプトに含めると、モデルの理解度が向上する。
Q3: デザインのブレをなくすにはJSONで固定すべきか。
A3: JSONでレイアウトを完全に固定すると表現力が失われる。CSS変数やUIコンポーネントの仕様をAIに与え、レイアウトは自由度を持たせつつスタイルだけを制限するアプローチが推奨される。これによりブランドの一貫性と柔軟なUI生成が両立できる。
Q4: AIエージェントのプロンプトが長すぎて精度が落ちる場合はどうするか。
A4: 常時ロード予算を意識し、頻繁に使う指示と特定のタスクでしか使わない指示を分離する。不要な記述を削るトークン圧縮を行い、重要な判断軸だけをエージェントに持たせることで、推論の集中力を維持できる。
Q5: 本番環境でJSONパースエラーが起きたかどうやって知るか。
A5: パースの各段階をEnumなどで定義し、どの段階で成功したかをログとして記録する。これによりモデルの更新やプロンプト変更による影響を定量的に計測でき、劣化にすぐ気づくことが可能になる。

JSON出力の安定化は、小手先のプロンプト調整だけでは達成できない。抽出・修復・検証の多層防御を構築し、AIにエンジニアとしての判断軸を持たせることで、初めて実務に耐えうるシステムになる。まずは、今日からパースの各段階をログに記録し、どこでエラーが起きているかを可視化することから始めよう。

この記事が参考になったら、ThreadPostを試してみませんか?
投稿作成・画像生成・スケジュール管理まで、AIがサポートします。
ThreadPostをもっと知る