Compartir a través de


Salidas predichas (versión preliminar)

Las salidas predichas pueden mejorar la latencia de respuesta del modelo para las llamadas de finalizaciones de chat en las que se necesitan cambios mínimos en un cuerpo de texto mayor. Si solicita al modelo que proporcione una respuesta en la que ya se conoce una gran parte de la respuesta esperada, las salidas previstas pueden reducir significativamente la latencia de esta solicitud. Esta funcionalidad es especialmente adecuada para escenarios de codificación, como autocompletar, detección de errores y edición en tiempo real, donde la velocidad y la capacidad de respuesta son fundamentales para los desarrolladores y los usuarios finales. En lugar de que el modelo vuelva a generar todo el texto desde cero, puede indicar al modelo que la mayoría de la respuesta ya se conoce pasando el texto conocido al prediction parámetro.

Compatibilidad con modelos

  • gpt-4o-mini versión: 2024-07-18
  • gpt-4o versión: 2024-08-06
  • gpt-4o versión: 2024-11-20

Compatibilidad con API

  • 2025-01-01-preview

Características no admitidas

Las salidas predichas son actualmente de solo texto. Estas características no se pueden usar junto con el parámetro prediction y las salidas previstas.

  • Llamadas a herramientas o funciones
  • modelos de audio/entradas y salidas
  • n valores superiores a 1
  • logprobs
  • presence_penalty valores mayores que 0
  • frequency_penalty valores mayores que 0
  • max_completion_tokens

Nota:

La característica de salidas previstas no está disponible actualmente para los modelos de la región Sudeste de Asia.

Introducción

Para demostrar los conceptos básicos de las salidas predichos, comenzaremos pidiendo a un modelo que refactorice el código del problema de programación FizzBuzz común para reemplazar la instancia de FizzBuzz por MSFTBuzz. Pasaremos el código de ejemplo al modelo en dos lugares. En primer lugar, como parte de un mensaje de usuario en la messages matriz o lista, y una segunda vez como parte del contenido del nuevo parámetro prediction.

Es posible que tenga que actualizar la biblioteca cliente de OpenAI para acceder al 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))

Resultados

{
  "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 en la salida los nuevos parámetros de respuesta para accepted_prediction_tokens y 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
    }

Ayuda accepted_prediction_tokens a reducir la latencia de respuesta del modelo, pero cualquier rejected_prediction_tokens tiene la misma implicación de costo que los tokens de salida adicionales generados por el modelo. Por este motivo, aunque las salidas previstas pueden mejorar los tiempos de respuesta del modelo, puede dar lugar a mayores costos. Tendrá que evaluar y equilibrar el aumento del rendimiento del modelo con respecto a los posibles aumentos en el costo.

También es importante comprender que el uso de salidas predictivas no garantiza una reducción de la latencia. Una solicitud grande con un mayor porcentaje de tokens de predicción rechazados que los tokens de predicción aceptados podrían dar lugar a un aumento de la latencia de respuesta del modelo, en lugar de una disminución.

Nota:

A diferencia de el almacenamiento en caché de mensajes que solo funciona cuando un número mínimo establecido de tokens iniciales al principio de una solicitud es idéntico, las salidas previstas no están restringidas por ubicación del token. Incluso si el texto de la respuesta contiene una nueva salida que se devolverá antes de la salida prevista, accepted_prediction_tokens todavía se puede producir.

Streaming

El aumento del rendimiento de las salidas previstas suele ser más obvio si devuelve las respuestas con streaming habilitado.

Es posible que tenga que actualizar la biblioteca cliente de OpenAI para acceder al 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='',)