Partilhar via


Introdução às implantações em lote do Azure OpenAI

A API de Lote do Azure OpenAI foi projetada para lidar com tarefas de processamento de grande escala e alto volume de forma eficiente. Processe grupos assíncronos de solicitações com cota separada, com prazo de entrega de 24 horas, a um custo 50% menor do que o padrão global. Com o processamento em lote, em vez de enviar uma solicitação de cada vez, você envia um grande número de solicitações em um único arquivo. As solicitações globais em lote têm uma cota de tokens enfileirada separada, evitando qualquer interrupção das suas cargas de trabalho online.

Os principais casos de utilização incluem:

  • Large-Scale Processamento de Dados: Analise rapidamente conjuntos de dados extensos em paralelo.

  • Geração de conteúdo: Crie grandes volumes de texto, como descrições de produtos ou artigos.

  • Revisão e Resumo de Documentos: Automatize a revisão e o resumo de documentos extensos.

  • Automação do Suporte ao Cliente: Gerencie simultaneamente múltiplas consultas para proporcionar respostas mais rápidas.

  • Extração e Análise de Dados: Extraia e analise informações de grandes quantidades de dados não estruturados.

  • Tarefas de Processamento de Linguagem Natural (NLP): Execute tarefas como análise de sentimento ou tradução em grandes conjuntos de dados.

  • Marketing e Personalização: Crie conteúdo personalizado e recomendações em escala.

Sugestão

Se os seus trabalhos em lote forem tão grandes que atingem o limite de tokens em fila, mesmo depois de maximizar a quota para a sua implementação, certas regiões agora suportam uma nova funcionalidade que permite enfileirar vários trabalhos em lote com retrocesso exponencial.

Assim que sua cota de token enfileirada estiver disponível, o próximo trabalho em lote poderá ser criado e iniciado automaticamente. Para saber mais, consulte Automatizar tentativas de repetição de grandes trabalhos em lote com backoff exponencial.

Importante

Nosso objetivo é processar solicitações em lote dentro de 24 horas; não expiramos os trabalhos que demoram mais tempo. Você pode cancelar o trabalho a qualquer momento. Quando você cancela o trabalho, qualquer trabalho restante é cancelado e qualquer trabalho já concluído é devolvido. Você será cobrado por qualquer trabalho concluído.

Os dados armazenados em repouso permanecem na geografia designada do Azure, enquanto os dados podem ser processados para inferência em qualquer local do Azure OpenAI.  Saiba mais sobre residência de dados. 

Suporte em lote

Disponibilidade global do modelo de processamento em lote

Região GPT-5, 2025-08-07 O3, 2025-04-16 O4-MINI, 2025-04-16 GPT-4.1, 14-04-2025 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
leste da Austrália
Brasil Sul
Canadá Leste
Centralus
Eastus
Eastus2
FranceCentral
Alemanha Oeste Central
JapãoLeste
Coreia Central
Centro-Norte
Noruega Oriental
Polónia Central
southafricanorth
Centro-Sul
Sul da Índia
suécia central
suíçanorte
UKSOUTH
Europa Ocidental
Westus
Westus3

O registo é necessário para aceder a gpt-5 e o3. Para mais informações, consulte o nosso guia de modelos de raciocínio.

Os seguintes modelos suportam lote global:

Modelo Versão Formato de entrada
gpt-5 2025-08-7 texto + imagem
o3 2025-04-16 texto + imagem
o3-mini 31-01-2025 enviar SMS
gpt-4o 2024-08-06 texto + imagem
gpt-4o-mini 18-07-2024 texto + imagem
gpt-4o 13 de maio de 2024 texto + imagem

Observação

Embora o Global Batch ofereça suporte a versões mais antigas da API, alguns modelos exigem versões mais recentes da API de visualização. Por exemplo, o3-mini não é compatível com 2024-10-21 por ter sido lançado após esta data. Para acessar os modelos mais recentes com lote global, use a versão mais recente da API de visualização.

Suporte de funcionalidades

No momento, não há suporte para os seguintes itens:

  • Integração com a API de Assistentes.
  • Integração com o recurso Azure OpenAI On Your Data.

