Rozpoczynanie pracy z wdrożeniami wsadowymi Azure OpenAI

Interfejs Batch API usługi Azure OpenAI efektywnie obsługuje zadania przetwarzania na dużą skalę oraz przetwarzanie dużych wolumenów danych. Przetwarza asynchroniczne grupy żądań z oddzielnym limitem i oferuje docelowy 24-godzinny czas realizacji przy koszcie o 50% niższym niż standard globalny. W przypadku przetwarzania wsadowego wysyłasz dużą liczbę żądań w jednym pliku zamiast wysyłać jedno żądanie naraz. Globalne żądania wsadowe mają oddzielny limit tokenów w kolejce, więc obciążenia online nie ulegają zakłóceniom.

Kluczowe przypadki użycia obejmują:

  • Przetwarzanie danych na dużą skalę: Szybko analizuj duże zbiory danych równolegle.

  • Generowanie zawartości: Utwórz duże ilości tekstu, takie jak opisy produktów lub artykuły.

  • Przegląd dokumentów i podsumowanie: Automatyzowanie przeglądu i podsumowywania długich dokumentów.

  • Automatyzacja obsługi klienta: Obsługa wielu zapytań jednocześnie w celu uzyskania szybszych odpowiedzi.

  • Wyodrębnianie i analiza danych: Wyodrębnianie i analizowanie informacji z ogromnych ilości danych bez struktury.

  • Zadania przetwarzania języka naturalnego (NLP): Wykonywanie zadań, takich jak analiza tonacji lub tłumaczenie dużych zestawów danych.

  • Marketing i personalizacja: Generowanie spersonalizowanej zawartości i rekomendacji na dużą skalę.

Wskazówka

Jeśli zadania wsadowe są tak duże, że osiągasz limit tokenów w kolejce nawet po wykorzystaniu maksymalnego limitu przydziału dla wdrożenia, niektóre regiony udostępniają teraz nową funkcję, która umożliwia kolejkowanie wielu zadań wsadowych z wykładniczo rosnącymi odstępami między ponowieniami.

Po udostępnieniu limitu tokenów w kolejce, można utworzyć i zainicjować następne zadanie wsadowe automatycznie. Aby dowiedzieć się więcej, zobacz Automatyzowanie ponownych prób dużych zadań wsadowych przy zastosowaniu wycofywania wykładniczego.

Ważne

Usługa ma przetwarzać żądania wsadowe w ciągu 24 godzin, ale nie anuluje zadań, które trwają dłużej. Zadanie można anulować w dowolnym momencie. Po anulowaniu zadania usługa anuluje wszelkie pozostałe prace i zwraca wszystkie już ukończone prace. Płacisz za każdą ukończoną pracę.

Dane przechowywane w spoczynku pozostają w wyznaczonej lokalizacji geograficznej Azure, podczas gdy dane mogą być przetwarzane do wnioskowania w dowolnej lokalizacji Azure OpenAI.  Dowiedz się więcej na temat rezydencji danych. 

Obsługa usługi Batch

Globalna dostępność modelu wsadowego

Region gpt-5.4-mini, 2026-03-17 gpt-5.4, 2026-03-05 gpt-5.1, 2025-11-13 gpt-5, 2025-08-07 o3, 2025-04-16 o4-mini, 2025-04-16 gpt-4.1, 2025-04-14 gpt-4.1-nano, 2025-04-14 gpt-4.1-mini, 2025-04-14 o3-mini, 2025-01-31 gpt-4o, 2024-05-13 gpt-4o, 2024-08-06 gpt-4o, 2024-11-20 gpt-4o-mini, 2024-07-18
australiaeast
brazilsouth
canadaeast
centralus
eastus
eastus2
francecentral
Niemcy Zachód-Centrum
japaneast
koreacentral
northcentralus
Norwegia Wschód
polandcentral
southafricanorth
southcentralus
Południowe Indie
swedencentral
switzerlandnorth
uksouth
westeurope
westus
westus3

Uwaga

Chociaż usługa Global Batch obsługuje starsze wersje interfejsu API, niektóre modele wymagają nowszych wersji interfejsu API. Na przykład o3-mini nie jest obsługiwany z 2024-10-21, ponieważ został wydany po tej dacie. Aby uzyskać dostęp do nowszych modeli za pomocą usługi Global Batch, użyj interfejsu API w wersji 1.

Obsługa funkcji

Następujące funkcje nie są obecnie obsługiwane:

  • Integracja z interfejsem API Asystentów.
  • Integracja z funkcją Azure OpenAI na Twoich Danych.

Wdrażanie wsadowe

Uwaga

W portalu Microsoft Foundry typy wdrożeń wsadowych są wyświetlane jako Global-Batch i Data Zone Batch. Aby dowiedzieć się więcej na temat typów wdrożeń Azure OpenAI, zobacz przewodnik >.

Wskazówka

Zalecamy włączenie dynamicznego limitu przydziału dla wszystkich wdrożeń globalnych modeli wsadowych, aby uniknąć błędów zadań z powodu niewystarczającego limitu przydziału tokenu w kolejce. Użycie przydziału dynamicznego umożliwia rozmieszczeniu korzystanie z większego przydziału, gdy dostępna jest dodatkowa wydajność. Po wyłączeniu przydziału dynamicznego, wdrożenie będzie mogło przetwarzać żądania tylko do limitu tokenów w kolejce, który został zdefiniowany podczas tworzenia wdrożenia.

Wymagania wstępne

  • Subskrypcja Azure — Utwórz ją bezpłatnie.
  • Model zasobów typu GlobalBatch lub DataZoneBatch został wdrożony.

Przygotowywanie pliku wsadowego

Podobnie jak w przypadku dostrajania, usługa Batch używa plików w formacie wierszy JSON (.jsonl). Poniżej przedstawiono kilka przykładowych plików z różnymi typami obsługiwanej zawartości:

Format danych wejściowych

Interfejs API odpowiedzi

{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}

Interfejs API uzupełniania czatów

