Udostępnij przez


Wprowadzenie do wdrożeń wsadowych usługi Azure OpenAI

Interfejs API Azure OpenAI Batch jest przeznaczony do wydajnego przetwarzania zadań na dużą skalę oraz w dużych ilościach. Przetwarzaj asynchroniczne grupy żądań z oddzielnym limitem kwoty, z docelowym czasem realizacji wynoszącym 24 godziny, przy koszcie o 50% mniejszym niż w przypadku globalnego standardu. W przypadku przetwarzania wsadowego zamiast wysyłać jedno żądanie jednocześnie wysyłasz dużą liczbę żądań w jednym pliku. Globalne żądania wsadowe mają odrębny limit tokenów w kolejce, co zapobiega zakłóceniom w Twoich operacjach online.

Najważniejsze przypadki użycia:

  • Przetwarzanie danych na dużą skalę: szybko analizuj obszerne zestawy 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): wykonaj zadania, takie 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 zakolejkowanych tokenów nawet po maksymalnym wykorzystaniu przydziału dla swojej wdrożenia, pewne regiony teraz wspierają nową funkcję, która pozwala na kolejkowanie wielu zadań wsadowych z użyciem wykładniczego opóźnienia.

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

Ważne

Staramy się przetwarzać żądania zbiorcze w ciągu 24 godzin; nie anulujemy zadań, 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ę.

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

Obsługa usługi Batch

Dostępność globalnego modelu wsadowego

Region 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
Brazylia Południe
wschód Kanady
centralny
eastus
eastus2
francecentral
Niemcy Zachodnio-Środkowe
japaneast
koreacentral
northcentralus
Norwegia Wschód
polandcentral
southafricanorth
southcentralus
południowe Indie
swedencentral
Szwajcaria Północ
uksouth
Europa Zachodnia
westus
westus3

Rejestracja jest wymagana do uzyskania dostępu do gpt-5 i o3. Aby uzyskać więcej informacji, zobacz nasz przewodnik po modelach rozumowania.

Następujące modele obsługują globalną partię:

Model wersja Format danych wejściowych
gpt-5 2025-08-7 tekst i obraz
o3 2025-04-16 tekst i obraz
o3-mini 31.01.2025 SMS
gpt-4o 2024-08-06 tekst i obraz
gpt-4o-mini 18.07.2024 tekst i obraz
gpt-4o 13.05.2024 tekst i obraz

Uwaga / Notatka

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

Obsługa funkcji

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

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

Wdrażanie wsadowe

Uwaga / Notatka

W portalu Microsoft Foundry typy wdrożeń wsadowych będą wyświetlane jako Global-Batch i Data Zone Batch. Aby dowiedzieć się więcej na temat typów wdrożeń usługi Azure OpenAI, zobacz nasz przewodnik dotyczący typów wdrożeń.

Wskazówka

Zalecamy włączenie dynamicznego limitu dla wszystkich globalnych wdrożeń modeli wsadowych, aby pomóc w uniknięciu błędów zadań spowodowanych niewystarczającym przydziałem tokenów w kolejce. Użycie przydziału dynamicznego umożliwia Twojej wdrożeniu oportunistyczne korzystanie z większego limitu, gdy dostępne są dodatkowe zasoby. Po wyłączeniu dynamicznego przydziału, Twoje wdrożenie będzie mogło przetwarzać żądania tylko do limitu liczby tokenów w kolejce, ustalonego przy tworzeniu wdrożenia.

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie.
  • Zasób z modelem wdrożenia typu GlobalBatch lub DataZoneBatch.

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

Odpowiedzi API

