Przewidywane dane wyjściowe (wersja zapoznawcza)
Przewidywane dane wyjściowe mogą poprawić opóźnienie odpowiedzi modelu na potrzeby wywołań czatu, w których wymagane są minimalne zmiany w większej treści tekstu. Jeśli prosisz model o podanie odpowiedzi, w której duża część oczekiwanej odpowiedzi jest już znana, przewidywane dane wyjściowe mogą znacznie zmniejszyć opóźnienie tego żądania. Ta funkcja jest szczególnie odpowiednia dla scenariuszy kodowania, w tym autouzupełniania, wykrywania błędów i edytowania w czasie rzeczywistym, gdzie szybkość i czas odpowiedzi mają kluczowe znaczenie dla deweloperów i użytkowników końcowych. Zamiast wygenerować ponownie cały tekst od podstaw, możesz wskazać modelowi, że większość odpowiedzi jest już znana, przekazując znany tekst do parametru prediction
.
Obsługa modelu
-
gpt-4o-mini
Wersja:2024-07-18
-
gpt-4o
Wersja:2024-08-06
-
gpt-4o
Wersja:2024-11-20
Obsługa interfejsu API
2025-01-01-preview
Nieobsługiwane funkcje
Przewidywane dane wyjściowe są obecnie tylko tekstem. Tych funkcji nie można używać w połączeniu z parametrem prediction
i przewidywanymi danymi wyjściowymi.
- Narzędzia/Wywoływanie funkcji
- modele/dane wejściowe i wyjściowe audio
-
n
wartości wyższe niż1
logprobs
-
presence_penalty
wartości większe niż0
-
frequency_penalty
wartości większe niż0
max_completion_tokens
Uwaga
Funkcja przewidywanych danych wyjściowych jest obecnie niedostępna dla modeli w regionie Azji Południowo-Wschodniej.
Wprowadzenie
Aby zademonstrować podstawy przewidywanych danych wyjściowych, zaczniemy od pytania modelu o refaktoryzację kodu z typowego problemu programistycznego FizzBuzz
w celu zastąpienia wystąpienia elementu FizzBuzz
MSFTBuzz
. Przekażemy nasz przykładowy kod do modelu w dwóch miejscach. Najpierw jako część komunikatu użytkownika w tablicy messages
/liście, a po raz drugi jako część zawartości nowego prediction
parametru.
Aby uzyskać dostęp do parametru prediction
, może być konieczne uaktualnienie biblioteki klienta 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))
Wyjście
{
"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"
}
}
}
]
}
Zwróć uwagę na dane wyjściowe nowych parametrów odpowiedzi dla accepted_prediction_tokens
i 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
}
Pomoc w accepted_prediction_tokens
zmniejszeniu opóźnienia odpowiedzi modelu, ale wszystkie mają rejected_prediction_tokens
takie same konsekwencje, jak dodatkowe tokeny wyjściowe generowane przez model. Z tego powodu, podczas gdy przewidywane dane wyjściowe mogą poprawić czasy odpowiedzi modelu, może to spowodować większe koszty. Należy ocenić i zrównoważyć zwiększoną wydajność modelu w stosunku do potencjalnych wzrostów kosztów.
Ważne jest również, aby zrozumieć, że użycie danych wyjściowych predykcyjnych nie gwarantuje zmniejszenia opóźnienia. Duże żądanie z większym procentem odrzuconych tokenów przewidywania niż zaakceptowane tokeny przewidywania może spowodować wzrost opóźnienia odpowiedzi modelu, a nie spadek.
Uwaga
W przeciwieństwie do buforowania monitów, które działa tylko wtedy, gdy ustawiona minimalna liczba tokenów początkowych na początku żądania jest taka sama, przewidywane dane wyjściowe nie są ograniczone przez lokalizację tokenu. Nawet jeśli tekst odpowiedzi zawiera nowe dane wyjściowe, które zostaną zwrócone przed przewidywanymi danymi wyjściowymi, accepted_prediction_tokens
nadal mogą wystąpić.
Przesyłanie strumieniowe
Przewidywana wydajność danych wyjściowych jest często najbardziej oczywista, jeśli zwracasz odpowiedzi z włączonym przesyłaniem strumieniowym.
Aby uzyskać dostęp do parametru prediction
, może być konieczne uaktualnienie biblioteki klienta 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='',)