{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

Element custom_id jest wymagany, aby umożliwić określenie, które pojedyncze żądanie wsadowe odpowiada danej odpowiedzi. Odpowiedzi nie będą zwracane w identycznej kolejności niż kolejność zdefiniowana w pliku wsadowym .jsonl .

model Atrybut powinien być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby odpowiadał nazwie globalnego wdrożenia Batch, które ma być używane do generowania odpowiedzi inferencyjnych. Ta sama nazwa wdrożenia globalnego modelu Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz celować w inne wdrożenie, musisz to zrobić w osobnym pliku/zadaniu wsadowym.

Aby uzyskać najlepszą wydajność, zalecamy przesyłanie dużych plików do przetwarzania wsadowego, a nie dużej liczby małych plików z zaledwie kilkoma wierszami w każdym pliku.

Tworzenie pliku wejściowego

W tym artykule utworzymy plik o nazwie test.jsonl i skopiujemy zawartość ze standardowego bloku kodu wejściowego powyżej do pliku. Musisz zmodyfikować i dodać globalną nazwę wdrożenia wsadowego do każdego wiersza pliku.

Utwórz zadanie wsadowe

Po przygotowaniu pliku wejściowego najpierw trzeba przesłać plik, aby móc zainicjować zadanie wsadowe. Przekazywanie plików można wykonać programowo lub za pośrednictwem portalu Microsoft Foundry. W tym przykładzie pokazano przekazywanie pliku bezpośrednio do zasobu Azure OpenAI. Alternatywnie można konfigurować Azure Blob Storage dla usługi Azure OpenAI Batch.

  1. Zaloguj się do Microsoft Foundry. Upewnij się, że przełącznik New Foundry jest włączony. Te kroki dotyczą rozwiązania Foundry (nowy).

  2. W prawym górnym rogu wybierz pozycję Kompilacja

  3. W okienku po lewej stronie wybierz pozycję Modele

  4. Wybierz Zadania wsadowe>utwórz zadanie wsadowe

    Zrzut ekranu z nowego środowiska tworzenia partii w Foundry.

Śledzenie postępu pracy wsadowej

Po utworzeniu zadania możesz monitorować postęp zadania, wybierając identyfikator zadania dla ostatnio utworzonego zadania. Domyślnie nastąpi przekierowanie na stronę stanu dla ostatnio utworzonego zadania wsadowego.

Stan zadania można śledzić w okienku po prawej stronie:

Pobieranie pliku wyjściowego zadania wsadowego

Po zakończeniu lub osiągnięciu stanu terminalu zadanie spowoduje wygenerowanie pliku błędu i pliku wyjściowego, który można pobrać do przeglądu, wybierając odpowiedni przycisk z ikoną strzałki w dół.

Anulowanie partii

Anuluje trwającą partię roboczą. Partia będzie w stanie cancelling do 10 minut przed zmianą na cancelled, gdzie będzie mieć częściowe wyniki (jeśli istnieją) dostępne w pliku wyjściowym.

Wymagania wstępne

Kroki opisane w tym artykule mają być uruchamiane sekwencyjnie w notatnikach Jupyter. Z tego powodu utworzymy wystąpienie klienta Azure OpenAI tylko raz na początku naszych przykładów. Jeśli chcesz uruchomić krok poza ustaloną kolejnością, często wymagane jest skonfigurowanie klienta Azure OpenAI jako element tego wywołania.

Nawet jeśli masz już zainstalowaną bibliotekę openAI Python, może być konieczne uaktualnienie instalacji do najnowszej wersji:

!pip install openai --upgrade

Przygotowywanie pliku wsadowego

Podobnie jak dostrajanie, globalna partia używa plików w formacie wierszy JSON (.jsonl). Poniżej przedstawiono kilka przykładowych plików z różnymi typami obsługiwanej zawartości:

Format danych wejściowych

Interfejs API odpowiedzi

{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}

Interfejs API uzupełniania czatów

{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

Element custom_id jest wymagany, aby umożliwić określenie, które pojedyncze żądanie wsadowe odpowiada danej odpowiedzi. Odpowiedzi nie będą zwracane w identycznej kolejności niż kolejność zdefiniowana w pliku wsadowym .jsonl .

model Atrybut powinien być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby odpowiadał nazwie globalnego wdrożenia Batch, które ma być używane do generowania odpowiedzi inferencyjnych. Ta sama nazwa wdrożenia globalnego modelu Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz celować w inne wdrożenie, musisz to zrobić w osobnym pliku/zadaniu wsadowym.

Aby uzyskać najlepszą wydajność, zalecamy przesyłanie dużych plików do przetwarzania wsadowego, a nie dużej liczby małych plików z zaledwie kilkoma wierszami w każdym pliku.

Tworzenie pliku wejściowego

W tym artykule utworzymy plik o nazwie test.jsonl i skopiujemy zawartość ze standardowego bloku kodu wejściowego powyżej do pliku. Musisz zmodyfikować i dodać globalną nazwę wdrożenia wsadowego do każdego wiersza pliku. Zapisz ten plik w tym samym katalogu, w którym wykonujesz Jupyter Notebook.

Przesyłanie pliku wsadowego

Po przygotowaniu pliku wejściowego najpierw trzeba przesłać plik, aby móc zainicjować zadanie wsadowe. Przekazywanie plików można wykonać programowo lub za pośrednictwem portalu Microsoft Foundry. W tym przykładzie pokazano przekazywanie pliku bezpośrednio do zasobu Azure OpenAI. Alternatywnie można konfigurować Azure Blob Storage dla usługi Azure OpenAI Batch.

import os
from datetime import datetime
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

# Upload a file with a purpose of "batch"
file = client.files.create(
  file=open("test.jsonl", "rb"), 
  purpose="batch",
  extra_body={"expires_after":{"seconds": 1209600, "anchor": "created_at"}} # Optional you can set to a number between 1209600-2592000. This is equivalent to 14-30 days
)

print(file.model_dump_json(indent=2))

print(f"File expiration: {datetime.fromtimestamp(file.expires_at) if file.expires_at is not None else 'Not set'}")

file_id = file.id

Obiekt expires_after powoduje, że plik wejściowy wygaśnie po 14 dniach od utworzenia. Ustaw seconds na wartość od 1209600 do 2592000, aby wybrać okres ważności od 14 do 30 dni. Ustawienie wygaśnięcia zwiększa również limit plików wejściowych. Aby uzyskać szczegółowe informacje, zobacz Limity usługi Batch.

Wyjście:

{
  "id": "file-655111ec9cfc44489d9af078f08116ef",
  "bytes": 176064,
  "created_at": 1743391067,
  "filename": "test.jsonl",
  "object": "file",
  "purpose": "batch",
  "status": "processed",
  "expires_at": 1744600667,
  "status_details": null
}
File expiration: 2025-04-13 23:17:47

Utwórz zadanie wsadowe

Po pomyślnym przesłaniu pliku można przesłać plik do przetwarzania wsadowego.

# Submit a batch job with the file
batch_response = client.batches.create(
    input_file_id=file_id,
    endpoint="/chat/completions", # While passing this parameter is required, the system will read your input file to determine if the chat completions or responses API is needed.  
    completion_window="24h",
    # extra_body={"output_expires_after":{"seconds": 1209600, "anchor": "created_at"}} # Optional you can set to a number between 1209600-2592000. This is equivalent to 14-30 days
)

# Save batch ID for later use
batch_id = batch_response.id

print(batch_response.model_dump_json(indent=2))

Uwaga

Obecnie okno uzupełniania musi być ustawione na 24h. Jeśli ustawisz inną wartość niż 24h zadanie, zakończy się niepowodzeniem. Zadania trwające dłużej niż 24 godziny będą nadal wykonywane do momentu anulowania.

Wyjście:

{
  "id": "batch_6caaf24d-54a5-46be-b1b7-518884fcbdde",
  "completion_window": "24h",
  "created_at": 1722476583,
  "endpoint": null,
  "input_file_id": "file-655111ec9cfc44489d9af078f08116ef",
  "object": "batch",
  "status": "validating",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "error_file_id": null,
  "errors": null,
  "expired_at": null,
  "expires_at": 1722562983,
  "failed_at": null,
  "finalizing_at": null,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": null,
  "request_counts": {
    "completed": 0,
    "failed": 0,
    "total": 0
  }
}

Jeśli zadania wsadowe są tak duże, że osiągasz limit umieszczonych tokenów nawet po osiągnięciu maksymalnego przydziału dla wdrożenia, niektóre regiony obsługują teraz nową funkcję szybkiego przerywania, która umożliwia umieszczanie w kolejce wielu zadań wsadowych z wykładniczym opóźnieniem, więc po zakończeniu jednego dużego zadania wsadowego następne może być uruchomione automatycznie. Aby dowiedzieć się więcej o regionach obsługujących tę funkcję i sposobie dostosowywania kodu do korzystania z niej, zobacz kolejkowanie zadań wsadowych.

Śledzenie postępu pracy wsadowej

Po pomyślnym utworzeniu zadania wsadowego, możesz monitorować jego postęp w programie Studio lub w sposób programowy. Podczas sprawdzania postępu zadania wsadowego zalecamy odczekywanie co najmniej 60 sekund między każdym wywołaniem stanu.

import time
import datetime 

status = "validating"
while status not in ("completed", "failed", "canceled"):
    time.sleep(60)
    batch_response = client.batches.retrieve(batch_id)
    status = batch_response.status
    print(f"{datetime.datetime.now()} Batch Id: {batch_id},  Status: {status}")

if batch_response.status == "failed":
    for error in batch_response.errors.data:  
        print(f"Error code {error.code} Message {error.message}")

Wyjście:

2024-07-31 21:48:32.556488 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: validating
2024-07-31 21:49:39.221560 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:50:53.383138 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:52:07.274570 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:53:21.149501 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:54:34.572508 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:55:35.304713 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:56:36.531816 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:57:37.414105 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: completed

Możliwe są następujące wartości stanu:

Stan Opis
validating Plik wejściowy jest weryfikowany przed rozpoczęciem przetwarzania wsadowego.
failed Plik wejściowy zakończył się niepowodzeniem w procesie walidacji.
in_progress Plik wejściowy został pomyślnie zweryfikowany, a partia jest obecnie uruchomiona.
finalizing Seria została ukończona, a wyniki są w trakcie przygotowywania.
completed Partia została ukończona, a wyniki są gotowe.
expired Nie udało się ukończyć serii w 24-godzinnym przedziale czasu.
cancelling Trwa przetwarzanie wsadowe cancelled (może to potrwać do 10 minut).
cancelled Partia była cancelled.

Aby sprawdzić szczegóły stanu zadania, można uruchomić:

print(batch_response.model_dump_json(indent=2))

Wyjście:

{
  "id": "batch_6caaf24d-54a5-46be-b1b7-518884fcbdde",
  "completion_window": "24h",
  "created_at": 1722476583,
  "endpoint": null,
  "input_file_id": "file-9f3a81d899b4442f98b640e4bc3535dd",
  "object": "batch",
  "status": "completed",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": 1722477429,
  "error_file_id": "file-c795ae52-3ba7-417d-86ec-07eebca57d0b",
  "errors": null,
  "expired_at": null,
  "expires_at": 1722562983,
  "failed_at": null,
  "finalizing_at": 1722477177,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": "file-3304e310-3b39-4e34-9f1c-e1c1504b2b2a",
  "request_counts": {
    "completed": 3,
    "failed": 0,
    "total": 3
  }
}

Zwróć uwagę, że istnieje zarówno error_file_id, jak i odrębny output_file_id. Użyj error_file_id, aby pomóc w debugowaniu wszelkich problemów występujących w zadaniu wsadowym.

Pobieranie pliku wyjściowego zadania wsadowego

import json

output_file_id = batch_response.output_file_id

if not output_file_id:
    output_file_id = batch_response.error_file_id

if output_file_id:
    file_response = client.files.content(output_file_id)
    raw_responses = file_response.text.strip().split('\n')  

    for raw_response in raw_responses:  
        json_response = json.loads(raw_response)  
        formatted_json = json.dumps(json_response, indent=2)  
        print(formatted_json)

Wyjście:

W celu zwięzłości uwzględniamy tylko jedną odpowiedź na ukończenie czatu w danych wyjściowych. Jeśli wykonasz kroki opisane w tym artykule, powinny istnieć trzy odpowiedzi podobne do poniższego:

Ukończenie czatu

{
  "custom_id": "task-0",
  "response": {
    "body": {
      "choices": [
        {
          "content_filter_results": {
            "hate": {
              "filtered": false,
              "severity": "safe"
            },
            "self_harm": {
              "filtered": false,
              "severity": "safe"
            },
            "sexual": {
              "filtered": false,
              "severity": "safe"
            },
            "violence": {
              "filtered": false,
              "severity": "safe"
            }
          },
          "finish_reason": "stop",
          "index": 0,
          "logprobs": null,
          "message": {
            "content": "Microsoft was founded on April 4, 1975, by Bill Gates and Paul Allen in Albuquerque, New Mexico.",
            "role": "assistant"
          }
        }
      ],
      "created": 1722477079,
      "id": "chatcmpl-9rFGJ9dh08Tw9WRKqaEHwrkqRa4DJ",
      "model": "gpt-4o-2024-05-13",
      "object": "chat.completion",
      "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"
            }
          }
        }
      ],
      "system_fingerprint": "fp_a9bfe9d51d",
      "usage": {
        "completion_tokens": 24,
        "prompt_tokens": 27,
        "total_tokens": 51
      }
    },
    "request_id": "660b7424-b648-4b67-addc-862ba067d442",
    "status_code": 200
  },
  "error": null
}

