AGTCloud API Docs
ガイドAPIリファレンス連携とリソース更新とヘルプ

Structured Output

プログラムで解析、検証しやすい構造化データをモデルに返させます。

Structured Outputは、モデルに期待するデータ構造で結果を返させ、プログラムでのフィールド抽出、データベースへの保存、後続ワークフローへの受け渡しを容易にします。代表的な用途には、問い合わせの分類、フォーム抽出、コンテンツ審査結果、固定構造の分析レポートがあります。

Structured OutputとTool Callingは異なる問題を解決します

構造化された回答を返させる場合はStructured Outputを使用します。モデルに関数を選択させ、アプリケーションへ実行を要求させる場合はTool Callingを使用します。ツール引数もSchemaで制約できますが、ツール呼び出しループの一部です。

適切な出力方式を選択する

方式解決できる問題クライアント側で必要な処理
PromptでJSONを要求専用フィールドに対応しないモデルへ基本的な制約を加えるJSONを抽出、解析、検証し、失敗時に再試行する
JSON Object有効なJSONオブジェクトをモデルに出力させるフィールド、型、業務ルールを検証する
JSON Schemaリクエストに目標構造を指定するモデルの対応範囲、拒否、切り詰め、検証失敗を処理する

JSON Object、JSON Schema、厳密な準拠に対応するかどうかは、現在のモデルとプロトコルによって異なります。リクエストが200を返しただけで、指定したSchemaが有効になったと判断しないでください。

小さく明確なSchemaを定義する

次の構造は、顧客の問い合わせをサポートチケットに分類する例です。

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "enum": ["billing", "technical", "account"]
    },
    "priority": {
      "type": "integer",
      "minimum": 1,
      "maximum": 3
    },
    "summary": {
      "type": "string"
    }
  },
  "required": ["category", "priority", "summary"],
  "additionalProperties": false
}

フィールド名は安定して理解しやすいものにし、列挙値は業務コードと一致させてください。最初から深すぎる入れ子、多数の任意分岐、説明しにくい正規表現制約を使用しないでください。

Chat Completionsで構造化結果を返す

curl 'https://api.agtcloud.cn/v1/chat/completions' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer your-api-key' \
  --data '{
    "model": "MODEL_ID",
    "messages": [
      {
        "role": "user",
        "content": "API Keyが使用できません。この問い合わせを分類してください。"
      }
    ],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "support_ticket",
        "strict": true,
        "schema": {
          "type": "object",
          "properties": {
            "category": {
              "type": "string",
              "enum": ["billing", "technical", "account"]
            },
            "priority": {
              "type": "integer",
              "minimum": 1,
              "maximum": 3
            },
            "summary": {"type": "string"}
          },
          "required": ["category", "priority", "summary"],
          "additionalProperties": false
        }
      }
    }
  }'

strictは目標形式の一部ですが、利用できるかどうかはモデルによって決まります。完全なフィールドはChat Completions Referenceを参照してください。

プロトコルごとのフィールド位置

Chatはresponse_formatでjson_objectまたはjson_schemaを選択します。JSON Schemaを使用する場合、Schemaはresponse_format.json_schema.schemaに配置します。

{
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "support_ticket",
      "schema": {"type": "object"}
    }
  }
}

これらの構造を別のプロトコルへそのままコピーすることはできません。使用前にResponses ReferenceとGemini Generate Content Referenceを確認してください。

解析後も検証する

type SupportTicket = {
  category: 'billing' | 'technical' | 'account';
  priority: number;
  summary: string;
};

function parseTicket(raw: string): SupportTicket {
  const value: unknown = JSON.parse(raw);

  if (
    typeof value !== 'object' ||
    value === null ||
    !('category' in value) ||
    !('priority' in value) ||
    !('summary' in value)
  ) {
    throw new Error('構造化結果に必須フィールドがありません');
  }

  return value as SupportTicket;
}

この例は最小限の確認のみを示します。本番プロジェクトでは、業務データモデルと一致するSchemaバリデーターを使用し、列挙値、長さ、数値範囲、フィールド間ルールを検証してください。

不完全または無効な結果を処理する

状況処理方法
通常のテキストが返るモデルが目標形式に対応するか、フィールド位置とSDKによるリクエストの書き換えを確認する
JSONを解析できない機密情報を除いたレスポンスと停止理由を保存し、業務方針に従って限定的に再試行する
必須フィールドがない検証失敗として扱い、デフォルト値で重要なデータ不足を隠さない
出力が切り詰められた出力予算を調整するかSchemaを簡素化し、不足するJSONを推測して連結しない
モデルが回答を拒否した拒否を個別に処理し、拒否テキストを業務オブジェクトとして扱わない
Schemaは解析できるが業務上無効業務検証で明確なエラーを返すか、人手による処理へ移行する

公開前の確認

  • Schemaとアプリケーションの型定義を同じ情報源から生成するか、同期を維持する。
  • モデル切り替え前に、プロトコル、対応するSchemaのサブセット、厳密モードへの対応を再確認する。
  • 解析失敗、拒否、切り詰め、空出力に独立した処理分岐がある。
  • 構造化結果をデータベースへ保存する、または業務操作を開始する前に再検証する。
  • ログにはトラブルシューティングに必要な、機密情報を除いた情報だけを保存する。

まずモデルマーケットプレイスでモデルを確認し、その後、対応するAPI Referenceで完全なフィールドを確認してください。リクエストに失敗した場合はエラーとトラブルシューティングを参照してください。

このページの内容