Aprenda a usar el modo JSON
El modo JSON permite establecer el formato de respuesta de los modelos 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 antes, podría haber problemas con la coherencia de la respuesta que provocaría que se generaran objetos JSON no válidos.
Compatibilidad con el modo JSON
El modo JSON solo es compatible actualmente con los siguientes modelos:
Modelos admitidos
gpt-35-turbo
(1106)gpt-35-turbo
(0125)gpt-4
(1106-Preview)gpt-4
(0125-Preview)
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
import os
from openai import AzureOpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-03-01-preview"
)
response = client.chat.completions.create(
model="gpt-4-0125-Preview", # Model = should match the deployment name you chose for your 0125-Preview 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)
Output
{
"winner": "Los Angeles Dodgers",
"event": "World Series",
"year": 2020
}
Hay dos factores clave que deben estar presentes para usar correctamente el modo JSON:
response_format={ "type": "json_object" }
- Hemos dicho al modelo que genere JSON como parte del mensaje del sistema.
Se requieren instrucciones para el modelo que debe generar JSON como parte de la conversación de mensajes. Se recomienda agregar instrucciones como parte del mensaje del sistema. Según el error de OpenAI, agregar esta instrucción puede provocar que el modelo "genere una secuencia de espacios en blanco no deseada y la solicitud se ejecute continuamente hasta que alcance el límite del token".
Si no se incluye "JSON" en los mensajes se devuelve:
Output
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 finish_reason
para el valor length
antes de analizar la respuesta. El modelo puede generar JSON parcial. Esto significa que la salida del modelo era mayor que la max_tokens disponible 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, incluso si se solicita en el mensaje.