Implantação em lote

Observação

No portal Microsoft Foundry , os tipos de implementação em lote aparecerão como Global-Batch e Data Zone Batch. Para saber mais sobre os tipos de implantação do Azure OpenAI, consulte nosso guia de tipos de implantação.

Sugestão

Recomendamos ativar a cota dinâmica para todas as implementações de modelos de lote global para ajudar a evitar falhas de execução devido à insuficiência de cota de tokens enfileirados. O uso da cota dinâmica permite que sua implantação aproveite oportunisticamente mais cota quando houver capacidade extra disponível. Quando a cota dinâmica estiver definida como desativada, a sua implementação só poderá processar pedidos até ao limite de tokens em fila que foi definido quando criou a implementação.

Pré-requisitos

  • Uma assinatura do Azure - Crie uma gratuitamente.
  • Um recurso com um modelo de implementação do tipo GlobalBatch ou DataZoneBatch implantado.

Preparar o seu ficheiro batch

Tal como no ajuste fino, o .jsonl utiliza arquivos no formato de linhas JSON (.jsonl). Abaixo estão alguns exemplos de arquivos com diferentes tipos de conteúdo suportado:

Formato de entrada

API de Respostas

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

API de conclusão de bate-papo

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

O custom_id é necessário para permitir que você identifique qual solicitação de lote individual corresponde a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no .jsonl arquivo em lotes.

model deve ser definido para coincidir com o nome da implantação Global Batch que pretendes direcionar para obter respostas de inferência.

Importante

O atributo model deve ser configurado para corresponder ao nome da implementação do Global Batch que pretende direcionar para as respostas de inferência. O mesmo nome de implantação do modelo de lote global deve estar presente em cada linha do arquivo em lotes. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo/trabalho em lote separado.

Para obter o melhor desempenho, recomendamos o envio de arquivos grandes para processamento em lote, em vez de um grande número de arquivos pequenos com apenas algumas linhas em cada arquivo.

Criar arquivo de entrada

Para este artigo, criaremos um arquivo chamado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo.

Criar tarefa em lote

Uma vez que seu arquivo de entrada é preparado, você primeiro precisa carregar o arquivo para então ser capaz de iniciar um trabalho em lote. O carregamento de ficheiros pode ser feito tanto programaticamente como através do portal Microsoft Foundry. Este exemplo demonstra o carregamento de um arquivo diretamente para seu recurso do Azure OpenAI. Como alternativa, você pode configurar o Armazenamento de Blob do Azure para o Azure OpenAI Batch.

  1. Inicie sessão no Microsoft Foundry. Certifica-te de que a opção do New Foundry está desligada. Estes passos referem-se à Foundry (clássica).

  2. Selecione o recurso OpenAI do Azure onde tem disponível uma implantação de modelo de lote global.

  3. Selecione Trabalhos em lote>+Criar trabalhos em lote.

    Captura de ecrã que mostra a experiência de criação de empregos em lote no portal Foundry.

  4. Na lista suspensa, em Batch data>Upload files>, selecione Carregar arquivo e forneça o caminho para o test.jsonl arquivo criado na etapa > anterior. Avançar.

    Captura de ecrã que mostra a experiência de carregar ficheiros.

Selecione Criar para iniciar o trabalho em lote.

  1. Inicie sessão no Microsoft Foundry. Certifica-te de que a opção New Foundry está ativada. Estes passos referem-se ao Foundry (novo).

  2. No canto superior direito, selecionar Build

  3. No painel da esquerda, selecione Modelos

  4. Selecionar Trabalhos em Lote> e criar um trabalho em lote

    Captura de ecrã da nova experiência de criação de lotes no Foundry.

Acompanhar o progresso de tarefas em lote

Depois que o trabalho for criado, você poderá monitorar o progresso do trabalho selecionando a ID do trabalho criado mais recentemente. Por padrão, você será direcionado para a página de status do trabalho em lote criado mais recentemente.

Você pode acompanhar o estado da tarefa no painel à direita.

Recuperar ficheiro de saída de trabalho em lote