Interfejs API odpowiedzi

{
  "custom_id": "task-0",
  "response": {
    "body": {
      "id": "resp_0e5c78eb05ee70cf00690cc6d988e4819587556df17436a206",
      "created_at": 1762445017.0,
      "error": null,
      "incomplete_details": null,
      "instructions": null,
      "metadata": {},
      "model": "gpt-4.1-batch",
      "object": "response",
      "output": [
        {
          "id": "msg_0e5c78eb05ee70cf00690cc6da3c548195aae483031113df16",
          "content": [
            {
              "annotations": [],
              "text": "Microsoft was founded on **April 4, 1975** by **Bill Gates** and **Paul Allen**.",
              "type": "output_text",
              "logprobs": []
            }
          ],
          "role": "assistant",
          "status": "completed",
          "type": "message"
        }
      ],
      "parallel_tool_calls": true,
      "temperature": 1.0,
      "tool_choice": "auto",
      "tools": [],
      "top_p": 1.0,
      "background": false,
      "max_output_tokens": null,
      "max_tool_calls": null,
      "previous_response_id": null,
      "prompt_cache_key": null,
      "reasoning": {
        "effort": null,
        "summary": null
      },
      "safety_identifier": null,
      "service_tier": "default",
      "status": "completed",
      "text": {
        "format": {
          "type": "text"
        },
        "verbosity": "medium"
      },
      "top_logprobs": 0,
      "truncation": "disabled",
      "usage": {
        "input_tokens": 16,
        "input_tokens_details": {
          "cached_tokens": 0
        },
        "output_tokens": 25,
        "output_tokens_details": {
          "reasoning_tokens": 0
        },
        "total_tokens": 41
      },
      "user": null,
      "content_filters": null,
      "store": true
    },
    "request_id": "809b30c2-fa0b-4613-b5cc-c30f6b780c9a",
    "status_code": 200
  },
  "error": null
}

