Compartilhar via


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 a 1
  • logprobs
  • presence_penalty valores maiores que 0
  • frequency_penalty valores maiores que 0
  • 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='',)