Uma vez que seu trabalho tenha sido concluído ou atingido um estado terminal, ele irá gerar um arquivo de erro e um arquivo de saída que pode ser baixado para revisão, selecionando o respetivo botão com o ícone de seta para baixo.

Cancelar lote

Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de mudar para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.

Acompanhar o progresso de tarefas em lote

Depois que o trabalho for criado, você poderá monitorar o progresso do trabalho selecionando a ID do trabalho criado mais recentemente. Por padrão, você será direcionado para a página de status do trabalho em lote criado mais recentemente.

Você pode acompanhar o estado da tarefa no painel à direita.

Recuperar ficheiro de saída de trabalho em lote

Uma vez que seu trabalho tenha sido concluído ou atingido um estado terminal, ele irá gerar um arquivo de erro e um arquivo de saída que pode ser baixado para revisão, selecionando o respetivo botão com o ícone de seta para baixo.

Cancelar lote

Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de mudar para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.

Pré-requisitos

As etapas neste artigo destinam-se a ser executadas sequencialmente no Jupyter Notebooks. Por esse motivo, só instanciaremos o cliente OpenAI do Azure uma vez no início dos exemplos. Se você quiser executar uma etapa fora de ordem, muitas vezes precisará configurar um cliente OpenAI do Azure como parte dessa chamada.

Mesmo que você já tenha a biblioteca OpenAI Python instalada, talvez seja necessário atualizar sua instalação para a versão mais recente:

!pip install openai --upgrade

Preparar o seu ficheiro batch

Tal como o fine-tuning, o lote global utiliza ficheiros no formato de linhas JSON (.jsonl). Abaixo estão alguns exemplos de arquivos com diferentes tipos de conteúdo suportado:

Formato de entrada

API de Respostas

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

API de conclusão de bate-papo

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

O custom_id é necessário para permitir que você identifique qual solicitação de lote individual corresponde a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no .jsonl arquivo em lotes.

model deve ser definido para coincidir com o nome da implantação Global Batch que pretendes direcionar para obter respostas de inferência.

Importante

O atributo model deve ser configurado para corresponder ao nome da implementação do Global Batch que pretende direcionar para as respostas de inferência. O mesmo nome de implantação do modelo de lote global deve estar presente em cada linha do arquivo em lotes. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo/trabalho em lote separado.

Para obter o melhor desempenho, recomendamos o envio de arquivos grandes para processamento em lote, em vez de um grande número de arquivos pequenos com apenas algumas linhas em cada arquivo.

Criar arquivo de entrada

Para este artigo, criaremos um arquivo chamado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo. Salve este arquivo no mesmo diretório que você está executando seu Jupyter Notebook.

Carregar ficheiro batch

Uma vez que seu arquivo de entrada é preparado, você primeiro precisa carregar o arquivo para então ser capaz de iniciar um trabalho em lote. O carregamento de ficheiros pode ser feito tanto programaticamente como através do portal Microsoft Foundry. Este exemplo demonstra o carregamento de um arquivo diretamente para seu recurso do Azure OpenAI. Como alternativa, você pode configurar o Armazenamento de Blob do Azure para o 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

Ao remover o comentário e adicionar extra_body={"expires_after":{"seconds": 1209600, "anchor": "created_at"}}, está a configurar o nosso ficheiro de upload para expirar em 14 dias. Há um limite máximo de 500 ficheiros batch de entrada por recurso quando não há expiração definida. Ao definir um valor para expiração, o número de ficheiros batch de entrada por recurso aumenta para 10.000 ficheiros por recurso. Para remover limites de ficheiros de entrada por lote, use Batch com Azure Blob Storage.

Saída:

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

Criar tarefa em lote

Uma vez que seu arquivo tenha sido carregado com sucesso, você pode enviá-lo para processamento em lote.

# 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))

Observação

Atualmente, a janela de conclusão deve ser definida para 24h. Se definir qualquer outro valor além de 24h, o seu trabalho falhará. Os trabalhos com duração superior a 24 horas continuarão a ser executados até serem cancelados.

Saída:

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