{"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ą wdrożenia Global Batch, które ma być celem odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia Batch, do którego chcesz kierować odpowiedzi inferencyjne. Ta sama nazwa wdrożenia modelu Global Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz przeprowadzić inne wdrożenie, musisz to zrobić w osobnym pliku wsadowym lub zadaniu.

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ć każdy wiersz pliku, dodając do niego globalną nazwę wdrożenia wsadowego.

Utwórz zadanie wsadowe

Po przygotowaniu pliku wejściowego, najpierw należy go przesłać, aby można było 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 usługi Azure OpenAI. Alternatywnie możesz skonfigurować usługę Azure Blob Storage dla usługi Azure OpenAI Batch.

  1. Zaloguj się do usługi Microsoft Foundry. Upewnij się, że przełącznik New Foundry jest wyłączony. Te kroki odnoszą się do rozwiązania Foundry (wersja klasyczna).

  2. Wybierz zasób Azure OpenAI, w którym dostępne jest globalne wdrożenie modelu wsadowego.

  3. Wybierz pozycję Zadania wsadowe>+Utwórz zadania wsadowe.

    Zrzut ekranu przedstawiający środowisko tworzenia zadań wsadowych w portalu Foundry.

  4. Z listy rozwijanej w sekcji Dane zbiorcze>Prześlij pliki> wybierz Prześlij plik i podaj ścieżkę do test.jsonl pliku utworzonego w poprzednim kroku. >Dalej.

    Zrzut ekranu przedstawiający proces przesyłania pliku.

Wybierz Utwórz, aby uruchomić zadanie wsadowe.

  1. Zaloguj się do usługi 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>i utwórz zadanie wsadowe

    Zrzut ekranu przedstawiający nowe doświadczenie tworzenia partii w usłudze Foundry.

Śledź postęp zadania wsadowego

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

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

Pobierz plik wyjściowy 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ół.

Anuluj partię

Anuluje będącą w toku partię produkcyjną. Seria będzie w statusie cancelling przez maksymalnie 10 minut przed zmianą na cancelled, gdzie dostępne będą częściowe wyniki (jeśli istnieją) w pliku wyjściowym.

Śledź postęp zadania wsadowego

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

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

Pobierz plik wyjściowy 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ół.

Anuluj partię

Anuluje będącą w toku partię produkcyjną. Seria będzie w statusie cancelling przez maksymalnie 10 minut przed zmianą na cancelled, gdzie dostępne będą częściowe wyniki (jeśli istnieją) w pliku wyjściowym.

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie.
  • Środowisko Python w wersji 3.8 lub nowszej
  • Następująca biblioteka języka Python: openai
  • Notesy Jupyter
  • Zasób Azure OpenAI z modelem typu Global-Batch, który został wdrożony. Aby uzyskać pomoc dotyczącą tego procesu, zapoznaj się z przewodnikiem tworzenia zasobów i wdrażania modelu.

Kroki opisane w tym artykule mają być uruchamiane sekwencyjnie w notatnikach Jupyter. Z tego powodu zainicjujemy klienta usługi Azure OpenAI tylko raz, na początku omawiania przykładów. Jeśli chcesz wykonać krok poza kolejnością, często będziesz musiał skonfigurować klienta Azure OpenAI jako część tego wywołania.

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

!pip install openai --upgrade

Przygotowywanie pliku wsadowego

Podobnie jak fine-tuning, global batch używa plików w formacie JSON lines (.jsonl). Poniżej przedstawiono kilka przykładowych plików z różnymi typami obsługiwanej zawartości:

Format danych wejściowych

Odpowiedzi API

{"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ą wdrożenia Global Batch, które ma być celem odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia Batch, do którego chcesz kierować odpowiedzi inferencyjne. Ta sama nazwa wdrożenia modelu Global Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz przeprowadzić inne wdrożenie, musisz to zrobić w osobnym pliku wsadowym lub zadaniu.

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ć każdy wiersz pliku, dodając do niego globalną nazwę wdrożenia wsadowego. Zapisz ten plik w tym samym katalogu, w którym uruchamiasz Jupyter Notebook.

Prześlij plik wsadowy

Po przygotowaniu pliku wejściowego, najpierw należy go przesłać, aby można było 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 usługi Azure OpenAI. Alternatywnie możesz skonfigurować usługę 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://cognitiveservices.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

Poprzez usunięcie komentarzy i dodanie extra_body={"expires_after":{"seconds": 1209600, "anchor": "created_at"}} ustawiasz nasz plik do przesłania na wygaśnięcie za 14 dni. Na zasób przypada maksymalny limit 500 wejściowych plików wsadowych, gdy nie jest ustawione wygaśnięcie. Ustawiając wartość wygaśnięcia, liczba wejściowych plików wsadowych na zasób zwiększa się do 10 000. Aby usunąć limity plików wejściowych wsadowych, użyj usługi Batch z usługą Azure Blob Storage.

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 załadowaniu pliku można zgłosić 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 / Notatka

Obecnie okno ukończenia musi być ustawione na 24h. Jeśli ustawisz jakąkolwiek inną wartość niż 24h, twoje zadanie zakończy się niepowodzeniem. Zadania, które trwają dłużej niż 24 godziny, będą kontynuowane, aż do ich 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 Twoje zadania wsadowe są tak duże, że osiągasz limit zakolejkowanych tokenów nawet po maksymalnym wykorzystaniu kwoty przydziału dla Twojego wdrożenia, niektóre regiony obecnie obsługują nową funkcję fail fast, która pozwala na kolejkowanie wielu zadań wsadowych z wykładniczym opóźnieniem, dzięki czemu po zakończeniu jednego dużego zadania wsadowego następne może być automatycznie uruchomione. Aby dowiedzieć się więcej o tym, które regiony obsługują tę funkcję oraz jak dostosować swój kod, aby w pełni z niej korzystać, zobacz kolejkowanie zadań wsadowych.

Śledź postęp zadania wsadowego

Po pomyślnym utworzeniu zadania wsadowego możesz monitorować jego postęp w Studio lub programistycznie. Podczas sprawdzania postępu zadania wsadowego zalecamy odczekiwanie co najmniej 60 sekund między każdym sprawdzeniem statusu.

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 Partia produkcyjna została ukończona, a wyniki są przygotowywane.
completed Partia została ukończona, a wyniki są gotowe.
expired Nie udało się ukończyć partii w ramach 24-godzinnego okna czasowego.
cancelling Trwa przetwarzanie wsadu cancelled (może to zająć do 10 minut, zanim zacznie obowiązywać).
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 osobny output_file_id element. Użyj error_file_id, aby ułatwić debugowanie problemów występujących w zadaniu wsadowym.

Pobierz plik wyjściowy 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:

Ze względu na zwięzłość zamieszczamy tylko jedną odpowiedź w ramach ukończenia czatu. 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
}

Odpowiedzi API

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

Anuluj partię

Anuluje będącą w toku partię produkcyjną. Seria będzie w statusie cancelling przez maksymalnie 10 minut przed zmianą na cancelled, gdzie dostępne będą częściowe wyniki (jeśli istnieją) w pliku wyjściowym.

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

Lista partii

Wyświetlanie listy zadań wsadowych dla określonego zasobu usługi Azure OpenAI.

client.batches.list()

Metody typu list w bibliotece języka Python 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 funkcję generate_time_filter, aby ułatwić tworzenie 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://cognitiveservices.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 twoje zadania wsadowe są tak duże, że osiągasz limit tokenów w kolejce nawet po maksymalnym wykorzystaniu przydziału dla twojego wdrożenia, pewne regiony teraz wspierają nową funkcję szybkiego przerywania, która pozwala na kolejkowanie wielu zadań wsadowych z wykładniczym opóźnieniem. Gdy jedno duże zadanie wsadowe zostanie zakończone i twoja pula żetonów do umieszczenia w kolejce ponownie będzie dostępna, kolejne zadanie wsadowe może zostać utworzone i uruchomione automatycznie.

Stare zachowanie:

  1. Duże zadania wsadowe są już uruchomione i wykorzystują wszystkie dostępne tokeny dla Twojej konfiguracji.
  2. Nowe zadanie wsadowe zostało przesłane.
  3. Nowe zadanie wsadowe przechodzi do etapu walidacji, który może potrwać do kilku minut.
  4. Liczba tokenów dla nowego zadania jest sprawdzana w odniesieniu do aktualnie dostępnego limitu.
  5. Nowa partia zadań kończy się niepowodzeniem z powodu przekroczenia limitu tokenów podczas raportowania błędów.

Nowe zachowanie:

  1. Zadania dużej partii już działają i wykorzystują wszystkie dostępne tokeny dla Twojego wdrożenia.
  2. Nowe zadanie wsadowe dodane
  3. Szacunkowa liczba tokenów dla nowego zadania jest natychmiast porównywana z aktualnie dostępną kwotą zbiorową, co umożliwia szybkie niepowodzenie zadania, pozwalając na łatwiejsze obsługiwanie ponownych prób w sposób programowy.

Obsługa regionów

Poniższe regiony obsługują nowe szybkie zakończenie działania.

  • AustraliaEast
  • eastus
  • Niemcy Zachodnio-Środkowe
  • północne Włochy
  • northcentralus
  • polandcentral
  • swedencentral
  • Szwajcaria Północ
  • eastus2
  • westus

Kod poniżej demonstruje podstawowe mechanizmy obsługi zachowania fail fast, aby umożliwić automatyzację ponownych prób i kolejkowanie zadań wsadowych z eksponencjalnym narastaniem opóźnienia.

W zależności od rozmiaru zadań wsadowych może być konieczne znaczne zwiększenie max_retries lub dalsze dostosowanie 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

  • Subskrypcja platformy Azure — utwórz bezpłatnie.
  • Zasób Azure OpenAI z modelem typu Global-Batch, który został wdrożony. Aby uzyskać pomoc dotyczącą tego procesu, zapoznaj się z przewodnikiem tworzenia zasobów i wdrażania modelu.

Przygotowywanie pliku wsadowego

Podobnie jak fine-tuning, global batch używa plików w formacie JSON lines (.jsonl). Poniżej przedstawiono kilka przykładowych plików z różnymi typami obsługiwanej zawartości:

Format danych wejściowych

Odpowiedzi API

{"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ą wdrożenia Global Batch, które ma być celem odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia Batch, do którego chcesz kierować odpowiedzi inferencyjne. Ta sama nazwa wdrożenia modelu Global Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz przeprowadzić inne wdrożenie, musisz to zrobić w osobnym pliku wsadowym lub zadaniu.

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ć każdy wiersz pliku, dodając do niego globalną nazwę wdrożenia wsadowego.

Prześlij plik wsadowy

Po przygotowaniu pliku wejściowego, najpierw należy go przesłać, aby można było 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 usługi Azure OpenAI. Alternatywnie możesz skonfigurować usługę 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 usłudze Azure Key Vault. Aby uzyskać więcej informacji na temat bezpiecznego używania kluczy interfejsu API w aplikacjach, zobacz Klucze interfejsu API w usłudze Azure Key Vault.

Aby uzyskać więcej informacji na temat zabezpieczeń usług sztucznej inteligencji, zobacz Uwierzytelnianie żądań w usługach 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.

Dodając opcjonalne parametry "expires_after.seconds=1209600" i "expires_after.anchor=created_at", ustawiasz termin wygaśnięcia pliku do przesłania na 14 dni. Istnieje maksymalny limit 500 wsadowych plików wejściowych na zasób, gdy nie ustawiono daty wygaśnięcia. Poprzez ustawienie wartości wygaśnięcia liczba plików wsadowych na zasób zostaje zwiększona do 10 000 plików na zasób. Możesz ustawić liczbę w zakresie od 1209600 do 2592000. To jest równoważne 14-30 dniom. Aby usunąć limity plików wejściowych wsadowych, użyj usługi Batch z usługą Azure Blob Storage.

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 upłynąć trochę czasu, zanim zostanie on w pełni przesłany i przetworzony. Aby sprawdzić status przesyłania pliku, uruchom:

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 załadowaniu pliku można zgłosić 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": {
        "seconds": 1209600
    },
    "anchor": "created_at"
  }'

