Saídas previstas (pré-visualização)
As saídas previstas podem melhorar a latência de resposta do modelo para chamadas de conclusão de bate-papo onde são necessárias alterações mínimas em um corpo maior de texto. Se você estiver pedindo ao modelo para fornecer uma resposta onde uma grande parte da resposta esperada já é conhecida, as saídas previstas podem reduzir significativamente a latência dessa solicitação. Esse recurso é particularmente adequado para cenários de codificação, incluindo preenchimento automático, deteção de erros e edição em tempo real, onde a velocidade e a capacidade de resposta são críticas para desenvolvedores e usuários finais. Em vez de fazer com que o modelo regenere todo o texto do zero, você pode indicar ao modelo que a maior parte da resposta já é conhecida, passando o texto conhecido para o prediction
parâmetro.
Suporte ao modelo
-
gpt-4o-mini
Versão:2024-07-18
-
gpt-4o
Versão:2024-08-06
-
gpt-4o
Versão:2024-11-20
Suporte de API
2025-01-01-preview
Funcionalidades não suportadas
Atualmente, as saídas previstas são somente texto. Esses recursos não podem ser usados em conjunto com o parâmetro e as prediction
saídas previstas.
- Chamada de ferramentas/funções
- modelos/entradas e saídas de áudio
-
n
valores superiores a1
logprobs
-
presence_penalty
valores superiores a0
-
frequency_penalty
valores superiores a0
max_completion_tokens
Nota
O recurso de saídas previstas não está disponível para modelos na região Sudeste Asiático.
Introdução
Para demonstrar os conceitos básicos das saídas previstas, começaremos pedindo a um modelo que refatore o código do problema de programação FizzBuzz
comum para substituir a instância de FizzBuzz
por MSFTBuzz
. Passaremos nosso código de exemplo para o modelo em dois lugares. Primeiro como parte de uma mensagem de usuário na messages
matriz/lista e uma segunda vez como parte do conteúdo do novo prediction
parâmetro.
Talvez seja necessário atualizar sua biblioteca de cliente OpenAI para acessar o prediction
parâmetro.
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))
Saída
{
"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"
}
}
}
]
}
Observe na saída os novos parâmetros de resposta para accepted_prediction_tokens
e 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
}
A accepted_prediction_tokens
ajuda a reduzir a latência de resposta do modelo, mas qualquer um rejected_prediction_tokens
tem a mesma implicação de custo que os tokens de saída adicionais gerados pelo modelo. Por esse motivo, embora os resultados previstos possam melhorar os tempos de resposta do modelo, isso pode resultar em custos maiores. Você precisará avaliar e equilibrar o aumento do desempenho do modelo com os potenciais aumentos de custo.
Também é importante entender que o uso de saídas preditivas não garante uma redução na latência. Uma solicitação grande com uma porcentagem maior de tokens de previsão rejeitados do que os tokens de previsão aceitos pode resultar em um aumento na latência de resposta do modelo, em vez de uma diminuição.
Nota
Ao contrário do cache de prompt, que só funciona quando um número mínimo definido de tokens iniciais no início de uma solicitação são idênticos, as saídas previstas não são restringidas pela localização do token. Mesmo que o texto da resposta contenha uma nova saída que será retornada antes da saída prevista, accepted_prediction_tokens
ainda pode ocorrer.
Transmissão
O aumento de desempenho previsto das saídas geralmente é mais óbvio se você estiver retornando suas respostas com o streaming habilitado.
Talvez seja necessário atualizar sua biblioteca de cliente OpenAI para acessar o prediction
parâmetro.
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='',)