Se os seus trabalhos em lote forem tão grandes que atinjam o limite de tokens em fila mesmo após maximizar a quota para o seu serviço, certas regiões agora suportam uma nova funcionalidade fail fast que permite enfileirar múltiplos trabalhos em lote com recuo exponencial, para que uma vez que um grande trabalho em lote seja concluído, o próximo possa ser iniciado automaticamente. Para saber mais sobre quais regiões suportam esta funcionalidade e como adaptar o seu código para tirar proveito dela, veja queuing batch jobs.

Acompanhar o progresso de tarefas em lote

Depois de criar o trabalho em lote com sucesso, você pode monitorar seu progresso no Studio ou programaticamente. Ao verificar o progresso do trabalho em lote, recomendamos aguardar pelo menos 60 segundos entre cada chamada de status.

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}")

Saída:

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

Os seguintes valores de status são possíveis:

Situação Descrição
validating O arquivo de entrada está sendo validado antes que o processamento em lote possa começar.
failed O arquivo de entrada falhou no processo de validação.
in_progress O arquivo de entrada foi validado com êxito e o lote está em execução no momento.
finalizing O lote foi concluído e os resultados estão a ser preparados.
completed O lote foi concluído e os resultados estão prontos.
expired O lote não pôde ser concluído dentro da janela de tempo de 24 horas.
cancelling O lote está a ser cancelled (Isto pode levar até 10 minutos para entrar em vigor.)
cancelled o lote era cancelled.

Para examinar os detalhes do status do trabalho, você pode executar:

print(batch_response.model_dump_json(indent=2))

Saída:

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

Observe que há ambos error_file_id e um output_file_id separado. Utilize o error_file_id para ajudar na depuração de quaisquer problemas que ocorram com o seu trabalho em lote.

Recuperar ficheiro de saída de trabalho em lote

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)

Saída:

Para concisão, estamos a incluir apenas uma única resposta de conclusão de chat. Se você seguir as etapas neste artigo, você deve ter três respostas semelhantes à abaixo:

Finalizações de chat

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

API de Respostas

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

Comandos em lote adicionais

Cancelar lote

Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de mudar para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.

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

Listar lote

Liste trabalhos em lote para um recurso específico do Azure OpenAI.

client.batches.list()

Os métodos de lista na biblioteca Python são paginados.

Para listar todos os trabalhos:

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)

Listar lote (Pré-visualização)

Use a API REST para listar todos os trabalhos em lote com opções adicionais de classificação/filtragem.

Nos exemplos abaixo, estamos a fornecer a função generate_time_filter para facilitar a construção do filtro. Se você não deseja usar essa função, o formato da cadeia de caracteres do filtro seria parecido com 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)  

Saída:

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

Enfileirando tarefas em lote

Se os seus trabalhos em lotes forem tão grandes que atinjam o limite de tokens enfileirados, mesmo após esgotar a cota para a sua implementação, certas regiões já suportam uma nova funcionalidade de falha rápida que permite a enfileiramento de múltiplos trabalhos em lotes com retrocesso exponencial. Assim que um grande trabalho em lote estiver concluído e a sua quota de tokens em fila estiver novamente disponível, o próximo trabalho em lote pode ser criado e iniciado automaticamente.

Comportamento antigo:

  1. Processos de grande lote já estão em execução e usando todos os tokens disponíveis para a sua implementação.
  2. Novo trabalho em lote submetido.
  3. Um novo trabalho em lote entra na fase de validação, que pode durar até alguns minutos.
  4. O número de tokens para o novo trabalho é verificado em relação à quota disponível atualmente.
  5. O novo trabalho em lote falha devido ao limite de tokens excedido ao relatar erros.

Novo comportamento:

  1. Tarefa de processamento em lote já em execução e usando todos os tokens disponíveis para a sua implementação
  2. Novo processo em lote submetido
  3. A contagem aproximada de tokens do novo trabalho é imediatamente comparada com a cota de lotes atualmente disponível, permitindo que o trabalho falhe rapidamente para que possa lidar mais facilmente com novas tentativas de forma programática.

Suporte de região