Opcjonalnie możesz dodać "output_expires_after":{"seconds": 1209600}, i "anchor": "created_at", aby Twoje pliki wyjściowe wygasły za 14 dni.

Uwaga / Notatka

Obecnie okno ukończenia musi być ustawione na 24h. Jeśli ustawisz jakąkolwiek inną wartość niż 24h, twoje zadanie zakończy się niepowodzeniem. Zadania, które trwają dłużej niż 24 godziny, będą kontynuowane, aż do ich 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"
}

Śledź postęp zadania wsadowego

Po pomyślnym utworzeniu zadania wsadowego możesz monitorować jego postęp w Studio lub programistycznie. Podczas sprawdzania postępu zadania wsadowego zalecamy odczekiwanie co najmniej 60 sekund między każdym sprawdzeniem statusu.

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 Partia produkcyjna została ukończona, a wyniki są przygotowywane.
completed Partia została ukończona, a wyniki są gotowe.
expired Nie udało się ukończyć partii w ramach 24-godzinnego okna czasowego.
cancelling Partia jest w trakcie przetwarzania cancelled (Może to potrwać do 10 minut, zanim wejdzie w życie.)
cancelled Partia była cancelled.

Pobierz plik wyjściowy 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

Anuluj partię

Anuluje będącą w toku partię produkcyjną. Seria będzie w statusie cancelling przez maksymalnie 10 minut przed zmianą na cancelled, gdzie dostępne będą częściowe wyniki (jeśli istnieją) 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 usługi Azure OpenAI.

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