Dodatkowe polecenia wsadowe

Anulowanie partii

Anuluje trwającą partię roboczą. Partia będzie w stanie cancelling do 10 minut przed zmianą na cancelled, gdzie będzie mieć częściowe wyniki (jeśli istnieją) dostępne w pliku wyjściowym.

client.batches.cancel("batch_abc123") # set to your batch_id for the job you want to cancel

Lista partii

Wyświetl listę zadań wsadowych dla określonego zasobu Azure OpenAI.

client.batches.list()

Metody list w bibliotece Pythona są stronicowane.

Aby wyświetlić listę wszystkich zadań:

all_jobs = []
# Automatically fetches more pages as needed.
for job in client.batches.list(
    limit=20,
):
    # Do something with job here
    all_jobs.append(job)
print(all_jobs)

Lista wsadowa (wersja zapoznawcza)

Użyj interfejsu API REST, aby wyświetlić listę wszystkich zadań wsadowych z dodatkowymi opcjami sortowania/filtrowania.

W poniższych przykładach udostępniamy generate_time_filter funkcję, aby ułatwić konstruowanie filtru. Jeśli nie chcesz używać tej funkcji, format ciągu filtru będzie wyglądać następująco: created_at gt 1728860560 and status eq 'Completed'.

import requests
import json
from datetime import datetime, timedelta
from azure.identity import DefaultAzureCredential

token_credential = DefaultAzureCredential()
token = token_credential.get_token('https://ai.azure.com/.default')

endpoint = "https://{YOUR_RESOURCE_NAME}.openai.azure.com/"
api_version = "2025-03-01-preview"
url = f"{endpoint}openai/batches"
order = "created_at asc"
time_filter =  lambda: generate_time_filter("past 8 hours")

# Additional filter examples:
#time_filter =  lambda: generate_time_filter("past 1 day")
#time_filter =  lambda: generate_time_filter("past 3 days", status="Completed")

def generate_time_filter(time_range, status=None):
    now = datetime.now()
    
    if 'day' in time_range:
        days = int(time_range.split()[1])
        start_time = now - timedelta(days=days)
    elif 'hour' in time_range:
        hours = int(time_range.split()[1])
        start_time = now - timedelta(hours=hours)
    else:
        raise ValueError("Invalid time range format. Use 'past X day(s)' or 'past X hour(s)'")
    
    start_timestamp = int(start_time.timestamp())
    
    filter_string = f"created_at gt {start_timestamp}"
    
    if status:
        filter_string += f" and status eq '{status}'"
    
    return filter_string

filter = time_filter()

headers = {'Authorization': 'Bearer ' + token.token}

params = {
    "api-version": api_version,
    "$filter": filter,
    "$orderby": order
}

response = requests.get(url, headers=headers, params=params)

json_data = response.json()

if response.status_code == 200:
    print(json.dumps(json_data, indent=2))
else:
    print(f"Request failed with status code: {response.status_code}")
    print(response.text)  

Wyjście:

{
  "data": [
    {
      "cancelled_at": null,
      "cancelling_at": null,
      "completed_at": 1729011896,
      "completion_window": "24h",
      "created_at": 1729011128,
      "error_file_id": "file-472c0626-4561-4327-9e4e-f41afbfb30e6",
      "expired_at": null,
      "expires_at": 1729097528,
      "failed_at": null,
      "finalizing_at": 1729011805,
      "id": "batch_4ddc7b60-19a9-419b-8b93-b9a3274b33b5",
      "in_progress_at": 1729011493,
      "input_file_id": "file-f89384af0082485da43cb26b49dc25ce",
      "errors": null,
      "metadata": null,
      "object": "batch",
      "output_file_id": "file-62bebde8-e767-4cd3-a0a1-28b214dc8974",
      "request_counts": {
        "total": 3,
        "completed": 2,
        "failed": 1
      },
      "status": "completed",
      "endpoint": "/chat/completions"
    },
    {
      "cancelled_at": null,
      "cancelling_at": null,
      "completed_at": 1729016366,
      "completion_window": "24h",
      "created_at": 1729015829,
      "error_file_id": "file-85ae1971-9957-4511-9eb4-4cc9f708b904",
      "expired_at": null,
      "expires_at": 1729102229,
      "failed_at": null,
      "finalizing_at": 1729016272,
      "id": "batch_6287485f-50fc-4efa-bcc5-b86690037f43",
      "in_progress_at": 1729016126,
      "input_file_id": "file-686746fcb6bc47f495250191ffa8a28e",
      "errors": null,
      "metadata": null,
      "object": "batch",
      "output_file_id": "file-04399828-ae0b-4825-9b49-8976778918cb",
      "request_counts": {
        "total": 3,
        "completed": 2,
        "failed": 1
      },
      "status": "completed",
      "endpoint": "/chat/completions"
    }
  ],
  "first_id": "batch_4ddc7b60-19a9-419b-8b93-b9a3274b33b5",
  "has_more": false,
  "last_id": "batch_6287485f-50fc-4efa-bcc5-b86690037f43"
}

Kolejkowanie zadań wsadowych

Jeśli zadania wsadowe są tak duże, że osiągasz limit tokenów w kolejce nawet po maksymalnym wykorzystaniu przydziału dla wdrożenia, niektóre regiony obsługują teraz nową funkcję szybkiej awarii, która umożliwia kolejkowanie wielu zadań wsadowych z wykładniczym opóźnieniem. Po zakończeniu jednego dużego zadania wsadowego i ponownym udostępnieniu w kolejce przydziału tokenu można utworzyć następne zadanie wsadowe i uruchomić je automatycznie.

Stare zachowanie:

  1. Duże zadania wsadowe są już uruchomione i używają wszystkich dostępnych tokenów dla Twojego wdrożenia.
  2. Przesłane nowe zadanie wsadowe.
  3. Nowe zadanie wsadowe wchodzi w fazę weryfikacji, która może trwać do kilku minut.
  4. Liczba tokenów dla nowego zadania jest sprawdzana względem aktualnie dostępnego limitu przydziału.
  5. Nowe zadanie wsadowe kończy się niepowodzeniem z powodu przekroczenia limitu tokenu raportowania błędów.