As seguintes regiões suportam o novo comportamento de falha rápida:

  • leste da Austrália
  • Eastus
  • Alemanha Oeste Central
  • ItáliaNorte
  • Centro-Norte
  • Polónia Central
  • suécia central
  • suíçanorte
  • Eastus2
  • Westus

O código abaixo demonstra os mecanismos básicos de gerir o comportamento de falha rápida para permitir a automatização de tentativas e o enfileiramento de trabalhos em lote com escalonamento exponencial.

Dependendo do tamanho dos seus trabalhos em lote, pode ser necessário aumentar significativamente o max_retries ou alterar ainda mais este exemplo.

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

Saída:

⏳ 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
  }
}

Pré-requisitos

Preparar o seu ficheiro batch

Tal como o fine-tuning, o lote global utiliza ficheiros no formato de linhas JSON (.jsonl). Abaixo estão alguns exemplos de arquivos com diferentes tipos de conteúdo suportado:

Formato de entrada

API de Respostas

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

API de conclusão de bate-papo

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

O custom_id é necessário para permitir que você identifique qual solicitação de lote individual corresponde a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no .jsonl arquivo em lotes.

model deve ser definido para coincidir com o nome da implantação Global Batch que pretendes direcionar para obter respostas de inferência.

Importante

O atributo model deve ser configurado para corresponder ao nome da implementação do Global Batch que pretende direcionar para as respostas de inferência. O mesmo nome de implantação do modelo de lote global deve estar presente em cada linha do arquivo em lotes. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo/trabalho em lote separado.

Para obter o melhor desempenho, recomendamos o envio de arquivos grandes para processamento em lote, em vez de um grande número de arquivos pequenos com apenas algumas linhas em cada arquivo.

Criar arquivo de entrada

Para este artigo, criaremos um arquivo chamado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo.

Carregar ficheiro batch

Uma vez que seu arquivo de entrada é preparado, você primeiro precisa carregar o arquivo para então ser capaz de iniciar um trabalho em lote. O carregamento de ficheiros pode ser feito tanto programaticamente como através do portal Microsoft Foundry. Este exemplo demonstra o carregamento de um arquivo diretamente para seu recurso do Azure OpenAI. Como alternativa, você pode configurar o Armazenamento de Blob do Azure para o Azure OpenAI Batch.

Importante

Use chaves de API com cuidado. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente. Se você usar uma chave de API, armazene-a com segurança no Cofre de Chaves do Azure. Para obter mais informações sobre como usar chaves de API com segurança em seus aplicativos, consulte Chaves de API com o Cofre de Chaves do Azure.

Para obter mais informações sobre segurança de serviços de IA, consulte Autenticar solicitações para serviços de IA do Azure.

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"

O código acima assume um caminho de arquivo específico para seu arquivo test.jsonl. Ajuste esse caminho de arquivo conforme necessário para seu sistema local.

Ao adicionar os parâmetros opcionais "expires_after.seconds=1209600" e "expires_after.anchor=created_at", está a definir que o seu ficheiro de carregamento expire dentro de 14 dias. Há um limite máximo de 500 ficheiros de entrada por lote por recurso quando não há expiração definida. Ao definir um valor para a expiração, o número de ficheiros em lote por recurso é aumentado para 10.000 ficheiros por recurso. Pode definir um número entre 1209600-2592000. Isto é equivalente a 14-30 dias. Para remover limites de ficheiros de entrada por lote, use Batch com Azure Blob Storage.

Saída:

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

Acompanhe o status de upload de arquivos

Dependendo do tamanho do seu ficheiro de carregamento, poderá demorar algum tempo até que seja totalmente carregado e processado. Para verificar o status de upload do arquivo, execute:

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

Saída:

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

Criar tarefa em lote

Uma vez que seu arquivo tenha sido carregado com sucesso, você pode enviá-lo para processamento em lote.

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"
  }'

Aqui pode, opcionalmente, adicionar "output_expires_after":{"seconds": 1209600}, e "anchor": "created_at" para que os seus ficheiros de saída expirem em 14 dias.

Observação

Atualmente, a janela de conclusão deve ser definida para 24h. Se definir qualquer outro valor além de 24h, o seu trabalho falhará. Os trabalhos com duração superior a 24 horas continuarão a ser executados até serem cancelados.

