ニュース

正確でエラー0、価格を入力すると壊れます! OpenAI公式発表 APIは構造化出力をサポート、JSON精度は100%

2024-08-07

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina



  新しい知恵のレポート

編集者:編集部
【新しい知恵の紹介】プログラマーにとって朗報です。 OpenAI が新たにリリースしたモデル API はすべて構造化出力をサポートしており、JSON スキーマの一致率は 100% と高く、コストは即座に半分に削減されます。
まだ頭を悩ませて、たくさんのプロンプトの言葉を考えたり、1 回の操作後のさまざまな出力結果のせいで頭が痛くなったりしていませんか?
OpenAI はついに大衆の声を聞き、開発者に待望の No.1 機能を提供しました。
OpenAI は本日、新機能のリリースを発表し、ChatGPT API が JSON 構造化出力をサポートするようになりました。
JSON (JavaScript Object Notation) は、人間にとって読みやすく、機械にとっても解析しやすいため、ファイルおよびデータ交換形式の業界標準です。
ただし、LLM は JSON に対して動作することが多く、指示に部分的にしか従わない応答を生成したり、完全には解析できない大量の「天国の本」を生成したりして幻覚を引き起こすことがよくあります。
このため、開発者は複数のオープンソース ツールを使用し、さまざまなプロンプトを試すか、リクエストを繰り返して目的の出力を生成する必要があり、時間と労力がかかります。
本日リリースされた構造化出力機能は、上記の厄介な問題を解決し、モデルによって生成された出力が JSON で指定されたスキーマと一致することを保証します。
構造化出力機能は常に開発者からの要望が最も多かった機能であり、このバージョンはユーザーからの要望に応えてリリースされたとウルトラマンもツイートで述べています。
OpenAIがリリースした新機能は確かに多くの開発者の心を打ち、彼らは口を揃えて「これは大変なことだ」と口を揃える。
「素晴らしい!」と称賛のメッセージを残す人も多かった。
OpenAI のこのアップデートにより、スタートアップが飲み込まれるのではないかと心配する人もいます。
しかし、より一般的なユーザーにとって、GPT-5 はいつリリースされるのかということの方が気になります。JSON スキーマについては、「それは何ですか?」ということです。
結局のところ、GPT-5 のニュースがなければ、この秋の OpenAI の DevDay は昨年よりもずっと静かになるかもしれません。

スキーマの一貫性を簡単に確保

構造化出力では、JSON Schemaを定義するだけで、AIは「意図的」ではなくなり、指示に従って従順にデータを出力します。
また、新機能によりAIがより従順になるだけでなく、出力内容の信頼性も大幅に向上します。
複雑な JSON スキーマの追跡評価では、構造化出力を備えた新しいモデル gpt-4o-2024-08-06 が 100% の完璧なスコアを獲得しました。比較すると、gpt-4-0613 のスコアは 40% 未満でした。
実際、JSON スキーマ関数は、昨年の DevDay に OpenAI によって開始されました。
今回、OpenAI は API でこの機能を拡張し、モデルによって生成された出力が開発者によって提供された JSON スキーマと正確に一致するようにしました。
非構造化入力から構造化データを生成することは、今日のアプリケーションにおける人工知能の中心的な使用例の 1 つです。
開発者は OpenAI API を使用して、関数呼び出しを通じてデータを取得して質問に答え、データ入力用の構造化データを抽出し、複数ステップのエージェント ワークフローを構築できる強力なアシスタントを構築して、LLM がアクションを実行できるようにします。

技術原則

OpenAI は、モデル出力と JSON スキーマの間の一致を改善するために 2 つの側面からのアプローチを採用しています。
モデルのパフォーマンスは大幅に向上し、ベンチマーク テストの精度は 93% に達しましたが、固有の不確実性は依然として残っています。
開発者が構築したアプリケーションの安定性を確保するために、OpenAI はモデルの出力を制約するためのより精度の高い方法を提供し、それによって 100% の信頼性を実現します。

制約のデコード

OpenAI は、制約付きサンプリングまたは制約付きデコーディングと呼ばれる手法を使用し、デフォルトでは、モデルは完全に制約のない出力を生成し、語彙から任意のトークンを次の出力として選択する可能性があります。
この柔軟性により、有効な JSON を生成するときに無効な文字を無計画に挿入するなどのエラーが発生する可能性があります。
このようなエラーを回避するために、OpenAI は動的制約デコード方式を使用して、生成された出力トークンが常に提供されたスキーマに準拠していることを保証します。
これを実現するために、OpenAI は提供された JSON スキーマをコンテキストフリー文法 (CFG) に変換します。
各 JSON スキーマについて、OpenAI はスキーマを表す構文を計算し、サンプリング中に前処理されたコンポーネントに効率的にアクセスします。
このアプローチにより、生成される出力がより正確になるだけでなく、不必要な遅延も削減されます。新しいスキーマに対する最初のリクエストには追加の処理時間がかかる場合がありますが、後続のリクエストはキャッシュ メカニズムを通じて迅速に応答されます。