Nowe zachowanie:

  1. Duże zadania wsadowe już działają i używają wszystkich dostępnych tokenów dla Twojego wdrożenia.
  2. Przesłano nowe zadanie wsadowe
  3. Przybliżona liczba tokenów nowego zadania jest natychmiast porównywana z aktualnie dostępnym przydziałem wsadowym, co pozwala szybko wychwycić niepowodzenie i łatwiej zarządzać ponownymi próbami programowo.

Obsługa regionów

Następujące regiony obsługują nowe szybkie zachowanie w przypadku awarii:

  • australiaeast
  • eastus
  • Niemcy Zachód-Centrum
  • Północne Włochy
  • northcentralus
  • polandcentral
  • swedencentral
  • switzerlandnorth
  • eastus2
  • westus

Poniższy kod demonstruje podstawową mechanikę obsługi podejścia szybkiego wykrywania awarii, aby umożliwić automatyzację ponawiania prób i kolejkowania zadań wsadowych z wykładniczym opóźnieniem.

W zależności od rozmiaru zadań wsadowych może być konieczne znaczne zwiększenie max_retries lub dalsze modyfikowanie tego przykładu.

import time
from openai import BadRequestError

max_retries = 10
retries = 0
initial_delay = 5
delay = initial_delay

while True:
    try:
        batch_response = client.batches.create(
            input_file_id=file_id,
            endpoint="/chat/completions",
            completion_window="24h",
        )
        
        # Save batch ID for later use
        batch_id = batch_response.id
        
        print(f"✅ Batch created successfully after {retries} retries")
        print(batch_response.model_dump_json(indent=2))
        break  
        
    except BadRequestError as e:
        error_message = str(e)
        
        # Check if it's a token limit error
        if 'token_limit_exceeded' in error_message:
            retries += 1
            if retries >= max_retries:
                print(f"❌ Maximum retries ({max_retries}) reached. Giving up.")
                raise
            
            print(f"⏳ Token limit exceeded. Waiting {delay} seconds before retry {retries}/{max_retries}...")
            time.sleep(delay)
            
            # Exponential backoff - increase delay for next attempt
            delay *= 2
        else:
            # If it's a different error, raise it immediately
            print(f"❌ Encountered non-token limit error: {error_message}")
            raise

Wyjście:

⏳ Token limit exceeded. Waiting 5 seconds before retry 1/10...
⏳ Token limit exceeded. Waiting 10 seconds before retry 2/10...
⏳ Token limit exceeded. Waiting 20 seconds before retry 3/10...
⏳ Token limit exceeded. Waiting 40 seconds before retry 4/10...
⏳ Token limit exceeded. Waiting 80 seconds before retry 5/10...
⏳ Token limit exceeded. Waiting 160 seconds before retry 6/10...
⏳ Token limit exceeded. Waiting 320 seconds before retry 7/10...
✅ Batch created successfully after 7 retries
{
  "id": "batch_1e1e7b9f-d4b4-41fa-bd2e-8d2ec50fb8cc",
  "completion_window": "24h",
  "created_at": 1744402048,
  "endpoint": "/chat/completions",
  "input_file_id": "file-e2ba4ccaa4a348e0976c6fe3c018ea92",
  "object": "batch",
  "status": "validating",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "error_file_id": "",
  "errors": null,
  "expired_at": null,
  "expires_at": 1744488444,
  "failed_at": null,
  "finalizing_at": null,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": "",
  "request_counts": {
    "completed": 0,
    "failed": 0,
    "total": 0
  }
}

Wymagania wstępne

Przygotowywanie pliku wsadowego

Podobnie jak dostrajanie, globalna partia używa plików w formacie wierszy JSON (.jsonl). Poniżej przedstawiono kilka przykładowych plików z różnymi typami obsługiwanej zawartości:

Format danych wejściowych

Interfejs API odpowiedzi

{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}

Interfejs API uzupełniania czatów