Saída:

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

Acompanhar o progresso de tarefas em lote

Depois de criar o trabalho em lote com sucesso, você pode monitorar seu progresso no Studio ou programaticamente. Ao verificar o progresso do trabalho em lote, recomendamos aguardar pelo menos 60 segundos entre cada chamada de status.

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

Saída:

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

Os seguintes valores de status são possíveis:

Situação Descrição
validating O arquivo de entrada está sendo validado antes que o processamento em lote possa começar.
failed O arquivo de entrada falhou no processo de validação.
in_progress O arquivo de entrada foi validado com êxito e o lote está em execução no momento.
finalizing O lote foi concluído e os resultados estão a ser preparados.
completed O lote foi concluído e os resultados estão prontos.
expired O lote não pôde ser concluído dentro da janela de tempo de 24 horas.
cancelling O lote está a ser cancelled (Isto pode levar até 10 minutos para ter efeito.)
cancelled o lote era cancelled.

Recuperar ficheiro de saída de trabalho em lote

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

Comandos em lote adicionais

Cancelar lote

Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de mudar para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.

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

Listar lote

Liste trabalhos em lote existentes para um determinado recurso do Azure OpenAI.

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

A chamada à API para listar é paginada. A resposta contém um valor booleano has_more para indicar quando existem mais resultados para iterar.

Listar lote (Pré-visualização)

Use a API REST para listar todos os trabalhos em lote com opções adicionais de classificação/filtragem.

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"

Para evitar o erro URL rejected: Malformed input to a URL function , os espaços são substituídos por %20.

Limites de lotes

Nome do limite Valor-limite
Ficheiros de entrada por lote máximo - (sem expiração) 500
Número máximo de ficheiros de entrada em lote - (definição de expiração) 10,000
Tamanho máximo do arquivo de entrada 200 MB
Máximo de pedidos por ficheiro 100,000

Observação

Os limites de ficheiros em lote não se aplicam a ficheiros de saída (por exemplo, result.jsonl, e error.jsonl). Para eliminar os limites dos ficheiros de entrada em lote, utilize Batch com Azure Blob Storage.

Limite de lotes

A tabela mostra o limite de cota de lote. Os valores de cota para lote global são representados em tokens enfileirados. Quando você envia um arquivo para processamento em lote, o número de tokens no arquivo é contado. Até que o trabalho em lote atinja um estado terminal, esses tokens contam em relação ao seu limite total de tokens enfileirados.

Lote mundial

Modelo Enterprise e MCA-E Predefinido Subscrições mensais baseadas em cartão de crédito Assinaturas do MSDN Azure para Estudantes, versões experimentais gratuitas
gpt-4.1 5 B 200 milhões 50 M. 90K N/A
gpt-4.1 mini 15 B 1 B 50 M. 90K N/A
gpt-4.1-nano 15 B 1 B 50 M. 90K N/A
gpt-4o 5 B 200 milhões 50 M. 90K N/A
gpt-4o-mini 15 B 1 B 50 M. 90K N/A
gpt-4-turbo 300 milhões 80 milhões 40 milhões 90K N/A
gpt-4 150 milhões 30 milh 5 milhões 100.000 N/A
o3-mini 15 B 1 B 50 M. 90K N/A
o4-mini 15 B 1 B 50 M. 90K N/A
gpt-5 5 B 200 milhões 50 M. 90K N/A

B = mil milhões | M = milhão | K = mil

Agrupamento de dados por zonas

Modelo Enterprise e MCA-E Predefinido Subscrições mensais baseadas em cartão de crédito Assinaturas do MSDN Azure para Estudantes, versões experimentais gratuitas
gpt-4.1 500 milhões 30 milh 30 milh 90K N/A
gpt-4.1-mini 1,5 B 100 milhões 50 M. 90K N/A
gpt-4o 500 milhões 30 milh 30 milh 90K N/A
gpt-4o-mini 1,5 B 100 milhões 50 M. 90K N/A
o3-mini 1,5 B 100 milhões 50 M. 90K N/A
gpt-5 5 B 200 milhões 50 M. 90K N/A

