Saídas previstas (versão prévia)
As saídas previstas podem melhorar a latência de resposta do modelo para chamadas de conclusão de chat em que são necessárias alterações mínimas em um corpo de texto maior. Se você estiver solicitando que o modelo forneça uma resposta em que 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, detecção de erros e edição em tempo real, em que a velocidade e a capacidade de resposta são essenciais 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 parâmetro prediction
.
Suporte a modelo
- Versão
gpt-4o-mini
:2024-07-18
- Versão
gpt-4o
:2024-08-06
- Versão
gpt-4o
:2024-11-20
Suporte a API
2025-01-01-preview
Recursos sem suporte
No momento, as saídas previstas são somente texto. Esses recursos não podem ser usados em conjunto com o parâmetro prediction
e as saídas previstas.
- Ferramentas/Chamada de função
- Modelos de áudio/entradas e saídas
-
n
valores superiores a1
logprobs
-
presence_penalty
valores maiores que0
-
frequency_penalty
valores maiores que0
max_completion_tokens
Observação
No momento, o recurso de saídas previstas não está disponível para modelos na região do Sudeste da Ásia.
Introdução
Para demonstrar os conceitos básicos das saídas previstas, começaremos pedindo a um modelo para refatorar o código do problema comum de programação FizzBuzz
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 do usuário na matriz/lista messages
e uma segunda vez como parte do conteúdo do novo parâmetro prediction
.
Talvez seja necessário atualizar sua biblioteca de cliente OpenAI para acessar o parâmetro 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))
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
}
Os accepted_prediction_tokens
ajudar a reduzir a latência de resposta do modelo, mas qualquer rejected_prediction_tokens
ter a mesma implicação de custo que os tokens de saída adicionais gerados pelo modelo. Por esse motivo, embora as saídas previstas 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 em relação aos possíveis 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 tokens de previsão aceitos pode resultar em um aumento na latência de resposta do modelo, em vez de uma diminuição.
Observação
Ao contrário do cache prompt que só funciona quando um número mínimo definido de tokens iniciais no início de uma solicitação é idêntico, as saídas previstas não são restritas pela localização do token. Mesmo que o texto de resposta contenha uma nova saída que será retornada antes da saída prevista, accepted_prediction_tokens
ainda pode ocorrer.
Streaming
O aumento de desempenho de saídas previstas 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 parâmetro 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='',)