オプション

CFG メソッドに加えて、他のメソッドは通常、制約のデコードに有限状態マシン (FSM) または正規表現を使用します。
ただし、これらのメソッドでは、有効なトークンを動的に更新する機能が制限されています。特に複雑なネストされたデータ構造や再帰的なデータ構造の場合、FSM は処理が難しいことがよくあります。
OpenAI の CFG メソッドは、複雑なスキーマを表現する場合に優れたパフォーマンスを発揮します。たとえば、再帰的スキーマをサポートする JSON スキーマは OpenAI API に実装されていますが、FSM メソッドでは表現できません。

投入コストを半分に節約

構造化出力は、最新の GPT-4o モデルや GPT-4o-mini モデル、微調整モデルなど、関数呼び出しをサポートするすべてのモデルで利用できます。
この機能は、Chat Completions API、Assistant API、および Batch API で利用でき、ビジュアル入力と互換性があります。
gpt-4o-2024-05-13 バージョンと比較して、gpt-4o-2024-08-06 バージョンは、入力側のコストを 50% 節約できます (100 万トークンあたり 250 ドル)。 、出力側のコストを 33% 節約します (10.00 ドル/100 万トークン)。

構造化された出力の使用方法

API で構造化出力を導入するために使用できる形式は 2 つあります。

関数呼び出し

ツールによる構造化された出力は、関数定義で strict: true を設定することで実現できます。
この機能は、gpt-4-0613 および gpt-3.5-turbo-0613 以降のすべてのモデルを含む、サポートされているツールを備えたすべてのモデルで利用できます。
構造化出力が有効になっている場合、モデル出力は提供されたツール定義と一致します。
リクエストの例:
出力例:
{
  "table_name": "orders",
  "columns": ["id", "status", "expected_delivery_date", "delivered_at"],
  "conditions": [
    {
      "column": "status",
      "operator": "=",
      "value": "fulfilled"
    },
    {
      "column": "ordered_at",
      "operator": ">=",
      "value": "2023-05-01"
    },
    {
      "column": "ordered_at",
      "operator": "<",
      "value": "2023-06-01"
    },
    {
      "column": "delivered_at",
      "operator": ">",
      "value": {
        "column_name": "expected_delivery_date"
      }
    }
  ],
  "order_by": "asc"
}

response_format パラメータの新しいオプション

開発者は、response_format の新しいオプション json_schema を介して、フォーマットされた出力を必要とするかどうかを選択できるようになりました。
この機能は、モデルがツールを呼び出すのではなく、構造化された方法でユーザーに応答する場合に役立ちます。
この機能は、本日リリースされた最新の GPT-4o モデル gpt-4o-2024-08-06 および gpt-4o-mini-2024-07-18 で利用できます。
response_format が strict:true に設定されている場合、モデル出力は指定されたスキーマと一致します。
リクエストの例:
出力例:
{
  "steps": [
    {
      "explanation": "Subtract 31 from both sides to isolate the term with x.",
      "output": "8x + 31 - 31 = 2 - 31"
    },
    {
      "explanation": "This simplifies to 8x = -29.",
      "output": "8x = -29"
    },
    {
      "explanation": "Divide both sides by 8 to solve for x.",
      "output": "x = -29 / 8"
    }
  ],
  "final_answer": "x = -29 / 8"
}
開発者は、構造化された出力を使用して、目的の出力をガイドすることで、段階的に回答を生成できます。
OpenAI によると、開発者は不正な応答を検証したり再試行したりする必要がなく、この機能によりプロンプトがよりシンプルになるという。

ネイティブSDKのサポート

OpenAI は、構造化出力をネイティブにサポートするために Python と Node SDK が更新されたと述べています。
スキーマまたは応答形式をツールに提供するのは、Pydantic または Zod オブジェクトを提供するのと同じくらい簡単です。OpenAI の SDK は、データ型をサポートされている JSON スキーマに変換し、JSON 応答を型付きデータ構造に自動的に逆シリアル化して、拒否を解析できます。
さらに、ネイティブ構造化出力サポートも、response_format で利用できます。

その他の使用例