Objeto em lote

Propriedade Tipo Definição
id cadeia (de caracteres)
object cadeia (de caracteres) batch
endpoint cadeia (de caracteres) O endpoint da API utilizado pelo batch
errors objecto
input_file_id cadeia (de caracteres) O ID do ficheiro de entrada para o lote
completion_window cadeia (de caracteres) O prazo dentro do qual o lote deve ser processado
status cadeia (de caracteres) O status atual do lote. Valores possíveis: validating, failed, in_progress, finalizing, completed, expired, cancelling, cancelled.
output_file_id cadeia (de caracteres) A ID do arquivo que contém as saídas de solicitações executadas com êxito.
error_file_id cadeia (de caracteres) O ID do arquivo que contém as saídas de solicitações com erros.
created_at número inteiro Um carimbo de data/hora quando este lote foi criado (em épocas Unix).
in_progress_at número inteiro A data e hora em que este lote começou a progredir (em era Unix).
expires_at número inteiro Um carimbo de data/hora indicando quando este lote expirará (em Unix epoch).
finalizing_at número inteiro Um registo de data e hora em que este lote começou a ser finalizado (em épocas Unix).
completed_at número inteiro Um registo de data e hora em que este lote começou a ser finalizado (em épocas Unix).
failed_at número inteiro Uma data/hora em que este lote falhou (em epoch Unix)
expired_at número inteiro Um carimbo de data/hora quando este lote expirou (em épocas Unix).
cancelling_at número inteiro Carimbo de data e hora quando este lote começou cancelling (em época Unix).
cancelled_at número inteiro Um carimbo de data e hora quando este lote foi cancelled (em épocas Unix).
request_counts objecto Estrutura do objeto:

total inteiro
O número total de solicitações no lote.
completed inteiro
O número de solicitações no lote que foram concluídas com êxito.
failed inteiro
O número de solicitações no lote que falharam.
metadata mapa Um conjunto de pares chave-valor que pode ser anexado ao lote. Essa propriedade pode ser útil para armazenar informações adicionais sobre o lote em um formato estruturado.

Perguntas frequentes (FAQ)

As imagens podem ser usadas com a API em modo batch?

Esta capacidade está limitada a determinados modelos multimodais. Atualmente, apenas GPT-4o suporta imagens como parte de solicitações em lote. As imagens podem ser fornecidas como entrada via url da imagem ou uma representação codificada base64 da imagem. As imagens em lote não são atualmente suportadas pelo GPT-4 Turbo.

Posso usar a API de processamento em lote com modelos afinados?

No momento, isso não é suportado.

Posso usar a API em lote para incorporar modelos?

No momento, isso não é suportado.

A filtragem de conteúdo funciona com a implantação do Global Batch?

Sim. Semelhante a outros tipos de implantação, você pode criar filtros de conteúdo e associá-los ao tipo de implantação de Lote Global.

Posso pedir quota adicional?

Pode aceder a partir da página de quotas no portal da Foundry. A alocação de cota padrão pode ser encontrada no artigo cota e limites.

O que acontece se a API não concluir minha solicitação dentro do prazo de 24 horas?

Pretendemos processar estes pedidos no prazo de 24 horas; não expiramos os trabalhos que demoram mais tempo. Você pode cancelar o trabalho a qualquer momento. Quando você cancela o trabalho, qualquer trabalho restante é cancelado e qualquer trabalho já concluído é devolvido. Você será cobrado por qualquer trabalho concluído.

Quantas solicitações posso enfileirar em processamento em lote?

Não há um limite fixo para o número de pedidos que poderá agrupar, no entanto, isto dependerá da sua quota de tokens em fila. A sua quota de fichas enfileiradas inclui o número máximo de fichas de entrada que pode enfileirar ao mesmo tempo.

Assim que a solicitação de lote for concluída, o limite de pedidos em lote será redefinido, uma vez que os seus tokens de entrada são removidos. O limite depende do número de solicitações globais na fila. Se a fila da API Batch processar os seus lotes rapidamente, o limite da taxa do lote será redefinido mais rapidamente.

Solução de problemas

