GPT-6 Lunaの構造化出力:JSONと抽出内容を検証する方法
GPT-6 Lunaで問い合わせ文をJSON化する際のスキーマ、引用根拠、拒否・未完了応答の確認方法を解説。合成データとローカル検証用Pythonコードを配布します。
GPT-6 Lunaは構造化出力に対応していますが、JSONの形式が正しいだけでは抽出内容の正しさは分かりません。 問い合わせ文を処理する開発者向けに、3項目の出力契約とローカル検証コードを用意しました。APIの評価を始める前に、受け取った結果をどう判定するか確認できます。
2026年9月24日にLunaの文書と構造化出力ガイドを確認しました。配布データと期待値は事前に作成した教材です。実行したのは検証器と応答パーサーで、Lunaの精度や速度は測っていません。
スキーマより先に分類ルールを決める
教材には二重請求、サインイン失敗、画面の見た目の変更、スキーマを無視するよう指示を含む通知の4件があります。問い合わせに書かれた指示は処理対象のデータであり、アプリが実行すべき命令ではありません。
出力はcategory、order_id、evidenceです。分類はbilling、access、otherのいずれか、注文番号がなければnull、根拠は原文の短い完全一致の抜粋とします。この練習では、支援を求めていない配送通知はotherです。実際のサポート業務に配送カテゴリがあるなら、ラベル設計を変えてください。
この練習用の分類ルールを実務に使う前に、結果を受け取って対応する担当者と確認してください。スキーマを満たす出力でも、誤った担当部署へ割り振る可能性があります。原文と結果の対応を保存し、なぜその担当部署へ振り分けたか再確認できるようにします。カテゴリが分かったことと、返金などの操作を実行してよいことも別です。
Responsesリクエストを組み立てる
教材ZIPのrequest.jsonを開きます。モデルIDはgpt-6-luna、reasoning.effortはnoneを明示しています。再現可能な開始設定であり、すべての抽出に最適だと示したものではありません。
出力設定の位置を示す断片は次のとおりです。
"text": {
"format": {
"type": "json_schema",
"name": "ticket",
"strict": true,
"schema": {"...": "use the complete schema.json in the lab"}
}
}
これはそのまま実行できる完全なスキーマではありません。text.formatにjson_schemaを指定し、strict: trueにします。3プロパティをすべてrequiredに含め、注文番号は文字列またはnull、additionalPropertiesはfalseです。developerメッセージにルールを置き、userメッセージには問い合わせデータを入れます。
完全なリクエストとスキーマを使ってください。省略記号入りの説明用断片は実行用ではありません。実際の送信には許可されたAPIアカウントを使い、料金が発生し得ることを確認します。本記事では送信していません。接続の違いはSol/Lunaの移行ガイドで説明しています。
通信・形式・意味を別々に確認する
HTTP成功の後も、完了状態と拒否の有無を見てから本文を扱います。extract_textはメッセージ内容を走査し、outputの先頭が回答だとは仮定しません。教材の未完了・拒否応答は受理する本文を返しません。
| 確認 | 分かること | 分からないこと |
|---|---|---|
| 完了かつ拒否なし | 候補の本文がある | 分類の正しさ |
| キーと型が契約どおり | データの形を扱える | 値の真偽 |
| 引用が原文にある | 引用文を捏造していない | 分類を支える根拠か |
| 注文番号が原文にある | 番号の出典がある | 利用者がその注文の所有者か |
| 独立ラベルとの比較 | この標本での一致 | 将来の精度 |
validateは教材の狭い条件だけを調べる関数で、汎用JSON Schemaエンジンではありません。原文に注文番号があってもnullを許すため、欠落の検出には追加の業務ルールが必要です。パーサーも公式形式の応答を前提とし、任意の壊れたJSONに耐える処理ではありません。
本番ではJSON解析、保守されているスキーマ検証ライブラリ、業務ルールの順に確認します。認証、タイムアウト、レート制限、保存と再試行はクライアント側で実装します。
ローカル実行で反例を見る
ZIPを展開したディレクトリで実行します。
python3 lab.py test
Python 3のみで動き、追加依存も通信もありません。11個のアサーションには、存在しない注文番号、捏造引用、余分なキー、未完了応答と拒否の確認が含まれます。
意図的な反例では、二重請求のカテゴリをaccessへ変え、本物の引用を残します。構造と引用の一致を確認する検査には通っても、事前に設定した正解ラベルとは一致しません。11個の成功は検証コードのテストであり、Lunaが11問に正答した結果ではありません。
実モデル評価では失敗も数える
欠落ID、重複、矛盾、多言語、曖昧な例を含む独立ラベル付き標本を用意し、開発用と評価用を分けます。曖昧な正解は別の確認者と合意してから使います。
モデルID、供給元、effort、リクエストID、状態、生の結果、使用量、最終判定を保存します。形式合格、分類正解、根拠のあるID、無根拠の主張、拒否、未解決を別々に集計してください。再試行しても初回の失敗と費用は消えません。
結果を見る前に合格条件を決め、誤分類の損失が大きい請求関連は平均に埋めず、言語別にも確認します。Lunaの費用解説で会計上の区分を確認し、LunaからSolへの振り分けで追加確認の設計へ進めます。
よくある質問
- JSONが正しければ内容も正しいですか?
- いいえ。形式や引用が正しくても分類は誤り得ます。独立した正解ラベルとの照合が必要です。
- サンプルはLunaの生成結果ですか?
- いいえ。入力と期待値は事前に作成した合成データです。ローカルテストはモデルの正答率ではありません。
- 未完了の応答はどう扱いますか?
- 合格データに入れず、状態を保存します。原因に応じて回数を制限した再試行か人による確認を選びます。