開発者は多くの場合、OpenAI のモデルを使用して、さまざまなユースケースの構造化データを生成します。
他の例としては次のようなものがあります。
- ユーザーの意図に基づいてユーザーインターフェイスを動的に生成
開発者は構造化出力を使用して、コードまたは UI 生成アプリケーションを作成できます。
同じ応答形式を使用して、ユーザー入力に基づいて異なる UI を生成できます。
たとえば、「Gardener's Login Interface」を作成します。
これは次のコードで生成されます。
{
  "type": "div",
  "label": "",
  "children": [
    {
      "type": "header",
      "label": "",
      "children": [
        {
          "type": "div",
          "label": "Green Thumb Gardening",
          "children": [],
          "attributes": [{ "name": "className", "value": "site-title" }]
        },
        {
          "type": "div",
          "label": "Bringing Life to Your Garden",
          "children": [],
          "attributes": [{ "name": "className", "value": "site-tagline" }]
        }
      ],
      "attributes": [{ "name": "className", "value": "header" }]
    },
    {
      "type": "section",
      "label": "",
      "children": [
        {
          "type": "div",
          "label": "",
          "children": [
            {
              "type": "div",
              "label": "About Us",
              "children": [
                {
                  "type": "div",
                  "label": "At Green Thumb Gardening, we specialize in transforming your outdoor spaces into beautiful, thriving gardens. Our team has decades of experience in horticulture and landscape design.",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "about-description" }
                  ]
                }
              ],
              "attributes": [{ "name": "className", "value": "about-section" }]
            }
          ],
          "attributes": [{ "name": "className", "value": "content" }]
        }
      ],
      "attributes": [{ "name": "className", "value": "about-container" }]
    },
    {
      "type": "section",
      "label": "",
      "children": [
        {
          "type": "div",
          "label": "",
          "children": [
            {
              "type": "div",
              "label": "Our Services",
              "children": [
                {
                  "type": "div",
                  "label": "Garden Design",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "service-item" }
                  ]
                },
                {
                  "type": "div",
                  "label": "Plant Care & Maintenance",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "service-item" }
                  ]
                },
                {
                  "type": "div",
                  "label": "Seasonal Cleanup",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "service-item" }
                  ]
                },
                {
                  "type": "div",
                  "label": "Custom Landscaping",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "service-item" }
                  ]
                }
              ],
              "attributes": [{ "name": "className", "value": "services-list" }]
            }
          ],
          "attributes": [{ "name": "className", "value": "content" }]
        }
      ],
      "attributes": [{ "name": "className", "value": "services-container" }]
    }
  ],
  "attributes": [{ "name": "className", "value": "landing-page" }]
}
- 最終回答を根拠となる推論や追加のコメントから分離する
モデルに別個の思考連鎖フィールドを提供すると、応答の最終的な品質を向上させることができます。
聞く:
構造化された出力:
{
  "reasoning_steps": [
    "First step is to compare the numbers 9.11 and 9.9.",
    "Both numbers have the same whole number part, which is 9.",
    "To compare the decimal parts, convert them to the same number of decimal places.",
    "9.11 has two decimal places: it is 9.11.",
    "9.9 has one decimal place: it can be rewritten as 9.90.",
    "Now, compare 9.11 and 9.90 by looking at the decimal parts.",
    "Compare 11 with 90.",
    "90 is greater than 11, so 9.90 is greater than 9.11."
  ],
  "answer": "9.9 is bigger than 9.11."
}
- 非構造化データから構造化データを抽出する
たとえば、会議メモから ToDo、期限、割り当てなどを抽出するようにモデルに指示します。
聞く:
構造化された出力:
{
  "action_items": [
    {
      "description": "Collaborate on optimizing the path planning algorithm",
      "due_date": "2024-06-30",
      "owner": "Jason Li"
    },
    {
      "description": "Reach out to industry partners for additional datasets",
      "due_date": "2024-06-25",
      "owner": "Aisha Patel"
    },
    {
      "description": "Explore alternative LIDAR sensor configurations and report findings",
      "due_date": "2024-06-27",
      "owner": "Kevin Nguyen"
    },
    {
      "description": "Schedule extended stress tests for the integrated navigation system",
      "due_date": "2024-06-28",
      "owner": "Emily Chen"
    },
    {
      "description": "Retest the system after bug fixes and update the team",
      "due_date": "2024-07-01",
      "owner": "David Park"
    }
  ]
}
安全な構造化出力
OpenAI にとってセキュリティは最優先事項です。新しい構造化出力機能は、OpenAI の既存のセキュリティ ポリシーに準拠し、モデルが安全でないリクエストを拒否できるようにします。
開発を容易にするために、API 応答に新しい拒否文字列値が追加され、開発者はモデルがスキーマに一致する出力ではなく拒否を生成するかどうかをプログラムで検出できるようになりました。
応答に拒否が含まれておらず、モデルの応答が途中で中断されない場合 (finish_reason で示されるように)、モデルの応答は、指定されたスキーマと一致する有効な JSON を確実に生成します。
参考文献: