GPT-6 Lunaの構造化出力:JSONと抽出内容を検証する方法

GPT-6 Lunaで問い合わせ文をJSON化する際のスキーマ、引用根拠、拒否・未完了応答の確認方法を解説。合成データとローカル検証用Pythonコードを配布します。

暖かいベージュの背景に、薄いカード上のそろばんの黒い線画、幾何学模様、GPT-6 Luna JSONの英字。

GPT-6 Lunaは構造化出力に対応していますが、JSONの形式が正しいだけでは抽出内容の正しさは分かりません。 問い合わせ文を処理する開発者向けに、3項目の出力契約とローカル検証コードを用意しました。APIの評価を始める前に、受け取った結果をどう判定するか確認できます。

2026年9月24日にLunaの文書構造化出力ガイドを確認しました。配布データと期待値は事前に作成した教材です。実行したのは検証器と応答パーサーで、Lunaの精度や速度は測っていません。

スキーマより先に分類ルールを決める

教材には二重請求、サインイン失敗、画面の見た目の変更、スキーマを無視するよう指示を含む通知の4件があります。問い合わせに書かれた指示は処理対象のデータであり、アプリが実行すべき命令ではありません。

出力はcategoryorder_idevidenceです。分類はbillingaccessotherのいずれか、注文番号がなければnull、根拠は原文の短い完全一致の抜粋とします。この練習では、支援を求めていない配送通知はotherです。実際のサポート業務に配送カテゴリがあるなら、ラベル設計を変えてください。

この練習用の分類ルールを実務に使う前に、結果を受け取って対応する担当者と確認してください。スキーマを満たす出力でも、誤った担当部署へ割り振る可能性があります。原文と結果の対応を保存し、なぜその担当部署へ振り分けたか再確認できるようにします。カテゴリが分かったことと、返金などの操作を実行してよいことも別です。

Responsesリクエストを組み立てる

教材ZIPrequest.jsonを開きます。モデルIDはgpt-6-lunareasoning.effortnoneを明示しています。再現可能な開始設定であり、すべての抽出に最適だと示したものではありません。

出力設定の位置を示す断片は次のとおりです。

"text": {
  "format": {
    "type": "json_schema",
    "name": "ticket",
    "strict": true,
    "schema": {"...": "use the complete schema.json in the lab"}
  }
}

これはそのまま実行できる完全なスキーマではありませんtext.formatjson_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の生成結果ですか?
いいえ。入力と期待値は事前に作成した合成データです。ローカルテストはモデルの正答率ではありません。
未完了の応答はどう扱いますか?
合格データに入れず、状態を保存します。原因に応じて回数を制限した再試行か人による確認を選びます。