Udostępnij za pośrednictwem


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