Wywołanie listy API jest stronicowane. Odpowiedź zawiera wartość logiczną has_more wskazującą, kiedy istnieje więcej wyników do 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łędu, spacje są zastępowane przez URL rejected: Malformed input to a URL function.

Limity usługi Batch

Nazwa limitu Wartość limitu
Maksymalna liczba plików wejściowych usługi Batch — (bez wygaśnięcia) 500
Maksymalna liczba plików wejściowych usługi Batch — (ustalone wygaśnięcie) 10,000
Maksymalny rozmiar pliku wejściowego 200 MB
Maksymalna liczba żądań na plik 100 000

Uwaga / Notatka

Limity plików wsadowych nie mają zastosowania do plików wyjściowych (na przykład result.jsonl i error.jsonl). Aby usunąć limity plików wejściowych wsadowych, użyj usługi Batch z usługą Azure Blob Storage.

Kwota partii

W tabeli przedstawiono limit kontyngentu partii. Wartości przydziału dla globalnej partii są przedstawiane jako liczba tokenów oczekujących w kolejce. Podczas przesyłania pliku do przetwarzania wsadowego liczba tokenów w pliku jest liczone. Dopóki zadanie wsadowe osiągnie stan terminalu, te tokeny są liczone względem całkowitego limitu tokenu w kolejce.