{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

Element custom_id jest wymagany, aby umożliwić określenie, które pojedyncze żądanie wsadowe odpowiada danej odpowiedzi. Odpowiedzi nie będą zwracane w identycznej kolejności niż kolejność zdefiniowana w pliku wsadowym .jsonl .

model Atrybut powinien być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby odpowiadał nazwie globalnego wdrożenia Batch, które ma być używane do generowania odpowiedzi inferencyjnych. Ta sama nazwa wdrożenia globalnego modelu Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz celować w inne wdrożenie, musisz to zrobić w osobnym pliku/zadaniu wsadowym.

Aby uzyskać najlepszą wydajność, zalecamy przesyłanie dużych plików do przetwarzania wsadowego, a nie dużej liczby małych plików z zaledwie kilkoma wierszami w każdym pliku.

Tworzenie pliku wejściowego

W tym artykule utworzymy plik o nazwie test.jsonl i skopiujemy zawartość ze standardowego bloku kodu wejściowego powyżej do pliku. Musisz zmodyfikować i dodać globalną nazwę wdrożenia wsadowego do każdego wiersza pliku.

Przesyłanie pliku wsadowego

Po przygotowaniu pliku wejściowego najpierw trzeba przesłać plik, aby móc zainicjować zadanie wsadowe. Przekazywanie plików można wykonać programowo lub za pośrednictwem portalu Microsoft Foundry. W tym przykładzie pokazano przekazywanie pliku bezpośrednio do zasobu Azure OpenAI. Alternatywnie można konfigurować Azure Blob Storage dla usługi Azure OpenAI Batch.

Ważne

Używaj kluczy interfejsu API z ostrożnością. Nie dołączaj klucza interfejsu API bezpośrednio do kodu i nigdy nie publikuj go publicznie. Jeśli używasz klucza interfejsu API, zapisz go bezpiecznie w Azure Key Vault. Aby uzyskać więcej informacji na temat bezpiecznego używania kluczy interfejsu API w aplikacjach, zobacz API keys with Azure Key Vault (Klucze interfejsu API Azure Key Vault

Aby uzyskać więcej informacji na temat zabezpieczeń usług sztucznej inteligencji, zobacz Uwierzytelnianie żądań do usług Azure AI.

curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=batch" \
  -F "file=@C:\\batch\\test.jsonl;type=application/json" \
  -F "expires_after.seconds=1209600" \
  -F "expires_after.anchor=created_at"

Powyższy kod zakłada określoną ścieżkę pliku dla pliku test.jsonl. Dostosuj tę ścieżkę pliku zgodnie z potrzebami dla systemu lokalnego.

Opcjonalne parametry expires_after.seconds i expires_after.anchor ustawiają wygaśnięcie pliku wejściowego po 14 dniach od utworzenia. Ustaw dla expires_after.seconds wartość od 1209600 do 2592000, aby wybrać okres wygaśnięcia od 14 do 30 dni. Ustawienie daty wygaśnięcia zwiększa również limit plików wejściowych. Aby uzyskać szczegółowe informacje, zobacz Limity usługi Batch.

Wyjście:

{
  "status": "processed",
  "bytes": 817,
  "purpose": "batch",
  "filename": "test.jsonl",
  "expires_at": 1744607747,
  "id": "file-7733bc35e32841e297a62a9ee50b3461",
  "created_at": 1743398147,
  "object": "file"
}

Śledzenie stanu przekazywania plików

W zależności od rozmiaru przesyłanego pliku, może zająć trochę czasu, zanim zostanie on w pełni przesłany i przetworzony. Aby sprawdzić status przesyłania pliku, wykonaj polecenie:

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files/{file-id} \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Wyjście:

{
  "status": "processed",
  "bytes": 686,
  "purpose": "batch",
  "filename": "test.jsonl",
  "expires_at": 1744607747,
  "id": "file-7733bc35e32841e297a62a9ee50b3461",
  "created_at": 1721408291,
  "object": "file"
}

Utwórz zadanie wsadowe

Po pomyślnym przesłaniu pliku można przesłać plik do przetwarzania wsadowego.

curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input_file_id": "file-abc123",
    "endpoint": "/chat/completions",
    "completion_window": "24h",
    "output_expires_after": {
      "anchor": "created_at",
      "seconds": 1209600
    }
  }'

Opcjonalny output_expires_after obiekt ustawia pliki wyjściowe do wygaśnięcia 14 dni po ich utworzeniu. Ustaw seconds na wartość od 1209600 do 2592000, aby wybrać okres wygaśnięcia od 14 do 30 dni. Wartość anchor musi mieć wartość created_at.

Uwaga

Obecnie okno uzupełniania musi być ustawione na 24h. Jeśli ustawisz inną wartość niż 24h zadanie, zakończy się niepowodzeniem. Zadania trwające dłużej niż 24 godziny będą nadal wykonywane do momentu anulowania.

Wyjście:

{
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "completion_window": "24h",
  "created_at": "2024-07-19T17:13:57.2491382+00:00",
  "error_file_id": null,
  "expired_at": null,
  "expires_at": "2024-07-20T17:13:57.1918498+00:00",
  "failed_at": null,
  "finalizing_at": null,
  "id": "batch_fe3f047a-de39-4068-9008-346795bfc1db",
  "in_progress_at": null,
  "input_file_id": "file-21006e70789246658b86a1fc205899a4",
  "errors": null,
  "metadata": null,
  "object": "batch",
  "output_file_id": null,
  "request_counts": {
    "total": null,
    "completed": null,
    "failed": null
  },
  "status": "Validating"
}

Śledzenie postępu pracy wsadowej

Po pomyślnym utworzeniu zadania wsadowego, możesz monitorować jego postęp w programie Studio lub w sposób programowy. Podczas sprawdzania postępu zadania wsadowego zalecamy odczekywanie co najmniej 60 sekund między każdym wywołaniem stanu.

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches/{batch_id} \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Wyjście:

{
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "completion_window": "24h",
  "created_at": "2024-07-19T17:33:29.1619286+00:00",
  "error_file_id": null,
  "expired_at": null,
  "expires_at": "2024-07-20T17:33:29.1578141+00:00",
  "failed_at": null,
  "finalizing_at": null,
  "id": "batch_e0a7ee28-82c4-46a2-a3a0-c13b3c4e390b",
  "in_progress_at": null,
  "input_file_id": "file-c55ec4e859d54738a313d767718a2ac5",
  "errors": null,
  "metadata": null,
  "object": "batch",
  "output_file_id": null,
  "request_counts": {
    "total": null,
    "completed": null,
    "failed": null
  },
  "status": "Validating"
}

Możliwe są następujące wartości stanu:

Stan Opis
validating Plik wejściowy jest weryfikowany przed rozpoczęciem przetwarzania wsadowego.
failed Plik wejściowy zakończył się niepowodzeniem w procesie walidacji.
in_progress Plik wejściowy został pomyślnie zweryfikowany, a partia jest obecnie uruchomiona.
finalizing Seria została ukończona, a wyniki są w trakcie przygotowywania.
completed Partia została ukończona, a wyniki są gotowe.
expired Nie udało się ukończyć serii w 24-godzinnym przedziale czasu.
cancelling Trwa przetwarzanie partii cancelled (Może to potrwać do 10 minut, zanim zacznie działać.).
cancelled Partia była cancelled.

Pobieranie pliku wyjściowego zadania wsadowego

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files/{output_file_id}/content \
  -H "api-key: $AZURE_OPENAI_API_KEY" > batch_output.jsonl

Dodatkowe polecenia wsadowe

Anulowanie partii

Anuluje trwającą partię roboczą. Partia będzie w stanie cancelling do 10 minut przed zmianą na cancelled, gdzie będzie mieć częściowe wyniki (jeśli istnieją) dostępne w pliku wyjściowym.

curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches/{batch_id}/cancel \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Lista partii

Wyświetl listę istniejących zadań wsadowych dla danego zasobu Azure OpenAI.

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Wywołanie interfejsu API listy jest paginowane. Odpowiedź zawiera zmienną logiczną has_more, która wskazuje, czy istnieją dodatkowe wyniki do przetworzenia w iteracji.

Lista wsadowa (wersja zapoznawcza)

Użyj interfejsu API REST, aby wyświetlić listę wszystkich zadań wsadowych z dodatkowymi opcjami sortowania/filtrowania.

curl "YOUR_RESOURCE_NAME.openai.azure.com/batches?api-version=2025-04-01-preview&$filter=created_at%20gt%201728773533%20and%20created_at%20lt%201729032733%20and%20status%20eq%20'Completed'&$orderby=created_at%20asc" \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Aby uniknąć błędów, spacje URL rejected: Malformed input to a URL function są zastępowane ciągiem %20.

Limity usługi Batch

Nazwa limitu Wartość limitu
Maksymalna liczba plików wejściowych wsadowych (bez wygaśnięcia) 500
Maksymalna liczba plików wejściowych w partii (z ustawionym terminem wygaśnięcia) 10 000
Maksymalny rozmiar pliku wejściowego 200 MB
Maksymalny rozmiar pliku wejściowego — przynieś własną pamięć masową (BYOS) 1 GB
Maksymalna liczba żądań na plik 100,000

Uwaga

Ustaw wygaśnięcie plików wejściowych, aby zwiększyć limit zasobów i zarządzać przechowywanymi plikami. Limity plików wejściowych usługi Batch nie mają zastosowania do plików wyjściowych, takich jak result.jsonl i error.jsonl. Aby uniknąć limitów plików wejściowych w interfejsie Files API, użyj Batch z Azure Blob Storage.

Przydział wsadowy

W tabeli przedstawiono limit przydziału partii. Wartości przydziału dla globalnej partii są reprezentowane pod względem zakolejkowanych tokenów. Podczas przekazywania pliku do przetwarzania wsadowego liczba tokenów w pliku jest liczona. Dopóki zadanie wsadowe nie osiągnie stanu końcowego, te tokeny są uwzględniane w całkowitym limicie tokenów w kolejce.

Partia globalna

Model Przedsiębiorstwo i MCA-E Domyślny Miesięczne subskrypcje oparte na kartach kredytowych Subskrypcje MSDN Azure dla uczniów, bezpłatne wersje próbne
gpt-4.1 5B 200 mln 50 mln 90 tys. N/A
gpt-4.1 mini 15B 1B 50 mln 90 tys. N/A
gpt-4.1-nano 15B 1B 50 mln 90 tys. N/A
gpt-4o 5B 200 mln 50 mln 90 tys. N/A
gpt-4o-mini 15B 1B 50 mln 90 tys. N/A
gpt-4-turbo 300 mln 80 mln 40 mln 90 tys. N/A
gpt-4 150 mln 30 mln 5 mln 100 tys. N/A
o3-mini 15B 1B 50 mln 90 tys. N/A
o4-mini 15B 1B 50 mln 90 tys. N/A
gpt-5 5B 200 mln 50 mln 90 tys. N/A
gpt-5.1 5B 200 mln 50 mln 90 tys. N/A
gpt-5.2 5B 200 mln 50 mln N/A N/A
gpt-5.4 5B 200 mln 50 mln N/A N/A
gpt-5.4-mini 5B 200 mln 50 mln N/A N/A
gpt-5.4-nano 5B 200 mln 50 mln N/A N/A
gpt-5.5 5B 200 mln 50 mln 90 tys. N/A

B = miliard | M = milion | K = tysiąc

Zestaw danych strefowych

Model Przedsiębiorstwo i MCA-E Domyślny Miesięczne subskrypcje oparte na kartach kredytowych Subskrypcje MSDN Azure dla uczniów, bezpłatne wersje próbne
gpt-4.1 500 mln 30 mln 30 mln 90 tys. N/A
gpt-4.1-mini 1,5 mld 100 mln 50 mln 90 tys. N/A
gpt-4o 500 mln 30 mln 30 mln 90 tys. N/A
gpt-4o-mini 1,5 mld 100 mln 50 mln 90 tys. N/A
o3-mini 1,5 mld 100 mln 50 mln 90 tys. N/A
gpt-5 5B 200 mln 50 mln 90 tys. N/A
gpt-5.1 5B 200 mln 50 mln 90 tys. N/A
gpt-5.4 5B 200 mln 50 mln N/A N/A
gpt-5.4-mini 5B 200 mln 50 mln N/A N/A
gpt-5.5 5B 200 mln 50 mln 90 tys. N/A

Przechowywanie rekordów zadań wsadowych

Rekordy zadań wsadowych są przechowywane do 365 dni po osiągnięciu przez zadanie stanu końcowego, takiego jak completed, failed, expired lub cancelled. W tym okresie można wyświetlić zadanie na liście i pobrać informacje o nim, a także anulować je, jeśli nadal jest w stanie umożliwiającym anulowanie.

Wygenerowane pliki wyjściowe i pliki błędów nie mają domyślnego wygaśnięcia. Pozostają one dostępne do momentu ich usunięcia lub ustawienia jawnego wygaśnięcia. Ustaw expires_after podczas przesyłania pliku wejściowego lub ustaw output_expires_after podczas tworzenia zadania wsadowego. Oba jawne ustawienia wygasania akceptują od 14 do 30 dni i używają created_at jako kotwicy. Przykłady można znaleźć w sekcjach Przekazywanie pliku wsadowego i Tworzenie zadania wsadowego na karcie Python lub interfejsu API REST.

Obiekt wsadowy

Właściwość Typ Definicji
id ciąg Identyfikator partii.
object ciąg batch
endpoint ciąg Endpoint API używany przez partię.
errors obiekt Informacje o błędzie dla serii, jeśli występują.
input_file_id ciąg ID pliku wejściowego dla partii.
completion_window ciąg Docelowy przedział czasu przetwarzania partii. Obecnie należy ustawić tę wartość na 24h. Ukończenie w ciągu 24 godzin nie jest gwarantowane, a zadanie może być kontynuowane do momentu zakończenia lub anulowania.
status ciąg Bieżący stan partii produkcyjnej. Możliwe wartości: validating, failedin_progressfinalizingcompleted, expired, cancelling, . cancelled
output_file_id ciąg Identyfikator pliku zawierającego dane wyjściowe pomyślnie wykonanych żądań.
error_file_id ciąg Identyfikator pliku zawierającego dane wyjściowe żądań z błędami.
created_at liczba całkowita Sygnatura czasowa utworzenia tej partii (w sekundach epoki Unix).
in_progress_at liczba całkowita Sygnatura czasowa rozpoczęcia postępu tej partii (w sekundach systemu Unix).
expires_at liczba całkowita Znacznik czasu, kiedy ta partia wygaśnie (w sekundach epoki Unix).
finalizing_at liczba całkowita Moment rozpoczęcia finalizacji tej partii (w sekundach epoki Unix).
completed_at liczba całkowita Znacznik czasu, kiedy ta partia została zakończona (w sekundach czasu epoki Unix).
failed_at liczba całkowita Znacznik czasu, kiedy ta partia nie powiodła się (w sekundach epoki Unix).
expired_at liczba całkowita Znacznik czasu, kiedy wygasł ten pakiet (w sekundach epoki Unix).
cancelling_at liczba całkowita Sygnatura czasowa, kiedy ta partia się rozpoczęła cancelling (w sekundach systemu Unix).
cancelled_at liczba całkowita Sygnatura czasowa dla tej partii cancelled (w sekundach epoki Unix).
request_counts obiekt Struktura obiektu:

total Liczba całkowita
Całkowita liczba żądań w pakiecie.
completed Liczba całkowita
Liczba żądań w partii, które zostały pomyślnie ukończone.
failed Liczba całkowita
Liczba żądań w partii, które zakończyły się niepowodzeniem.
metadata mapa Zestaw par klucz-wartość, które można dołączyć do partii. Ta właściwość może być przydatna do przechowywania dodatkowych informacji o partii w formacie ustrukturyzowanym.

Często zadawane pytania

Czy obrazy mogą być używane z interfejsem API wsadowym?

Ta funkcja jest ograniczona do niektórych modeli wielomodalnych. Obrazy można udostępniać jako dane wejściowe za pomocą adresu URL obrazu lub zakodowanej w formacie base64 reprezentacji obrazu.

Czy mogę używać interfejsu API wsadowego z dostosowanymi modelami?

Interfejs Batch API nie obsługuje obecnie modeli dostrojonych.

Czy mogę używać interfejsu API wsadowego do osadzania modeli?

Interfejs Batch API nie obsługuje obecnie modeli dostrojonych.

Czy filtrowanie zawartości działa z globalnym wdrożeniem usługi Batch?

Tak. Podobnie jak w przypadku innych typów wdrożeń, można tworzyć filtry zawartości i kojarzyć je z globalnym typem wdrożenia usługi Batch.

Czy mogę zażądać dodatkowego limitu przydziału?

Tak, na stronie limitu przydziału w portalu Foundry. Domyślną alokację przydziału można znaleźć w artykule o przydziałach i limitach.

Co się stanie, jeśli interfejs API nie ukończy żądania w ciągu 24-godzinnego przedziału czasu?

Dążymy do przetworzenia tych żądań w ciągu 24 godzin; nie wygasają zadania, które trwają dłużej. Zadanie można anulować w dowolnym momencie. Po anulowaniu zadania wszystkie pozostałe prace zostaną anulowane i zostanie zwrócona każda już ukończona praca. Opłata zostanie naliczona za każdą ukończoną pracę.

Ile żądań można kolejkować przy użyciu usługi Batch?

Nie ma stałego limitu liczby żądań, które można wsadować, jednak będzie zależeć od limitu przydziału tokenu w kolejce. Twój przydział tokenów w kolejce obejmuje maksymalną liczbę tokenów wejściowych, które można umieścić w kolejce na raz.

Po zakończeniu żądania wsadowego, limit przepustowości wsadowej zostanie zresetowany, ponieważ tokeny wejściowe zostały wyczyszczone. Limit zależy od liczby żądań globalnych w kolejce. Jeśli kolejka interfejsu API Batch szybko przetwarza twoje partie, limit wsadu jest resetowany szybciej.

Rozwiązywanie problemów

Zadanie kończy się pomyślnie, gdy status ma wartość completed. Pomyślne zadania nadal będą generować error_file_idelement , ale będzie on skojarzony z pustym plikiem o zerowych bajtach.

Po wystąpieniu błędu zadania znajdziesz szczegółowe informacje o błędzie we właściwości errors.

{
  "value": [
    {
      "id": "batch_80f5ad38-e05b-49bf-b2d6-a799db8466da",
      "completion_window": "24h",
      "created_at": 1725419394,
      "endpoint": "/chat/completions",
      "input_file_id": "file-c2d9a7881c8a466285e6f76f6321a681",
      "object": "batch",
      "status": "failed",
      "cancelled_at": null,
      "cancelling_at": null,
      "completed_at": 1725419955,
      "error_file_id": "file-3b0f9beb-11ce-4796-bc31-d54e675f28fb",
      "errors": {
        "object": "list",
        "data": [
          {
            "code": "empty_file",
            "message": "The input file is empty. Please ensure that the batch contains at least one request."
          }
        ]
      },
      "expired_at": null,
      "expires_at": 1725505794,
      "failed_at": null,
      "finalizing_at": 1725419710,
      "in_progress_at": 1725419572,
      "metadata": null,
      "output_file_id": "file-ef12af98-dbbc-4d27-8309-2df57feed572",
      "request_counts": {
        "total": 10,
        "completed": null,
        "failed": null
      }
    }
  ]
}

Kody błędów

Kod błędu Definicji
invalid_json_line Jednej lub kilku linii w pliku wejściowym nie udało się przetworzyć jako poprawny JSON.

Upewnij się, że nie ma literówek, odpowiednich nawiasów otwierających i zamykających oraz cudzysłowów zgodnie ze standardem JSON i prześlij ponownie żądanie.
too_many_tasks Liczba żądań w pliku wejściowym przekracza maksymalną dozwoloną wartość 100 000.

Upewnij się, że łączna liczba żądań wynosi poniżej 100 000 i prześlij ponownie zadanie.
url_mismatch Wiersz w pliku wejściowym ma adres URL, który nie jest zgodny z resztą wierszy, lub adres URL określony w pliku wejściowym nie jest zgodny z oczekiwanym adresem URL punktu końcowego.

Upewnij się, że wszystkie adresy URL żądań są takie same i że są zgodne z adresem URL punktu końcowego skojarzonym z wdrożeniem Azure openAI.
model_not_found Nie znaleziono nazwy wdrożenia modelu Azure OpenAI, która została określona we właściwości model pliku wejściowego.

Upewnij się, że ta nazwa wskazuje prawidłowe wdrożenie modelu w Azure OpenAI.
duplicate_custom_id Identyfikator niestandardowy dla tego żądania jest duplikatem identyfikatora niestandardowego w innym żądaniu.
empty_file Plik wejściowy jest pusty. Upewnij się, że partia zawiera co najmniej jedno żądanie.
model_mismatch Nazwa wdrożenia modelu openAI Azure określona we właściwości model tego żądania w pliku wejściowym nie jest zgodna z resztą pliku.

Upewnij się, że wszystkie żądania w partii wskazują na takie samo wdrożenie modelu Azure OpenAI w modelu Foundry Models we właściwości model żądania.
invalid_request Schemat wiersza wejściowego jest nieprawidłowy lub jednostka SKU wdrożenia jest nieprawidłowa.

Upewnij się, że właściwości żądania w pliku wejściowym są zgodne z oczekiwanymi właściwościami danych wejściowych i że jednostka SKU wdrożenia platformy Azure OpenAI jest globalbatch dla żądań API wsadowego.
input_modified Dane wejściowe obiektu blob zostały zmodyfikowane po przesłaniu zadania wsadowego.
input_no_permissions Nie można uzyskać dostępu do wejściowego obiektu blob. Sprawdź uprawnienia i dostęp sieciowy między kontem Azure OpenAI a kontem Azure Storage.

Znane problemy

  • Zasoby wdrożone za pomocą Azure CLI nie będą działały bezpośrednio w globalnej partii Azure OpenAI. Jest to spowodowane problemem polegającym na tym, że zasoby wdrożone przy użyciu tej metody mają poddomeny punktów końcowych, które nie są zgodne ze wzorcem https://your-resource-name.openai.azure.com . Obejściem tego problemu jest wdrożenie nowego zasobu Azure OpenAI przy użyciu jednej z innych typowych metod wdrażania, które będą prawidłowo obsługiwać konfigurację poddomeny w ramach procesu wdrażania.

  • Pliki zakodowane w formacie jsonl UTF-8-BOM nie są obsługiwane. Pliki wierszy JSON powinny być kodowane przy użyciu formatu UTF-8. Użycie plików zakodowanych w formacie BOM (Byte-Order-Mark) nie jest oficjalnie obsługiwane przez specyfikację RFC JSON, a Azure openAI będzie obecnie traktować pliki zakodowane przez model BOM jako nieprawidłowe. Plik zakodowany w formacie UTF-8-BOM zwraca obecnie ogólny komunikat o błędzie: "Weryfikacja nie powiodła się: Nie można wyodrębnić prawidłowej nazwy wdrożenia modelu z pliku wejściowego. Upewnij się, że każdy wiersz w pliku wejściowym ma prawidłową nazwę wdrożenia określoną w polu "model" i że nazwa wdrożenia jest spójna we wszystkich wierszach.

  • W przypadku używania własnego magazynu dla danych wejściowych wsadowych po przesłaniu zadania wsadowego, jeśli wejściowy obiekt blob zostanie zmodyfikowany, zadanie oceniania zakończy się niepowodzeniem przez usługę.

Zobacz też