Bagikan melalui


Output yang diprediksi (pratinjau)

Output yang diprediksi dapat meningkatkan latensi respons model untuk panggilan penyelesaian obrolan di mana perubahan minimal diperlukan pada isi teks yang lebih besar. Jika Anda meminta model untuk memberikan respons di mana sebagian besar respons yang diharapkan sudah diketahui, output yang diprediksi dapat secara signifikan mengurangi latensi permintaan ini. Kemampuan ini sangat cocok untuk skenario pengodean, termasuk pelengkapan otomatis, deteksi kesalahan, dan pengeditan real time, di mana kecepatan dan responsivitas sangat penting bagi pengembang dan pengguna akhir. Daripada membuat model meregenerasi semua teks dari awal, Anda dapat menunjukkan ke model bahwa sebagian besar respons sudah diketahui dengan meneruskan teks yang diketahui ke prediction parameter.

Dukungan Model

  • gpt-4o-mini versi: 2024-07-18
  • gpt-4o versi: 2024-08-06
  • gpt-4o versi: 2024-11-20

Dukungan API

  • 2025-01-01-preview

Fitur yang tidak didukung

Output yang diprediksi saat ini hanya teks. Fitur-fitur ini tidak dapat digunakan bersama dengan parameter dan output yang prediction diprediksi.

  • Alat/Panggilan fungsi
  • model/input audio dan output
  • n nilai yang lebih tinggi dari 1
  • logprobs
  • presence_penalty nilai yang lebih besar dari 0
  • frequency_penalty nilai yang lebih besar dari 0
  • max_completion_tokens

Catatan

Fitur output yang diprediksi saat ini tidak tersedia untuk model di wilayah Asia Tenggara.

Memulai

Untuk menunjukkan dasar-dasar output yang diprediksi, kita akan mulai dengan meminta model untuk merefaktor kode dari masalah pemrograman FizzBuzz umum untuk mengganti instans FizzBuzz dengan MSFTBuzz. Kami akan meneruskan kode contoh kami ke model di dua tempat. Pertama sebagai bagian dari pesan pengguna dalam messages array/daftar, dan untuk kedua kalinya sebagai bagian dari konten parameter baru prediction .

Anda mungkin perlu meningkatkan pustaka klien OpenAI Anda untuk mengakses prediction parameter .

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))

Output

{
  "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"
        }
      }
    }
  ]
}

Perhatikan dalam output parameter respons baru untuk accepted_prediction_tokens dan rejected_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
    }

Bantuan accepted_prediction_tokens mengurangi latensi respons model, tetapi apa pun rejected_prediction_tokens memiliki implikasi biaya yang sama dengan token output tambahan yang dihasilkan oleh model. Untuk alasan ini, sementara output yang diprediksi dapat meningkatkan waktu respons model, itu dapat menghasilkan biaya yang lebih besar. Anda harus mengevaluasi dan menyeimbangkan peningkatan performa model terhadap potensi peningkatan biaya.

Penting juga untuk dipahami, bahwa menggunakan output prediktif tidak menjamin pengurangan latensi. Permintaan besar dengan persentase token prediksi yang ditolak yang lebih besar daripada token prediksi yang diterima dapat mengakibatkan peningkatan latensi respons model, bukan penurunan.

Catatan

Tidak seperti penembolokan perintah yang hanya berfungsi ketika jumlah minimum token awal yang ditetapkan di awal permintaan identik, output yang diprediksi tidak dibatasi oleh lokasi token. Bahkan jika teks respons Anda berisi output baru yang akan dikembalikan sebelum output yang diprediksi, accepted_prediction_tokens masih dapat terjadi.

Streaming

Peningkatan performa output yang diprediksi seringkali paling jelas jika Anda mengembalikan respons dengan streaming diaktifkan.

Anda mungkin perlu meningkatkan pustaka klien OpenAI Anda untuk mengakses prediction parameter .

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='',)