Dela via


Förutsagda utdata (förhandsversion)

Förutsagda utdata kan förbättra svarsfördröjningen för modellen för chattavslutningar där minimala ändringar krävs för en större texttext. Om du ber modellen att ge ett svar där en stor del av det förväntade svaret redan är känt kan förutsagda utdata avsevärt minska svarstiden för den här begäran. Den här funktionen passar särskilt bra för kodningsscenarier, inklusive automatisk komplettering, felidentifiering och realtidsredigering, där hastighet och svarstider är viktiga för utvecklare och slutanvändare. I stället för att modellen återskapar all text från grunden kan du ange för modellen att det mesta av svaret redan är känt genom att skicka den kända texten till parametern prediction .

Modellstöd

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

API-stöd

  • 2025-01-01-preview

Funktioner som inte stöds

Förutsagda utdata är för närvarande endast text. Dessa funktioner kan inte användas tillsammans med parametern prediction och förutsagda utdata.

  • Verktyg/funktionsanrop
  • ljudmodeller/indata och utdata
  • n värden som är högre än 1
  • logprobs
  • presence_penalty värden som är större än 0
  • frequency_penalty värden som är större än 0
  • max_completion_tokens

Kommentar

Funktionen för förutsagda utdata är för närvarande inte tillgänglig för modeller i regionen Sydostasien.

Komma igång

För att demonstrera grunderna i förutsagda utdata börjar vi med att be en modell att omstrukturera koden från det vanliga programmeringsproblemet FizzBuzz för att ersätta instansen av FizzBuzz med MSFTBuzz. Vi skickar vår exempelkod till modellen på två platser. Först som en del av ett användarmeddelande i matrisen messages /listan och en andra gång som en del av innehållet i den nya prediction parametern.

Du kan behöva uppgradera OpenAI-klientbiblioteket för att få åtkomst till parametern prediction .

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

Observera i utdata de nya svarsparametrarna för accepted_prediction_tokens och 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
    }

Hjälp till accepted_prediction_tokens att minska svarsfördröjningen för modellen, men alla rejected_prediction_tokens har samma kostnadskonsekvenser som ytterligare utdatatoken som genereras av modellen. Därför kan förutsagda utdata förbättra modellens svarstider, men det kan leda till större kostnader. Du måste utvärdera och balansera den ökade modellprestandan mot potentiella kostnadsökningar.

Det är också viktigt att förstå att användning av förutsägande utdata inte garanterar en minskning av svarstiden. En stor begäran med en större procentandel avvisade förutsägelsetoken än accepterade förutsägelsetoken kan leda till en ökning av svarstiderna för modellen i stället för en minskning.

Kommentar

Till skillnad från promptcachelagring som bara fungerar när ett visst minsta antal initiala token i början av en begäran är identiska, begränsas inte förutsagda utdata av tokenplats. Även om svarstexten innehåller nya utdata som returneras före de förutsagda utdata kan accepted_prediction_tokens det fortfarande inträffa.

Strömning

Prestandaökningar för förutsagda utdata är ofta tydligast om du returnerar dina svar med strömning aktiverat.

Du kan behöva uppgradera OpenAI-klientbiblioteket för att få åtkomst till parametern prediction .

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