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

É necessário registar-se para aceder ao o3-mini. 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
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

Suporte de API

Versão da API
Versão mais recente da API do GA: 2024-10-21
Versão mais recente da API de visualização suportada: 2025-04-01-preview

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 do Azure AI Foundry, os tipos de implantaçã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.

Captura de ecrã que mostra a caixa de diálogo de implementação do modelo no portal do Azure AI Foundry com o tipo de implementação Global-Batch realçado.

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

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

{"custom_id": "task-0", "method": "POST", "url": "/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": "/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": "/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 efetuado de forma programática ou através do portal do Azure AI 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. Entre no portal do Azure AI Foundry.

  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 tela que mostra a experiência de criação de trabalho em lote no portal do Azure AI 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.

Criar tarefa em lote

Selecione Criar para iniciar o trabalho em lote.

Captura de tela da experiência no portal para criar um trabalho em lote no Azure AI 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.

Captura de tela que mostra a ID do trabalho em lote para um trabalho atualmente em validação.

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

Captura de tela que mostra a experiência de status do trabalho em lote no portal do Azure AI Foundry.

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.

Captura de tela que mostra a saída do trabalho em lote e os arquivos de erro disponíveis para download.

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.

Captura de tela que mostra o botão de cancelamento de trabalho em lote no portal do Azure AI Foundry.

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

{"custom_id": "task-0", "method": "POST", "url": "/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": "/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": "/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 efetuado de forma programática ou através do portal do Azure AI 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 openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

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

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  azure_ad_token_provider=token_provider,
  api_version="2025-04-01-preview"
)

# 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. Existe um limite máximo de 500 ficheiros de lote por recurso quando nenhuma data de expiração está 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.

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

O limite padrão máximo de 500 ficheiros por recurso também se aplica aos ficheiros de saída. Aqui, pode descomentar esta linha para adicionar extra_body={"output_expires_after":{"seconds": 1209600, "anchor": "created_at"}}, de modo que os seus ficheiros de saída expirem em 14 dias. Ao definir um valor para a expiração, o número de ficheiros em lote por recurso é aumentado para 10.000 ficheiros por recurso.

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:

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

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

{"custom_id": "task-0", "method": "POST", "url": "/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": "/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": "/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 efetuado de forma programática ou através do portal do Azure AI 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/files?api-version=2025-03-01-preview \
  -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. Existe um limite máximo de 500 ficheiros de lote por recurso quando nenhuma data de expiração está 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.

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/files/{file-id}?api-version=2025-03-01-preview \
  -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/batches?api-version=2025-03-01-preview \
  -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"
  }'

O limite padrão máximo de 500 ficheiros por recurso também se aplica aos ficheiros de saída. 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. Ao definir um valor para a expiração, o número de ficheiros em lote por recurso é aumentado para 10.000 ficheiros por recurso.

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/batches/{batch_id}?api-version=2025-03-01-preview \
  -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/files/{output_file_id}/content?api-version=2025-03-01-preview \
  -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/batches/{batch_id}/cancel?api-version=2025-03-01-preview \
  -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/batches?api-version=2025-03-01-preview \
  -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-03-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
Máximo de arquivos por recurso 500
Tamanho máximo do arquivo de entrada 200 MB
Máximo de solicitações por arquivo 100,000

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 presentes no arquivo é contado. Até que o trabalho em lote atinja um estado terminal, esses tokens contarão para o seu limite total de tokens enfileirados.

Lote mundial

Modelo Contrato Enterprise Predefinido Subscrições mensais baseadas em cartões de crédito Assinaturas do MSDN Azure para Estudantes, Versões Experimentais Gratuitas
gpt-4.1 5 B 200 milhões 50 milhões 90 K N/A
gpt-4.1 mini 15 B 1 B 50 M. 90 mil N/A
gpt-4.1-nano 15 B 1 B 50 milhões 90 K N/A
gpt-4o 5 B 200 milhões 50 milhões 90 K N/A
gpt-4o-mini 15 B 1 B 50 milhões 90 K N/A
gpt-4-turbo 300 milhões 80 milhões 40 milhões 90 K N/A
gpt-4 150 milhões 30 milhões 5 milhões 100 K N/A
gpt-35-turbo 10 B 1 B 100 milhões 2 milhões 50 K
o3-mini 15 B 1 B 50 milhões 90 K N/A
o4-mini 15 B 1 B 50 milhões 90 K N/A

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

Agrupamento de dados por zonas

Modelo Contrato Enterprise Predefinido Subscrições mensais baseadas em cartões de crédito Assinaturas do MSDN Azure para Estudantes, Versões Experimentais Gratuitas
gpt-4.1 500 milhões 30 milhões 30 milhões 90 K N/A
gpt-4.1-mini 1,5 B 100 milhões 50 milhões 90 K N/A
gpt-4o 500 milhões 30 milhões 30 milhões 90 K N/A
gpt-4o-mini 1,5 B 100 milhões 50 milhões 90 K N/A
o3-mini 1,5 B 100 milhões 50 milhões 90 K 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?

Sim, na página de quota no portal do Azure AI 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.

Certifique-se de que todas as solicitações no lote apontem para a mesma implantação do modelo do Azure OpenAI no Azure AI Foundry Models na propriedade model da solicitação.
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."

Ver também

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