Um trabalho é bem-sucedido quando status é Completed. Os trabalhos bem-sucedidos ainda gerarão um error_file_id, mas ele será associado a um arquivo vazio com zero bytes.

Quando ocorre uma falha numa tarefa, encontrará detalhes sobre a falha na propriedade 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
            },
        }

Códigos de erro

Código de erro Definição
invalid_json_line Uma linha (ou várias) no seu arquivo de entrada não pôde ser analisada como json válido.

Certifique-se de que não há erros de digitação, colchetes de abertura e fechamento adequados e cotações de acordo com o padrão JSON e reenvie a solicitação.
too_many_tasks O número de solicitações no arquivo de entrada excede o valor máximo permitido de 100.000.

Certifique-se de que o total de pedidos é inferior a 100.000 e reenvie o trabalho.
url_mismatch Uma linha no arquivo de entrada tem uma URL que não corresponde ao resto das linhas ou a URL especificada no arquivo de entrada não corresponde à URL do ponto de extremidade esperado.

Certifique-se de que todas as URLs de solicitação sejam as mesmas e que correspondam à URL de ponto de extremidade associada à sua implantação do Azure OpenAI.
model_not_found O nome de implantação do modelo OpenAI do Azure especificado na model propriedade do arquivo de entrada não foi encontrado.

Certifique-se de que esse nome aponte para uma implantação válida do modelo OpenAI do Azure.
duplicate_custom_id A ID personalizada para esta solicitação é uma duplicata da ID personalizada em outra solicitação.
empty_batch Verifique seu arquivo de entrada para garantir que o parâmetro ID personalizado seja exclusivo para cada solicitação no lote.
model_mismatch O nome de implantação do modelo OpenAI do Azure especificado na model propriedade desta solicitação no arquivo de entrada não corresponde ao restante do arquivo.

Por favor, certifique-se de que todos os pedidos no lote apontam para a mesma implantação do modelo Azure OpenAI in Foundry Models na propriedade model do pedido.
invalid_request O esquema da linha de entrada é inválido ou a SKU de implantação é inválida.

Verifique se as propriedades da solicitação em seu arquivo de entrada correspondem às propriedades de entrada esperadas e se o SKU de implantação do Azure OpenAI é globalbatch para solicitações de API em lote.
input_modified A entrada de dados do blob foi modificada após o envio do trabalho em lote.
input_no_permissions Não é possível acessar o blob de entrada. Verifique as permissões e o acesso à rede entre a conta do Azure OpenAI e a conta do Armazenamento do Azure.

Problemas conhecidos

  • Os recursos implantados com a CLI do Azure não estarão operacionais de imediato com o lote global do Azure OpenAI. Isso ocorre devido a um problema em que os recursos implantados usando este método têm subdomínios de endpoints que não seguem o https://your-resource-name.openai.azure.com padrão. Uma solução alternativa para esse problema é implantar um novo recurso do Azure OpenAI usando um dos outros métodos de implantação comuns que manipularão corretamente a configuração do subdomínio como parte do processo de implantação.

  • Arquivos codificados jsonl UTF-8-BOM não são suportados. Os arquivos de linhas JSON devem ser codificados usando UTF-8. O uso de ficheiros codificados com Byte-Order-Mark (BOM) não é oficialmente suportado pela especificação JSON RFC, e o Azure OpenAI irá atualmente tratar ficheiros codificados com BOM como inválidos. Atualmente, um arquivo codificado UTF-8-BOM retornará a mensagem de erro genérica: "Falha na validação: não foi possível extrair um nome de implantação de modelo válido do arquivo de entrada. Certifique-se de que cada linha no arquivo de entrada tenha um nome de implantação válido especificado no campo 'modelo' e que o nome da implantação seja consistente em todas as linhas."

  • Ao usar seu próprio armazenamento para dados de entrada em lote, uma vez que o trabalho em lote é enviado, se o blob de entrada for modificado, o trabalho de pontuação será reprovado pelo serviço.

Ver também

  • Saiba mais sobre os tipos de implantação do Azure OpenAI
  • Saiba mais sobre as cotas e limites do Azure OpenAI