Aprenda a usar el modo JSON

El modo JSON permite establecer el formato de respuesta del modelo para devolver un objeto JSON válido como parte de una finalización del chat. Aunque la generación de JSON válido era posible anteriormente, podría haber problemas con la coherencia de la respuesta que provocaría que se generaran objetos JSON no válidos.

El modo JSON garantiza una salida JSON válida, pero no garantiza que la salida coincida con un esquema específico. Si necesita garantías de esquema, use Salidas estructuradas.

Nota

Aunque el modo JSON sigue siendo compatible, siempre que sea posible, se recomienda usar salidas estructuradas. Al igual que las salidas estructuradas en modo JSON generan JSON válidos, pero con la ventaja agregada que puede restringir el modelo para usar un esquema JSON específico.

Nota

Actualmente, las salidas estructuradas no se admiten en el escenario de 'bring your own data'.

Compatibilidad con el modo JSON

El modo JSON solo se admite actualmente con los siguientes modelos:

Compatibilidad con API

La compatibilidad con el modo JSON se agregó por primera vez en la versión de API 2023-12-01-preview

Ejemplo

Antes de ejecutar los ejemplos:

  • Reemplace YOUR-RESOURCE-NAME por el nombre del recurso de OpenAI de Azure.
  • Reemplace YOUR-MODEL_DEPLOYMENT_NAME por el nombre de la implementación del modelo.

En los ejemplos siguientes se muestra el modo JSON mediante los SDK de Python y .NET y PowerShell para la interacción directa con REST.

import os
from openai import OpenAI

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

response = client.chat.completions.create(
  model="YOUR-MODEL_DEPLOYMENT_NAME", # Model = should match the deployment name you chose for your model deployment
  response_format={ "type": "json_object" },
  messages=[
    {"role": "system", "content": "You are a helpful assistant designed to output JSON."},
    {"role": "user", "content": "Who won the world series in 2020?"}
  ]
)
print(response.choices[0].message.content)

Salida

{
  "winner": "Los Angeles Dodgers",
  "event": "World Series",
  "year": 2020
}

Se deben cumplir dos requisitos para usar el modo JSON correctamente:

  • Establezca el formato json_object de respuesta en en la solicitud. En Python, pase response_format={ "type": "json_object" }; en .NET, use ChatResponseFormat.CreateJsonObjectFormat(); en PowerShell, establezca response_format = @{type = 'json_object'}.
  • Incluya la palabra "JSON" en algún lugar de la conversación de mensajes (normalmente el mensaje del sistema).

Se requiere incluir una guía para que el modelo genere JSON como parte de la conversación de mensajes. Se recomienda agregar esta instrucción como parte del mensaje del sistema. Según OpenAI, el error al agregar esta instrucción puede provocar que el modelo "genere una secuencia de espacios en blanco no deseada y la solicitud se pueda ejecutar continuamente hasta que alcance el límite del token".

Error al incluir "JSON" dentro de los mensajes devuelve:

Salida

BadRequestError: Error code: 400 - {'error': {'message': "'messages' must contain the word 'json' in some form, to use 'response_format' of type 'json_object'.", 'type': 'invalid_request_error', 'param': 'messages', 'code': None}}

Otras consideraciones

Debe comprobar el valor length de finish_reason antes de analizar la respuesta. El modelo puede generar JSON parcial. Esto significa que la salida del modelo era mayor que los tokens máximos disponibles que se establecieron como parte de la solicitud, o la propia conversación superó el límite de tokens.

El modo JSON genera JSON que es válido y analiza sin errores. Sin embargo, no hay ninguna garantía de que la salida coincida con un esquema específico, aunque se solicite en el aviso.

Solución de problemas

  • Si finish_reason es length, aumente max_tokens (o reduzca la longitud del mensaje) y vuelva a intentarlo. No analice JSON parcial.
  • Si necesita garantías de esquema, cambie a Salidas estructuradas.