다음을 통해 공유


예측된 출력(미리 보기)

예측 출력은 더 큰 텍스트 본문에 최소한의 변경이 필요한 채팅 완료 호출에 대한 모델 응답 대기 시간을 향상시킬 수 있습니다. 모델에 예상 응답의 상당 부분이 이미 알려진 응답을 제공하도록 요청하는 경우 예측된 출력은 이 요청의 대기 시간을 크게 줄일 수 있습니다. 이 기능은 특히 개발자와 최종 사용자에게 속도와 응답성이 중요한 자동 완성, 오류 검색 및 실시간 편집을 비롯한 코딩 시나리오에 적합합니다. 모델이 모든 텍스트를 처음부터 다시 생성하도록 하는 대신, 알려진 텍스트를 prediction 매개 변수에 전달하여 대부분의 응답이 이미 알려져 있음을 모델에 나타낼 수 있습니다.

모델 지원

  • gpt-4o-mini 버전: 2024-07-18
  • gpt-4o 버전: 2024-08-06
  • gpt-4o 버전: 2024-11-20
  • gpt-4.1 버전: 2025-04-14
  • gpt-4.1-nano 버전: 2025-04-14
  • gpt-4.1-mini 버전: 2025-04-14

API 지원

2025-01-01-preview에 처음 도입되었습니다. 모든 후속 릴리스에서 지원됩니다.

지원되지 않는 기능

예측 출력은 현재 텍스트 전용입니다. 이러한 기능은 prediction 매개 변수 및 예측 출력과 함께 사용할 수 없습니다.

  • 도구/함수 호출
  • 오디오 모델/입력 및 출력
  • 1보다 높은 n
  • logprobs
  • 0보다 큰 presence_penalty
  • 0보다 큰 frequency_penalty
  • max_completion_tokens

비고

현재 동남 아시아 지역의 모델에는 예측 출력 기능을 사용할 수 없습니다.

시작하기

예측 출력의 기본 사항을 설명하기 위해 먼저 모델에게 일반적인 프로그래밍 FizzBuzz 문제에서 코드를 리팩터링하여 FizzBuzz 인스턴스를 MSFTBuzz로 바꾸도록 요청합니다. 예제 코드를 두 곳에서 모델에 전달합니다. 첫 번째는 messages 배열/목록에서 사용자 메시지의 일부로, 두 번째는 새 prediction 매개 변수의 콘텐츠의 일부로입니다.

prediction 매개 변수에 액세스하려면 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))

출력

{
  "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"
        }
      }
    }
  ]
}

출력에서 다음과 같은 accepted_prediction_tokensrejected_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
    }

accepted_prediction_tokens는 모델 응답 대기 시간을 줄이는 것을 돕지만 모든 rejected_prediction_tokens는 모델에 의해 생성된 추가 출력 토큰과 동일한 비용 영향을 줍니다. 이러한 이유로 예측된 출력은 모델 응답 시간을 향상시킬 수 있지만 비용이 더 커질 수 있습니다. 잠재적 비용 증가에 대한 증가된 모델 성능을 평가하고 균형을 유지해야 합니다.

예측 출력을 사용한다고 해서 대기 시간 감소가 보장되는 것은 아니라는 점을 이해하는 것도 중요합니다. 허용된 예측 토큰보다 거부된 예측 토큰의 비율이 높은 요청이 많으면 모델 응답 대기 시간이 감소하는 대신 증가할 수 있습니다.

비고

요청 시작 시 설정된 최소 초기 토큰 수가 동일한 경우에만 작동하는 프롬프트 캐싱과 달리 예측 출력은 토큰 위치에 의해 제한되지 않습니다. 응답 텍스트에 예측된 출력 이전에 반환될 새 출력이 포함되어 있더라도 accepted_prediction_tokens가 계속 발생할 수 있습니다.

스트리밍

스트리밍이 사용하도록 설정된 응답을 반환하는 경우 예측 출력 성능 향상이 가장 분명합니다.

prediction 매개 변수에 액세스하려면 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='',)