次の方法で共有


予測された出力 (プレビュー)

予測出力により、より大きなテキスト本文への最小限の変更が必要なチャット完了呼び出しのモデル応答待ち時間を改善できます。 期待される応答の大部分が既にわかっている応答をモデルに提供するよう求めている場合、予測される出力によって、この要求の待機時間が大幅に短縮される可能性があります。 この機能は、オートコンプリート、エラー検出、リアルタイム編集など、開発者やエンドユーザーにとって速度と応答性が重要なコーディング シナリオに特に適しています。 モデルですべてのテキストをゼロから再生成するのではなく、既知のテキストを prediction パラメーターに渡すことで、ほとんどの応答が既に認識されていることをモデルに示すことができます。

モデルのサポート

  • gpt-4o-mini のバージョン: 2024-07-18
  • gpt-4o のバージョン: 2024-08-06
  • gpt-4o のバージョン: 2024-11-20

API のサポート

  • 2025-01-01-preview

サポートされていない機能

予測出力は現在、テキストのみです。 これらの特徴は、prediction パラメーターおよび予測出力と組み合わせて使用することはできません。

  • ツール/関数呼び出し
  • オーディオ モデル/入力と出力
  • n の値は 1 よりも大きい
  • logprobs
  • presence_penalty の値は 0 よりも大きい
  • frequency_penalty の値は 0 よりも大きい
  • max_completion_tokens

Note

現在、予測出力機能は、東南アジア リージョンのモデルでは使用できません。

概要

予測される出力の基本を示すために、まず、FizzBuzz のインスタンスを MSFTBuzz に置き換えるために、一般的なプログラミング FizzBuzz の問題からコードをリファクタリングするようにモデルに依頼します。 サンプル コードをモデルに 2 か所で渡します。 最初に、messages 配列/リスト内のユーザー メッセージの一部として、2 回目は新しい prediction パラメーターの内容の一部として使用します。

prediction パラメーターにアクセスするには、OpenAI クライアント ライブラリのアップグレードが必要になる場合があります。

pip install openai --upgrade
import os
from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  azure_ad_token_provider=token_provider,
  api_version="2025-01-01-preview"
)

code = """
for number in range(1, 101):
    if number % 3 == 0 and number % 5 == 0:
        print("FizzBuzz")
    elif number % 3 == 0:
        print("Fizz")
    elif number % 5 == 0:
        print("Buzz")
    else:
        print(number)
"""

instructions = """
Replace string `FizzBuzz` with `MSFTBuzz`. Respond only 
with code, and with no markdown formatting.
"""


completion = client.chat.completions.create(
    model="gpt-4o-mini", # replace with your unique model deployment name
    messages=[
        {
            "role": "user",
            "content": instructions
        },
        {
            "role": "user",
            "content": code
        }
    ],
    prediction={
        "type": "content",
        "content": code
    }
)

print(completion.model_dump_json(indent=2))

出力

{
  "id": "chatcmpl-AskZk3P5QGmefqobDw4Ougo6jLxSP",
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "message": {
        "content": "for number in range(1, 101):\n    if number % 3 == 0 and number % 5 == 0:\n        print(\"MSFTBuzz\")\n    elif number % 3 == 0:\n        print(\"Fizz\")\n    elif number % 5 == 0:\n        print(\"Buzz\")\n    else:\n        print(number)",
        "refusal": null,
        "role": "assistant",
        "audio": null,
        "function_call": null,
        "tool_calls": null
      },
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "protected_material_code": {
          "filtered": false,
          "detected": false
        },
        "protected_material_text": {
          "filtered": false,
          "detected": false
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ],
  "created": 1737612112,
  "model": "gpt-4o-mini-2024-07-18",
  "object": "chat.completion",
  "service_tier": null,
  "system_fingerprint": "fp_5154047bf2",
  "usage": {
    "completion_tokens": 77,
    "prompt_tokens": 124,
    "total_tokens": 201,
    "completion_tokens_details": {
      "accepted_prediction_tokens": 6,
      "audio_tokens": 0,
      "reasoning_tokens": 0,
      "rejected_prediction_tokens": 4
    },
    "prompt_tokens_details": {
      "audio_tokens": 0,
      "cached_tokens": 0
    }
  },
  "prompt_filter_results": [
    {
      "prompt_index": 0,
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "jailbreak": {
          "filtered": false,
          "detected": false
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ]
}

出力で、accepted_prediction_tokensrejected_prediction_tokens の新しい応答パラメーターに注目してください:

  "usage": {
    "completion_tokens": 77,
    "prompt_tokens": 124,
    "total_tokens": 201,
    "completion_tokens_details": {
      "accepted_prediction_tokens": 6,
      "audio_tokens": 0,
      "reasoning_tokens": 0,
      "rejected_prediction_tokens": 4
    }

accepted_prediction_tokens はモデルの応答待機時間を短縮するのに役立ちますが、rejected_prediction_tokens は、モデルによって生成される追加の出力トークンと同じコストへの影響を与えます。 このため、予測された出力によってモデルの応答時間が向上する一方で、コストが大きくなる可能性があります。 モデルのパフォーマンスの向上を評価し、コストの増加の可能性とバランスを取る必要があります。

予測出力を使用しても待機時間が短縮されるわけではないことを理解することも重要です。 拒否された予測トークンの割合が、受け入れられた予測トークンよりも多い大きな要求では、モデル応答の待機時間が減少するのではなく、増加する可能性があります。

Note

要求の開始時に設定された最小数の初期トークンが同一の場合にのみ機能するプロンプト キャッシュとは異なり、予測出力はトークンの場所によって制約されません。 予測出力の前に返される新しい出力が応答テキストに含まれている場合でも、accepted_prediction_tokens は引き続き発生する可能性があります。

ストリーミング

ストリーミングを有効にして応答を返す場合、予測される出力のパフォーマンス向上は、多くの場合、最も明白です。

prediction パラメーターにアクセスするには、OpenAI クライアント ライブラリのアップグレードが必要になる場合があります。

pip install openai --upgrade
import os
from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  azure_ad_token_provider=token_provider,
  api_version="2025-01-01-preview"
)

code = """
for number in range(1, 101):
    if number % 3 == 0 and number % 5 == 0:
        print("FizzBuzz")
    elif number % 3 == 0:
        print("Fizz")
    elif number % 5 == 0:
        print("Buzz")
    else:
        print(number)
"""

instructions = """
Replace string `FizzBuzz` with `MSFTBuzz`. Respond only 
with code, and with no markdown formatting.
"""


completion = client.chat.completions.create(
    model="gpt-4o-mini", # replace with your unique model deployment name
    messages=[
        {
            "role": "user",
            "content": instructions
        },
        {
            "role": "user",
            "content": code
        }
    ],
    prediction={
        "type": "content",
        "content": code
    },
    stream=True
)

for chunk in completion:
    if chunk.choices and chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end='',)