Partia globalna

Model Enterprise i MCA-E Wartość domyślna Miesięczne subskrypcje oparte na kartach kredytowych Subskrypcje MSDN Azure for Students, 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

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

Partia danych strefowych

Model Enterprise i MCA-E Wartość domyślna Miesięczne subskrypcje oparte na kartach kredytowych Subskrypcje MSDN Azure for Students, bezpłatne wersje próbne
gpt-4.1 500 mln 30 mln 30 mln 90 tys. N/A
gpt-4.1-mini 1.5B 100 mln 50 mln 90 tys. N/A
gpt-4o 500 mln 30 mln 30 mln 90 tys. N/A
gpt-4o-mini 1.5B 100 mln 50 mln 90 tys. N/A
o3-mini 1.5B 100 mln 50 mln 90 tys. N/A
gpt-5 5B 200 mln 50 mln 90 tys. N/A

Obiekt wsadowy

Majątek Typ Definicja
id ciąg
object ciąg batch
endpoint ciąg Punkt końcowy API używany przez partię
errors obiekt
input_file_id ciąg Identyfikator pliku wejściowego dla partii
completion_window ciąg Przedział czasu, w którym należy przetworzyć partię
status ciąg Bieżący stan serii. 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 Znacznik czasu, kiedy ta partia została utworzona (w epokach uniksowych).
in_progress_at liczba całkowita Znacznik czasu, kiedy ta partia zaczęła postępować (w epoce unix).
expires_at liczba całkowita Czas wygaśnięcia tej partii (w epokach Unix).
finalizing_at liczba całkowita Znacznik czasu rozpoczęcia finalizowania tej partii (w epokach unix).
completed_at liczba całkowita Znacznik czasu rozpoczęcia finalizowania tej partii (w epokach unix).
failed_at liczba całkowita Sygnatura czasowa, kiedy ta partia nie powiodła się (w epokach systemu Unix)
expired_at liczba całkowita Sygnatura czasowa wygaśnięcia tej partii (w epokach systemu Unix).
cancelling_at liczba całkowita Sygnatura czasowa oznaczająca moment rozpoczęcia tej partii cancelling (w epoce Uniksa).
cancelled_at liczba całkowita Znacznik czasu, kiedy ta partia była cancelled (w epoce uniksowej).
request_counts obiekt Struktura obiektu:

total liczba całkowita
Całkowita liczba żądań w wsadzie.
completed liczba całkowita
Liczba żądań w grupie, ukończonych pomyślnie.
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 zadania. Ta właściwość może być przydatna do przechowywania dodatkowych informacji o partii w formacie ustrukturyzowanym.

Najczęściej zadawane pytania (FAQ)

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

Ta funkcja jest ograniczona do niektórych modeli wielomodalnych. Obecnie tylko GPT-4o obsługuje obrazy jako część żądań zbiorczych. Obrazy mogą być udostępniane jako dane wejściowe za pośrednictwem adresu URL obrazu lub zakodowanej w formacie base64 reprezentacji obrazu. Zdjęcia w partii nie są aktualnie obsługiwane przez GPT-4 Turbo.

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

Obecnie nie jest to obsługiwane.

Czy mogę używać batch API dla modeli osadzania?

Obecnie nie jest to obsługiwane.

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 ustalonego limitu na liczbę żądań, które można grupować, jednak będzie to zależne od Twojej puli tokenów w kolejce. 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 wsadowy zostaje zresetowany, ponieważ wprowadzone tokeny są wyczyszczone. Limit zależy od liczby żądań globalnych w kolejce. Jeśli kolejka Batch API szybko przetwarza partie, limit przetwarzania transz 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ć identyfikator error_file_id, ale będzie on skojarzony z pustym plikiem o rozmiarze zero bajtów.

Po wystąpieniu błędu zadania, szczegółowe informacje znajdziesz 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 Definicja
invalid_json_line Linia (lub wiele linii) w pliku wejściowym nie mogła zostać przeanalizowana jako prawidłowy 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 usługi Azure OpenAI.
model_not_found Nie można odnaleźć nazwy wdrożenia modelu usługi Azure OpenAI określonej we model właściwości pliku wejściowego.

Upewnij się, że ta nazwa wskazuje prawidłowe wdrożenie modelu usługi Azure OpenAI.
duplicate_custom_id Identyfikator niestandardowy dla tego żądania jest duplikatem identyfikatora niestandardowego w innym żądaniu.
empty_batch Sprawdź plik wejściowy, aby upewnić się, że niestandardowy parametr identyfikatora jest unikatowy dla każdego żądania w partii przetwarzania.
model_mismatch Nazwa wdrożenia modelu usługi Azure OpenAI określona we model właściwości tego żądania w pliku wejściowym nie jest zgodna z resztą pliku.

Upewnij się, że wszystkie żądania w partii wskazują na to samo wdrożenie modelu Azure OpenAI w modelach 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 usługi Azure OpenAI jest globalbatch dla żądań interfejsu 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 blobu danych. Sprawdź uprawnienia i dostęp sieciowy między kontem usługi Azure OpenAI i kontem usługi Azure Storage.

Znane problemy

  • Zasoby wdrożone za pomocą Azure CLI nie będą działać od razu z globalną grupą 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 usługi 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żywanie plików zakodowanych za pomocą algorytmu Byte-Order-Mark (BOM) nie jest oficjalnie obsługiwane przez specyfikację RFC JSON, a usługa Azure OpenAI będzie obecnie traktować pliki zakodowane w formacie 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 także

  • Dowiedz się więcej o typach wdrożeń usługi Azure OpenAI
  • Dowiedz się więcej o przydziałach i limitach usługi Azure OpenAI