Sdílet prostřednictvím


Predikované výstupy (Preview)

Predikované výstupy můžou zlepšit latenci odezvy modelu při voláních dokončení chatu, kde jsou potřeba minimální změny většího textu. Pokud žádáte model, aby poskytl odpověď, ve které je už známá velká část očekávané odpovědi, predikované výstupy můžou výrazně snížit latenci tohoto požadavku. Tato funkce je obzvláště vhodná pro scénáře psaní kódu, včetně automatického dokončování, detekce chyb a úprav v reálném čase, kde rychlost a rychlost odezvy jsou pro vývojáře a koncové uživatele zásadní. Namísto opětovného vygenerování veškerého textu od nuly můžete označit modelem, že většina odpovědí je již známa předáním známého textu parametru prediction .

Podpora modelů

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

Podpora rozhraní API

  • 2025-01-01-preview

Nepodporované funkce

Predikované výstupy jsou aktuálně jen pro text. Tyto funkce nelze použít ve spojení s parametrem prediction a predikovanými výstupy.

  • Nástroje nebo volání funkcí
  • zvukové modely/vstupy a výstupy
  • n hodnoty vyšší než 1
  • logprobs
  • presence_penalty hodnoty větší než 0
  • frequency_penalty hodnoty větší než 0
  • max_completion_tokens

Poznámka:

Funkce predikovaných výstupů je momentálně pro modely v oblasti Jihovýchodní Asie nedostupná.

Začínáme

Abychom si ukázali základy předpovídaného výstupu, začneme tím, že požádáme model, aby refaktoroval kód z běžného programovacího FizzBuzzFizzBuzzMSFTBuzzproblému, aby nahradil instanci . Vzorový kód předáme modelu na dvou místech. První jako součást zprávy uživatele v messages poli/seznamu a druhý čas jako součást obsahu nového prediction parametru.

Možná budete muset upgradovat klientskou knihovnu OpenAI pro přístup k parametru 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))

Výstup

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

Všimněte si ve výstupu nových parametrů odpovědi pro accepted_prediction_tokens a 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
    }

Pomáhá accepted_prediction_tokens snížit latenci odezvy modelu, ale všechny rejected_prediction_tokens mají stejné náklady jako další výstupní tokeny vygenerované modelem. Z tohoto důvodu mohou predikované výstupy zlepšit dobu odezvy modelu, což může vést k vyšším nákladům. Budete muset vyhodnotit a vyvážit vyšší výkon modelu oproti potenciálnímu nárůstu nákladů.

Je také důležité pochopit, že použití prediktivních výstupů nezaručuje snížení latence. Velký požadavek s větším procentem odmítnutých prediktivních tokenů než akceptovaných prediktivních tokenů může vést k nárůstu latence odezvy modelu, nikoli snížení.

Poznámka:

Na rozdíl od ukládání do mezipaměti , která funguje jenom v případě, že je stejný minimální počet počátečních tokenů na začátku požadavku, nejsou predikované výstupy omezeny umístěním tokenu. I když text odpovědi obsahuje nový výstup, který se vrátí před predikovaným výstupem, accepted_prediction_tokens může dojít i nadále.

Streamování

Predikované výstupy zvýšení výkonu je často zřejmé, pokud vracíte odpovědi s povoleným streamováním.

Možná budete muset upgradovat klientskou knihovnu OpenAI pro přístup k parametru 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='',)