Compartir por


Personalización de un modelo con ajuste preciso

Obtenga información sobre cómo ajustar modelos en Microsoft Foundry para sus conjuntos de datos y casos de uso. El ajuste preciso permite lo siguiente:

  • Resultados de mayor calidad que los que puede obtener solo con la ingeniería de solicitudes.
  • La capacidad de entrenar con más ejemplos de los que caben en el límite de contexto de solicitud de un modelo.
  • Ahorro de tokens debido a avisos más cortos.
  • Solicitudes de menor latencia, especialmente cuando se usan modelos más pequeños.

A diferencia del aprendizaje con pocos ejemplos, el ajuste mejora el modelo entrenando con más ejemplos de los que se pueden incluir en una solicitud. Dado que los pesos se adaptan a la tarea, se incluyen menos ejemplos o instrucciones. Incluir menos reduce los tokens por llamada y, posiblemente, reduce el coste y la latencia.

Usamos la adaptación de baja clasificación (LoRA) para ajustar modelos de una manera que reduzca su complejidad sin afectar significativamente a su rendimiento. Este método funciona aproximando la matriz de rango alto original con una clasificación inferior. Ajustar un subconjunto más pequeño de parámetros importantes durante la fase de entrenamiento supervisado hace que el modelo sea más fácil de administrar y eficiente. Para los usuarios, también hace que el entrenamiento sea más rápido y más asequible que otras técnicas.

En este artículo aprenderá a:

  • Elija los conjuntos de datos y formatos adecuados para ajustarlo.
  • Desencadene un trabajo de ajuste preciso, supervise el estado y capture los resultados.
  • Implemente y evalúe un modelo ajustado.
  • Iteración basada en los comentarios de evaluación.

Prerrequisitos

Modelos compatibles

Para comprobar qué regiones admiten actualmente el ajuste preciso, consulte el artículo sobre los modelos.

O bien, puede ajustar un modelo previamente ajustado, formateado como base-model.ft-{jobid}.

Preparar los datos

Los conjuntos de datos de entrenamiento y validación constan de ejemplos de entrada y salida para saber cómo desea que se realice el modelo.

Los datos de entrenamiento y validación que use deben tener el formato de documento JSON Lines (JSONL). También debe tener formato en el formato conversacional que usa la API de finalizaciones de chat .

Además del formato JSONL, los archivos de datos de entrenamiento y validación deben codificarse en UTF-8 e incluir una marca de orden de bytes (BOM). Cada archivo debe tener un tamaño inferior a 512 MB.

Se recomienda usar las instrucciones y las indicaciones que hayan funcionado mejor en cada ejemplo de entrenamiento. Este enfoque le ayuda a obtener los mejores resultados, especialmente si tiene menos de cien ejemplos.

Si no tiene preparado un conjunto de datos existente, puede usar las funcionalidades de generación de datos para crear uno nuevo.

Formato de archivo de ejemplo

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato de archivo de chat de varios turnos

También se admiten varios turnos de una conversación en una sola línea del archivo de entrenamiento JSONL. Para omitir el ajuste fino de mensajes específicos del asistente, agregue el par de clave-valor opcional weight. Actualmente, weight se puede establecer en 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the biggest city in France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Finalizaciones de chat con visión

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Consideraciones sobre el tamaño del conjunto de datos

Cuantos más ejemplos de entrenamiento tenga, mejor. Los trabajos de ajuste fino no continuarán sin al menos 10 ejemplos de entrenamiento, pero un número tan pequeño no es suficiente para influir notablemente en las respuestas del modelo. Un procedimiento recomendado para el ajuste correcto es proporcionar cientos, si no miles, de ejemplos de entrenamiento. Se recomienda empezar con 50 ejemplos bien diseñados.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Pero tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena su modelo en una gran cantidad de datos internos sin primero depurar el conjunto de datos, dejando solo los ejemplos de mayor calidad, podría funcionar peor de lo esperado.

Creación del modelo optimizado

Para ajustar un modelo en un proyecto de Foundry existente, siga estos pasos:

  1. Inicie sesión en Foundry y seleccione el proyecto. Si aún no tiene un proyecto, primero debe crear un proyecto.

  2. Vaya a la página Compilar>Ajustar y, a continuación, seleccione el botón Ajustar en la esquina superior derecha.

  3. Ahora debería ver la experiencia Ajustar un modelo para crear una nueva tarea de ajuste. Use las secciones siguientes para ayudar a configurar el trabajo y, a continuación, seleccione Enviar para empezar a entrenar el nuevo modelo ajustado.

Selección del modelo base

La región del proyecto podría limitar los modelos disponibles. La elección del modelo influye tanto en el rendimiento como en el costo del modelo.

También puede seleccionar un modelo optimizado previamente.

Método de personalización

Los métodos de personalización admitidos dependen del modelo seleccionado:

  • Ajuste fino supervisado (SFT): entrena el modelo en pares de entrada/salida etiquetados. Lo mejor para la mayoría de los escenarios, incluida la especialización de tareas.

  • Optimización directa de preferencias (DPO): alinea el modelo con respuestas preferidas por el usuario. Ideal para mejorar la calidad de la respuesta.

  • Ajuste de refuerzo (RFT): utiliza señales de recompensa de los evaluadores de modelos para optimizar comportamientos complejos.

Nota:

En el resto de este artículo se describen los pasos para el método SFT. Para obtener instrucciones específicas de otros métodos de personalización, consulte la guía de DPO y la guía de RFT.

Tipo de entrenamiento

Seleccione el nivel de entrenamiento en función del caso de uso y el presupuesto:

  • Estándar: el entrenamiento se produce en la región actual del recurso de Foundry y proporciona garantías para la residencia de datos. Ideal para cargas de trabajo en las que los datos deben permanecer en una región específica.

  • Global: proporciona precios más asequibles en comparación con Estándar mediante el uso de capacidad más allá de la región actual. Los datos y los pesos se copian a la región donde se lleva a cabo el entrenamiento. Ideal si la residencia de datos no es una restricción y desea tiempos de espera más rápidos.

  • Desarrollador (versión preliminar): proporciona un ahorro significativo de costos mediante el uso de la capacidad inactiva para el entrenamiento. No hay ninguna latencia ni tampoco garantías de Acuerdo de Nivel de Servicio, por lo que los trabajos de este nivel pueden ser interrumpidos y reanudarse automáticamente más adelante. Tampoco hay garantías para la residencia de datos. Ideal para la experimentación y las cargas de trabajo sensibles al precio.

Datos de entrenamiento y validación

Si tiene conjuntos de datos existentes en el proyecto Foundry, seleccione Conjunto de datos existente para Origen de datos y, a continuación, seleccione el conjunto de datos.

Para cargar conjuntos de datos recién preparados, seleccione Cargar nuevo conjunto de datos para Origen de datos y, a continuación, cargue el archivo JSONL.

Después de seleccionar o cargar los archivos de datos, las comprobaciones de validación se producen automáticamente para confirmar que los archivos tienen el formato JSONL, se codifican en UTF-8 con una boM y tienen un tamaño inferior a 512 MB.

Parámetros opcionales

Sufijo

Se recomienda proporcionar un valor de Sufijo para facilitar la distinción entre diferentes iteraciones de su modelo ajustado. Un sufijo toma una cadena de hasta 18 caracteres y se utiliza para nombrar el modelo afinado resultante.

Seed

Una semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debería producir los mismos resultados, pero en casos excepcionales podrían diferir. Si no especifica una semilla, se genera una aleatoriamente.

Hiperparámetros

Puede configurar manualmente hiperparámetros para el trabajo de ajuste fino o dejarlos como predeterminados.

Los hiperparámetros siguientes están disponibles:

Nombre Tipo Descripción
batch_size Integer El tamaño del lote a usar para el entrenamiento. El tamaño del lote es el número de ejemplos de entrenamiento utilizados para entrenar una pasada hacia adelante y hacia atrás. En general, encontramos que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes.

El valor predeterminado y el valor máximo de esta propiedad son específicos de un modelo base. Un tamaño de lote mayor significa que los parámetros del modelo se actualizan con menos frecuencia, pero con una varianza menor. Cuando el valor se establece en -1, el tamaño del lote se calcula como el 0,2% de los ejemplos del conjunto de entrenamiento. El máximo es 256.
learning_rate_multiplier Number El multiplicador de la tasa de aprendizaje que se usará para el entrenamiento. La tasa de aprendizaje de ajuste fino es la tasa de aprendizaje original utilizada para el preentrenamiento, multiplicada por este valor.

Las tasas de aprendizaje más grandes tienden a mejorar con tamaños de lote más grandes. Se recomienda experimentar con valores en el intervalo de 0.02 para 0.2 ver lo que genera los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs Integer El número de épocas para entrenar el modelo. Una época se refiere a un ciclo completo a través del conjunto de datos de entrenamiento. Si el valor se establece en -1, el número de épocas se determina dinámicamente en función de los datos de entrada.

Implementación automática

[¡IMPORTANTE!] Para la implementación automática, debe tener asignado el rol Azure AI owner o cualquier rol con la acción `Microsoft.CognitiveServices/accounts/deployments/write`.

Para ahorrar tiempo, puede habilitar la implementación automática para el modelo resultante. Si el entrenamiento finaliza correctamente, el modelo se implementa según el tipo de implementación seleccionado. El nombre de implementación se basa en el nombre único generado para el modelo personalizado y en el sufijo opcional que podría haber proporcionado anteriormente.

La implementación automática solo se admite para los modelos de OpenAI.

Supervisión y análisis de los resultados

Después de enviar el trabajo de ajuste, una vista en tabla muestra todos sus envíos de trabajos de ajuste. Para obtener más información sobre los resultados individuales, abra la página Detalles del trabajo .

Es posible que el trabajo esté en cola detrás de otros trabajos del sistema. El entrenamiento del modelo puede tardar minutos en horas, según el modelo y el tamaño del conjunto de datos.

Metrics

Para monitorear las siguientes métricas, vaya a la pestaña Supervisión:.

  • train_loss: la pérdida del lote de entrenamiento. Cada iteración de entrenamiento en el eje X representa un solo pase, hacia adelante y hacia atrás, en un lote de datos de entrenamiento.

  • full_valid_loss: pérdida de validación calculada al final de cada época. Cuando el entrenamiento va bien, la pérdida debe disminuir.

  • train_mean_token_accuracy: El porcentaje de tokens del lote de entrenamiento que el modelo predijo correctamente.

    Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].

  • full_valid_mean_token_accuracy: la precisión media del token válida calculada al final de cada época. Cuando el entrenamiento va bien, la precisión del token debe aumentar.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si sus datos de entrenamiento y validación se desvían, podría estar sobreajustando. Pruebe el entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Puntos de control

Cuando finaliza cada época de entrenamiento, se genera un punto de control. Para ver los puntos de control, vaya a la pestaña Puntos de control.

Un punto de comprobación es una versión totalmente funcional de un modelo que se puede implementar y usar como modelo de destino para trabajos posteriores de ajuste preciso. Los puntos de control pueden ser especialmente útiles, ya que pueden generar instantáneas antes del sobreajuste. Cuando finaliza un trabajo de ajuste preciso, tiene las tres versiones más recientes del modelo disponibles para implementar. Puede copiar puntos de control entre recursos y suscripciones a través de la API REST.

Nota:

Durante el entrenamiento, puede ver las métricas y pausar el trabajo según sea necesario. La pausa puede ser útil si las métricas no coinciden o si cree que el modelo no está aprendiendo a un ritmo correcto. Al pausar un trabajo de entrenamiento, se crea un punto de control que se puede implementar una vez completadas las evaluaciones de seguridad. Este punto de control está disponible para implementar y usar para la inferencia, o puede reanudar el trabajo para completarlo.

La operación de pausa solo es aplicable a los trabajos que han sido entrenados para al menos un paso y que están en un estado de En ejecución. La pausa solo se admite para los modelos de OpenAI.

Implementación del modelo optimizado

[¡IMPROTANTE!] Para implementar modelos, debe tener asignado el rol Azure AI owner o cualquier rol con la acción "Microsfot.CognitiveServices/accounts/deployments/write".

Cuando esté satisfecho con las métricas del trabajo de ajuste preciso, puede implementar el modelo seleccionando el botón Implementar en la página de detalles y configurando la configuración de la implementación.

Para obtener más información, consulte la guía de implementación de ajuste.

Uso de un modelo optimizado implementado

Después de implementar el modelo optimizado, puede usarlo como cualquier otro modelo implementado. Puede usar el área de juegos en Foundry para experimentar con la nueva implementación. También puede usar la API de REST para llamar al modelo ajustado desde su propia aplicación. Incluso puede empezar a usar este nuevo modelo optimizado en el flujo de avisos para compilar la aplicación de IA generativa.

Nota:

En el caso de los modelos de chat, el mensaje del sistema que utiliza para orientar su modelo ajustado (ya sea implementado o disponible para pruebas en el área de juegos) debe ser el mismo que el mensaje del sistema que usó para el entrenamiento. Si usa un mensaje de sistema diferente, es posible que el modelo no funcione según lo previsto.

Realizar un ajuste continuo

Después de crear un modelo ajustado, es posible que desee seguir refinando el modelo a lo largo del tiempo a través de un ajuste más preciso. El ajuste continuo es el proceso iterativo de seleccionar un modelo ya ajustado como modelo base y ajustarlo más adelante en nuevos conjuntos de ejemplos de entrenamiento.

Para realizar un ajuste preciso en un modelo que ha ajustado anteriormente, use el mismo proceso descrito en Creación del modelo optimizado. Pero en lugar de especificar el nombre de un modelo base genérico, especifique su modelo ya afinado. Un modelo personalizado ajustado se ve como gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft.

El ajuste continuo solo se admite para los modelos openAI.

Limpiar los recursos

Cuando ya no necesite el modelo optimizado, puede eliminar la implementación y el modelo. También puede eliminar los archivos de entrenamiento y validación que cargó en el servicio, si es necesario.

Eliminación de la implementación del modelo optimizado

Importante

Después de implementar un modelo personalizado, si en cualquier momento la implementación permanece inactiva durante más de 15 días, se elimina la implementación. La implementación de un modelo personalizado está inactiva si el modelo se implementó hace más de 15 días y no se realizaron finalizaciones de chat ni llamadas API de respuesta durante un período continuo de 15 días.

La eliminación de una implementación inactiva no elimina ni afecta al modelo personalizado subyacente. El modelo personalizado se puede volver a implementar en cualquier momento.

Como se describe en Precios de Azure OpenAI en modelos de Microsoft Foundry, cada modelo personalizado (ajustado a sus preferencias) que se implementa incurre en un coste de hospedaje por hora, independientemente de si se realizan finalizaciones o llamadas a la API de respuesta de chat al modelo. Para más información sobre cómo planear y administrar costos con Azure OpenAI, consulte Planeamiento y administración de costos para Azure OpenAI.

Puede eliminar el despliegue de su modelo afinado en la página Compilación>Modelos del portal de Foundry.

Eliminación del modelo optimizado

Puede eliminar un modelo afinado en la página Ajuste fino del portal de Foundry. Seleccione el modelo optimizado para eliminar y, a continuación, seleccione Eliminar.

Nota:

No se puede eliminar un modelo ajustado si tiene una implementación existente. Debe eliminar la implementación del modelo para poder eliminar el modelo ajustado.

Prerrequisitos

Modelos compatibles

Para comprobar qué regiones admiten actualmente el ajuste preciso, consulte el artículo sobre los modelos.

O bien, puede ajustar un modelo previamente ajustado, formateado como base-model.ft-{jobid}.

Revisión del flujo de trabajo del SDK de Python

Dedique un momento a revisar el flujo de trabajo de ajuste preciso para usar el SDK de Python con Azure OpenAI:

  1. Prepare los datos de entrenamiento y validación.
  2. Seleccione un modelo base.
  3. Cargue los datos de entrenamiento.
  4. Entrene el nuevo modelo personalizado.
  5. Compruebe el estado del modelo personalizado.
  6. Despliegue su modelo personalizado para su uso.
  7. Usa tu modelo personalizado.
  8. Opcionalmente, analice el modelo personalizado para mejorar el rendimiento y ajustarlo.

Preparación de los datos de entrenamiento y validación

Los conjuntos de datos de entrenamiento y validación constan de ejemplos de entrada y salida para saber cómo desea que se realice el modelo.

Los datos de entrenamiento y validación que use deben tener el formato de documento JSON Lines (JSONL). También debe tener formato en el formato conversacional que usa la API de finalizaciones de chat .

Además del formato JSONL, los archivos de datos de entrenamiento y validación deben codificarse en UTF-8 e incluir una marca de orden de bytes (BOM). Cada archivo debe tener un tamaño inferior a 512 MB.

Si desea un tutorial paso a paso sobre el ajuste gpt-4o-mini-2024-07-18preciso, consulte el tutorial de ajuste de la precisión de Azure OpenAI.

Formato de archivo de ejemplo

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish, isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato de archivo de chat de varios turnos

También se admiten varios turnos de una conversación en una sola línea del archivo de entrenamiento JSONL. Para omitir el ajuste fino de mensajes específicos del asistente, agregue el par de clave-valor opcional weight. Actualmente, weight se puede establecer en 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Finalizaciones de chat con visión

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Creación de conjuntos de datos de entrenamiento y validación

Cuantos más ejemplos de entrenamiento tenga, mejor. Los trabajos de ajuste fino no continuarán sin al menos 10 ejemplos de entrenamiento, pero un número tan pequeño no es suficiente para influir notablemente en las respuestas del modelo. Un procedimiento recomendado para el ajuste correcto es proporcionar cientos, si no miles, de ejemplos de entrenamiento.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Pero tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena su modelo en una gran cantidad de datos internos sin primero depurar el conjunto de datos, dejando solo los ejemplos de mayor calidad, podría funcionar peor de lo esperado.

Carga de los datos de aprendizaje

El siguiente paso consiste en elegir los datos de entrenamiento preparados existentes o cargar nuevos datos de entrenamiento preparados para usarlos al personalizar el modelo. Cuando haya preparado los datos de entrenamiento, puede cargar los archivos en el servicio. Hay dos maneras de cargar los datos de entrenamiento:

Para archivos de datos de gran tamaño, se recomienda importar desde Blob Storage. Los archivos grandes se pueden volver inestables al cargarlos a través de formularios de varias partes porque las solicitudes son atómicas y no se pueden reintentar ni reanudar. Para más información sobre Blob Storage, consulte ¿Qué es Azure Blob Storage?.

En el siguiente ejemplo de Python se cargan los archivos de entrenamiento y validación locales mediante el SDK de Python y se recuperan los identificadores de archivo devueltos:

import os
from openai import OpenAI

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

# Upload the training and validation dataset files to Microsoft Foundry with the SDK.
training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'

training_response = client.files.create(file=open(training_file_name, "rb"), purpose="fine-tune")
validation_response = client.files.create(file=open(validation_file_name, "rb"), purpose="fine-tune")
training_file_id = training_response.id
validation_file_id = validation_response.id

print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)

Creación de un modelo personalizado

Después de cargar los archivos de entrenamiento y validación, ya estará listo para iniciar el trabajo de ajuste preciso.

El código de Python siguiente muestra un ejemplo de cómo crear un nuevo trabajo de ajuste preciso mediante el SDK de Python:

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter the base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry, the model can't contain dot/period characters.
    seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If you don't specify a seed, one is generated automatically.
    extra_body={ "trainingType": "GlobalStandard" } # Change this value to your preferred training type. Other options are `Standard` and `Developer`.
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job takes some time to start and finish.

print("Job ID:", response.id)
print(response.model_dump_json(indent=2))

Nota:

Se recomienda usar el nivel Estándar global para el tipo de entrenamiento, ya que ofrece ahorros de costos y usa capacidad global para tiempos de puesta en cola más rápidos. Sin embargo, copia datos y pesos fuera de la región de recursos actual. Si la residencia de datos es un requisito, use un modelo que sea compatible con el entrenamiento de nivel estándar.

También puede pasar parámetros opcionales adicionales, como hiperparámetros, para tomar un mayor control del proceso de ajuste fino. Para el entrenamiento inicial, se recomienda usar los valores predeterminados automáticos que están presentes sin especificar estos parámetros.

Los hiperparámetros admitidos actualmente para el ajuste fino supervisado son:

Nombre Tipo Descripción
batch_size Integer El tamaño del lote a usar para el entrenamiento. El tamaño del lote es el número de ejemplos de entrenamiento utilizados para entrenar una pasada hacia adelante y hacia atrás. En general, encontramos que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes.

El valor predeterminado y el valor máximo de esta propiedad son específicos de un modelo base. Un tamaño de lote mayor significa que los parámetros del modelo se actualizan con menos frecuencia, pero con una varianza menor.
learning_rate_multiplier Number El multiplicador de la tasa de aprendizaje que se usará para el entrenamiento. La tasa de aprendizaje de ajuste fino es la tasa de aprendizaje original utilizada para el preentrenamiento, multiplicada por este valor.

Las tasas de aprendizaje más grandes tienden a mejorar con tamaños de lote más grandes. Se recomienda experimentar con valores en el intervalo de 0.02 para 0.2 ver lo que genera los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs Integer El número de épocas para entrenar el modelo. Una época se refiere a un ciclo completo a través del conjunto de datos de entrenamiento.
seed Integer Los valores iniciales que controlan la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debería producir los mismos resultados, pero en casos excepcionales podrían diferir. Si no especifica valores iniciales, se generan automáticamente.

Para establecer hiperparámetros personalizados con la versión 1.x de la API de Python de OpenAI, proporciónelas como parte de method:

client.fine_tuning.jobs.create(
  training_file="file-abc123", 
  model="gpt-4.1-2025-04-14",
  suffix="my-model",
  seed=105,
  method={
    "type": "supervised", # In this case, the job is using supervised fine-tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  },
  extra_body={ "trainingType": "GlobalStandard" }
)

Para obtener información sobre los hiperparámetros admitidos para los otros métodos de personalización, consulte la guía para la optimización directa de preferencias y la guía para el ajuste fino de refuerzo.

Tipo de entrenamiento

Seleccione el nivel de entrenamiento en función del caso de uso y el presupuesto:

  • Estándar: el entrenamiento se produce en la región actual del recurso de Foundry y proporciona garantías para la residencia de datos. Ideal para cargas de trabajo en las que los datos deben permanecer en una región específica.

  • Global: proporciona precios más asequibles en comparación con Estándar mediante el uso de capacidad más allá de la región actual. Los datos y los pesos se copian a la región donde se lleva a cabo el entrenamiento. Ideal si la residencia de datos no es una restricción y desea tiempos de espera más rápidos.

  • Desarrollador (versión preliminar): proporciona un ahorro significativo de costos mediante el uso de la capacidad inactiva para el entrenamiento. No hay ninguna latencia ni tampoco garantías de Acuerdo de Nivel de Servicio, por lo que los trabajos de este nivel pueden ser interrumpidos y reanudarse automáticamente más adelante. Tampoco hay garantías para la residencia de datos. Ideal para la experimentación y las cargas de trabajo sensibles al precio.

import openai
from openai import AzureOpenAI

base_uri = "https://<ACCOUNT-NAME>.services.ai.azure.com"
api_key = "<API-KEY>"
api_version = "2025-04-01-preview"
client = AzureOpenAI(
azure_endpoint=base_uri,
api_key=api_key,
api_version=api_version
)
try:
    client.fine_tuning.jobs.create(
    model="gpt-4.1-mini",
    training_file="<FILE-ID>",
    extra_body={"trainingType": "developerTier"}
    )
except openai.APIConnectionError as e:
    print("The server could not be reached")
    print(e.__cause__) # An underlying exception, likely raised within httpx.
except openai.RateLimitError as e:
    print("A 429 status code was received; we should back off a bit.")
except openai.APIStatusError as e:
    print("Another non-200-range status code was received")
    print(e.status_code)
    print(e.response)
    print(e.body)

Comprobación del estado del trabajo de ajuste preciso

response = client.fine_tuning.jobs.retrieve(job_id)

print("Job ID:", response.id)
print("Status:", response.status)
print(response.model_dump_json(indent=2))

Enumeración de eventos de ajuste preciso

Para examinar los eventos individuales de ajuste que se generaron durante el entrenamiento, ejecute el siguiente comando. Antes de ejecutar el comando, es posible que tenga que actualizar la biblioteca cliente de OpenAI a la versión más reciente mediante pip install openai --upgrade.

response = client.fine_tuning.jobs.list_events(fine_tuning_job_id=job_id, limit=10)
print(response.model_dump_json(indent=2))

Lista de puntos de comprobación

La finalización de cada época de entrenamiento genera un punto de control. Un punto de comprobación es una versión totalmente funcional de un modelo que se puede implementar y usar como modelo de destino para trabajos posteriores de ajuste preciso. Los puntos de control pueden ser especialmente útiles, ya que pueden generar instantáneas antes del sobreajuste.

Cuando finaliza un trabajo de ajuste preciso, tiene las tres versiones más recientes del modelo disponibles para implementar. El modelo ajustado representa la última época. Las dos épocas anteriores están disponibles como puntos de control.

Puede ejecutar el siguiente comando para recuperar la lista de puntos de control asociados a un trabajo de ajuste preciso individual. Antes de ejecutar el comando, es posible que tenga que actualizar la biblioteca cliente de OpenAI a la versión más reciente mediante pip install openai --upgrade.

response = client.fine_tuning.jobs.checkpoints.list(job_id)
print(response.model_dump_json(indent=2))

Análisis del modelo personalizado

Azure OpenAI adjunta un archivo de resultados denominado results.csv a cada trabajo de ajuste preciso después de que finalice. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El identificador de archivo del archivo de resultados se muestra para cada modelo personalizado. Puede usar el SDK de Python para recuperar el identificador de archivo y descargar el archivo de resultados para su análisis.

En el siguiente ejemplo de Python se recupera el identificador de archivo del primer archivo de resultados adjunto al trabajo de ajuste preciso del modelo personalizado. A continuación, usa el SDK de Python para descargar el archivo en el directorio de trabajo actual para su análisis.

# Retrieve the file ID of the first result file from the fine-tuning job
# for the customized model.
response = client.fine_tuning.jobs.retrieve(job_id)
if response.status == 'succeeded':
    result_file_id = response.result_files[0]

retrieve = client.files.retrieve(result_file_id)

# Download the result file.
print(f'Downloading result file: {result_file_id}')

with open(retrieve.filename, "wb") as file:
    result = client.files.content(result_file_id).read()
    file.write(result)

El archivo de resultados es un archivo CSV que contiene una fila de encabezado y una fila para cada paso de entrenamiento que el trabajo de ajuste fino realiza. El archivo de resultados contiene las columnas siguientes:

Nombre de la columna Descripción
step El número del paso de entrenamiento. Un paso de entrenamiento representa un solo paso, hacia delante y hacia atrás, en un lote de datos de entrenamiento.
train_loss La pérdida del lote de entrenamiento.
train_mean_token_accuracy El porcentaje de token del lote de entrenamiento que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
valid_loss La pérdida del lote de validación.
validation_mean_token_accuracy Porcentaje de tokens en el lote de validación que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
full_valid_loss La pérdida de validación calculada al final de cada época. Cuando el entrenamiento va bien, la pérdida debe disminuir.
full_valid_mean_token_accuracy La precisión media válida de los tokens calculada al final de cada época. Cuando el entrenamiento va bien, la precisión del token debe aumentar.

También puede ver los datos en el archivo results.csv como gráficos en el portal de Microsoft Foundry. Al seleccionar el vínculo del modelo entrenado, aparecen tres gráficos: pérdida, precisión media del token y precisión del token. Si proporcionó datos de validación, ambos conjuntos de datos aparecen en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si sus datos de entrenamiento y validación se desvían, podría estar sobreajustando. Pruebe el entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

Cuando esté satisfecho con las métricas del trabajo de ajuste o simplemente quiera pasar a la inferencia, debe implementar el modelo.

Si va a implementar para realizar una validación adicional, considere la posibilidad de implementar para realizar pruebas mediante una implementación de desarrollador.

A diferencia de los comandos anteriores del SDK, debe usar la API del plano de control para la implementación. Esta tarea requiere autorización independiente, una ruta de acceso de API diferente y otra versión de API.

Variable Definición
token Un token de autorización. Hay varias maneras de generar un token de autorización. El método más sencillo para las pruebas iniciales es abrir Azure Cloud Shell desde Azure Portal. A continuación, ejecute az account get-access-token. Puede usar este token como token de autorización temporal para las pruebas de API. Se recomienda almacenar este token en una nueva variable de entorno.
subscription Identificador de suscripción para el recurso de Azure OpenAI asociado.
resource_group Nombre del grupo de recursos para el recurso de Azure OpenAI.
resource_name El nombre del recurso de Azure OpenAI.
model_deployment_name Nombre personalizado para la nueva implementación de modelos ajustados. Se hace referencia a este nombre en el código durante las llamadas de finalización del chat.
fine_tuned_model El modelo ajustado. Recupere este valor del trabajo de ajuste de resultados en el paso anterior. Su aspecto es similar a gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Debe añadir el valor al JSON deploy_data. Como alternativa, puede implementar un punto de control pasando el identificador de punto de control, que aparece en el formato ftchkpt-e559c011ecc04fc68eaa339d8227d02d.
import json
import os
import requests

token= os.getenv("<TOKEN>") 
subscription = "<YOUR_SUBSCRIPTION_ID>"  
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="gpt-41-ft" # Custom deployment name that you use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # Control plane API version rather than the data plane API for this call 
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}

deploy_data = {
    "sku": {"name": "standard", "capacity": 1}, 
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": <"fine_tuned_model">, # Retrieve this value from the previous call; it looks like gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83
            "version": "1"
        }
    }
}
deploy_data = json.dumps(deploy_data)

request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'

print('Creating a new deployment...')

r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)

print(r)
print(r.reason)
print(r.json())

Para obtener información sobre la implementación entre regiones y cómo usar el modelo implementado, consulte Uso del modelo optimizado implementado.

Si está listo para implementar para producción o tiene necesidades específicas de residencia de datos, siga la guía de implementación.

Realizar un ajuste continuo

Después de crear un modelo ajustado, es posible que desee seguir refinando el modelo a lo largo del tiempo a través de un ajuste más preciso. El ajuste continuo es el proceso iterativo de seleccionar un modelo ya ajustado como modelo base y ajustarlo más adelante en nuevos conjuntos de ejemplos de entrenamiento. El ajuste continuo solo se admite para los modelos openAI.

Para realizar un ajuste preciso en un modelo que ha ajustado previamente, use el mismo proceso descrito en Creación de un modelo personalizado. Pero en lugar de especificar el nombre de un modelo base genérico, especifique el identificador del modelo optimizado. El identificador del modelo ajustado se ve como gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7.

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7"
)
job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job takes some time to start and finish.

print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

También se recomienda incluir el suffix parámetro para distinguir más fácilmente entre las iteraciones del modelo ajustado. El suffix parámetro toma una cadena y se establece para identificar el modelo ajustado. Con la API de Python de OpenAI, puede agregar una cadena de hasta 18 caracteres al nombre del modelo optimizado.

Si no está seguro del identificador del modelo optimizado existente, puede encontrar esta información en la página Modelos de Microsoft Foundry. O bien, puede generar una lista de modelos para un recurso de Azure OpenAI mediante la API REST.

Limpia tus implementaciones, modelos personalizados y archivos de entrenamiento

Cuando ya no necesite el modelo personalizado, puede eliminar la implementación y el modelo. También puede eliminar los archivos de entrenamiento y validación que cargó en el servicio, si es necesario.

Eliminar la implementación del modelo

Importante

Después de implementar un modelo personalizado, si en cualquier momento la implementación permanece inactiva durante más de 15 días, se elimina la implementación. La implementación de un modelo personalizado está inactiva si el modelo se implementó hace más de 15 días y no se realizaron finalizaciones de chat ni llamadas API de respuesta durante un período continuo de 15 días.

La eliminación de una implementación inactiva no elimina ni afecta al modelo personalizado subyacente. El modelo personalizado se puede volver a implementar en cualquier momento.

Como se describe en Precios de Azure OpenAI en modelos de Microsoft Foundry, cada modelo personalizado (ajustado a sus preferencias) que se implementa incurre en un coste de hospedaje por hora, independientemente de si se realizan finalizaciones o llamadas a la API de respuesta de chat al modelo. Para más información sobre cómo planear y administrar costos con Azure OpenAI, consulte Planeamiento y administración de costos para Azure OpenAI.

Puede usar cualquiera de estos métodos para eliminar la implementación del modelo personalizado:

Eliminación de un modelo personalizado

Puede eliminar el modelo personalizado mediante Foundry.

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Debe eliminar la implementación del modelo para poder eliminar el modelo personalizado.

Eliminación de los archivos de entrenamiento

Opcionalmente, puede eliminar los archivos de entrenamiento y validación que cargó para el entrenamiento y los archivos de resultados que se crearon durante el entrenamiento, desde su suscripción a Azure OpenAI. Puede usar los métodos siguientes para eliminar los archivos de entrenamiento, validación y resultado:

En el siguiente ejemplo de Python se usa el SDK de Python para eliminar los archivos de entrenamiento, validación y resultado del modelo personalizado:

print('Checking for existing uploaded files.')
results = []

# Get the complete list of uploaded files in your subscription.
files = openai.File.list().data
print(f'Found {len(files)} total uploaded files in the subscription.')

# Enumerate all uploaded files. Extract the IDs for the
# files with file names that match your training dataset file and
# validation dataset file.
for item in files:
    if item["filename"] in [training_file_name, validation_file_name, result_file_name]:
        results.append(item["id"])
print(f'Found {len(results)} already uploaded files that match our files')

# Enumerate the file IDs for your files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

Prerrequisitos

Modelos compatibles

Para comprobar qué regiones admiten actualmente el ajuste preciso, consulte el artículo sobre los modelos.

O bien, puede ajustar un modelo previamente ajustado, formateado como base-model.ft-{jobid}.

Revisión del flujo de trabajo de la API REST

Dedique un momento a revisar el flujo de trabajo de ajuste para usar la API REST y Python con Azure OpenAI:

  1. Prepare los datos de entrenamiento y validación.
  2. Seleccione un modelo base.
  3. Cargue los datos de entrenamiento.
  4. Entrene el nuevo modelo personalizado.
  5. Compruebe el estado del modelo personalizado.
  6. Despliegue su modelo personalizado para su uso.
  7. Usa tu modelo personalizado.
  8. Opcionalmente, analice el modelo personalizado para mejorar el rendimiento y ajustarlo.

Preparación de los datos de entrenamiento y validación

Los conjuntos de datos de entrenamiento y validación constan de ejemplos de entrada y salida para saber cómo desea que se realice el modelo.

Los datos de entrenamiento y validación que use deben tener el formato de documento JSON Lines (JSONL). También debe tener formato en el formato conversacional que usa la API de finalizaciones de chat .

Además del formato JSONL, los archivos de datos de entrenamiento y validación deben codificarse en UTF-8 e incluir una marca de orden de bytes (BOM). Cada archivo debe tener un tamaño inferior a 512 MB.

Si desea un tutorial paso a paso sobre el ajuste gpt-4o-mini-2024-07-18preciso, consulte el tutorial de ajuste de la precisión de Azure OpenAI.

Formato de archivo de ejemplo

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato de archivo de chat de varios turnos

También se admiten varios turnos de una conversación en una sola línea del archivo de entrenamiento JSONL. Para omitir el ajuste fino de mensajes específicos del asistente, agregue el par de clave-valor opcional weight. Actualmente, weight se puede establecer en 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Finalizaciones de chat con visión

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Creación de conjuntos de datos de entrenamiento y validación

Cuantos más ejemplos de entrenamiento tenga, mejor. Los trabajos de ajuste fino no continuarán sin al menos 10 ejemplos de entrenamiento, pero un número tan pequeño no es suficiente para influir notablemente en las respuestas del modelo. Un procedimiento recomendado para el ajuste correcto es proporcionar cientos, si no miles, de ejemplos de entrenamiento.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Pero tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena su modelo en una gran cantidad de datos internos sin primero depurar el conjunto de datos, dejando solo los ejemplos de mayor calidad, podría funcionar peor de lo esperado.

Carga de los datos de aprendizaje

El siguiente paso consiste en elegir los datos de entrenamiento preparados existentes o cargar nuevos datos de entrenamiento preparados para usarlos al personalizar el modelo. Cuando haya preparado los datos de entrenamiento, puede cargar los archivos en el servicio. Hay dos maneras de cargar los datos de entrenamiento:

Para archivos de datos de gran tamaño, se recomienda importar desde Blob Storage. Los archivos grandes se pueden volver inestables al cargarlos a través de formularios de varias partes porque las solicitudes son atómicas y no se pueden reintentar ni reanudar. Para más información sobre Blob Storage, consulte ¿Qué es Azure Blob Storage?.

Cargar datos de entrenamiento

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\training_set.jsonl;type=application/json"

Cargar datos de validación

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\validation_set.jsonl;type=application/json"

Creación de un modelo personalizado

Después de cargar los archivos de entrenamiento y validación, ya estará listo para iniciar el trabajo de ajuste preciso. En el código siguiente se muestra un ejemplo de cómo crear un nuevo trabajo de ajuste preciso mediante la API REST.

En este ejemplo se incluye pasar el parámetro de valores iniciales. La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debería producir los mismos resultados, pero en casos excepcionales podrían diferir. Si no especifica valores iniciales, se generan automáticamente.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105
}'

Si va a ajustar un modelo que admite el entrenamiento global, puede especificar el tipo de entrenamiento mediante el extra_body argumento con nombre y mediante api-version=2025-04-01-preview:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2025-04-01-preview \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105,
    "trainingType": "globalstandard"
}'

También puede pasar parámetros opcionales adicionales, como hiperparámetros, para tomar un mayor control del proceso de ajuste preciso. Para el entrenamiento inicial, se recomienda usar los valores predeterminados automáticos que están presentes sin especificar estos parámetros.

Los hiperparámetros admitidos actualmente para el ajuste fino supervisado son:

Nombre Tipo Descripción
batch_size Integer El tamaño del lote a usar para el entrenamiento. El tamaño del lote es el número de ejemplos de entrenamiento utilizados para entrenar una pasada hacia adelante y hacia atrás. En general, encontramos que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes.

El valor predeterminado y el valor máximo de esta propiedad son específicos de un modelo base. Un tamaño de lote mayor significa que los parámetros del modelo se actualizan con menos frecuencia, pero con una varianza menor.
learning_rate_multiplier Number El multiplicador de la tasa de aprendizaje que se usará para el entrenamiento. La tasa de aprendizaje de ajuste fino es la tasa de aprendizaje original utilizada para el preentrenamiento, multiplicada por este valor.

Las tasas de aprendizaje más grandes tienden a mejorar con tamaños de lote más grandes. Se recomienda experimentar con valores en el intervalo de 0.02 para 0.2 ver lo que genera los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs Integer El número de épocas para entrenar el modelo. Una época se refiere a un ciclo completo a través del conjunto de datos de entrenamiento.
seed Integer Los valores iniciales que controlan la reproducibilidad del trabajo.

Para obtener información sobre los hiperparámetros admitidos para los otros métodos de personalización, consulte la guía para la optimización directa de preferencias y la guía para el ajuste fino de refuerzo.

Selección de un tipo de entrenamiento

Seleccione el nivel de entrenamiento en función del caso de uso y el presupuesto:

  • Estándar: el entrenamiento se produce en la región actual del recurso de Foundry y proporciona garantías para la residencia de datos. Ideal para cargas de trabajo en las que los datos deben permanecer en una región específica.

  • Global: proporciona precios más asequibles en comparación con Estándar mediante el uso de capacidad más allá de la región actual. Los datos y los pesos se copian a la región donde se lleva a cabo el entrenamiento. Ideal si la residencia de datos no es una restricción y desea tiempos de espera más rápidos.

  • Desarrollador (versión preliminar): proporciona un ahorro significativo de costos mediante el uso de la capacidad inactiva para el entrenamiento. No hay ninguna latencia ni tampoco garantías de Acuerdo de Nivel de Servicio, por lo que los trabajos de este nivel pueden ser interrumpidos y reanudarse automáticamente más adelante. Tampoco hay garantías sobre la ubicación de los datos. Ideal para la experimentación y las cargas de trabajo sensibles al precio.

curl -X POST "https://<ACCOUNT-NAME>.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview" -H "Content-Type: application/json" -H "api-key: <API-KEY>" -d "{"model": "gpt-4.1", "training_file": "<FILE_ID>", "hyperparameters": {"prompt_loss_weight": 0.1}, "trainingType": "developerTier"}"

Compruebe el estado del modelo personalizado

Después de iniciar un trabajo de ajuste preciso, puede tardar algún tiempo en finalizar. Es posible que el trabajo esté en cola detrás de otros trabajos del sistema. El entrenamiento del modelo puede tardar minutos o horas, en función del tamaño del modelo y del conjunto de datos.

En el siguiente ejemplo se usa la API REST para comprobar el estado del trabajo de ajuste fino. En el ejemplo se recupera información sobre el trabajo mediante el identificador de trabajo devuelto del ejemplo anterior.

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Enumeración de eventos de ajuste preciso

Para examinar los eventos individuales de ajuste que se generaron durante el entrenamiento:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/events \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Lista de puntos de comprobación

La finalización de cada época de entrenamiento genera un punto de control. Un punto de comprobación es una versión totalmente funcional de un modelo que se puede implementar y usar como modelo de destino para trabajos posteriores de ajuste preciso. Los puntos de control pueden ser especialmente útiles, ya que pueden generar instantáneas antes del sobreajuste.

Cuando finaliza un trabajo de ajuste preciso, tiene las tres versiones más recientes del modelo disponibles para implementar. El modelo ajustado representa la última época. Las dos épocas anteriores están disponibles como puntos de control.

Puede ejecutar el siguiente comando para recuperar la lista de puntos de control asociados a un trabajo individual de ajuste preciso:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Pausa y reanudación

Durante el entrenamiento, puede ver los registros y las métricas y pausar el trabajo según sea necesario. La pausa puede ser útil si las métricas no coinciden o si cree que el modelo no está aprendiendo a un ritmo correcto.

Una vez que se pausa el trabajo de entrenamiento y se completan las evaluaciones de seguridad, se crea un punto de control que se puede implementar. Este punto de control está disponible para implementar y usar para la inferencia, o puede reanudar el trabajo para completarlo.

La operación de pausa solo es aplicable a los trabajos que han sido entrenados para al menos un paso y que están en un estado de En ejecución.

Pausa

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/pause \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Reanudación

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/resume \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Copia de un modelo (versión preliminar)

Ahora puede copiar un modelo de punto de control ajustado de una región a otra, entre distintas suscripciones, pero dentro del mismo inquilino. El proceso usa API dedicadas para ayudar a garantizar transferencias eficaces y seguras. Esta característica solo está disponible actualmente con la API y no a través del portal de la Fundición.

Una vez copiado el modelo de la región A a la región B, puede ajustar continuamente el modelo en la región B e implementar el modelo desde esta ubicación.

Nota:

La eliminación del punto de control del modelo en la región de origen no hace que el modelo se elimine en la región de destino. Para eliminar el modelo en ambas regiones después de copiarlo, debe implementar el modelo por separado en cada región.

Prerrequisitos

  • El recurso o la cuenta de destino deben tener al menos un trabajo de ajuste.
  • El recurso de destino o la cuenta no deben deshabilitar el acceso a la red pública (al menos mientras se envía la solicitud de copia).
  • Solo puede copiar en la cuenta de destino si la cuenta que inicia la copia tiene permisos suficientes para acceder a la cuenta de destino.

Configurar permisos

  1. Cree una identidad administrada asignada por el usuario.
  2. Asigne el rol de usuario de Azure AI a la identidad administrada asignada por el usuario en el recurso o la cuenta de destino.
  3. Asigne la identidad administrada asignada por el usuario a la cuenta de recursos de origen.

Copia del modelo

curl --request POST \
  --url 'https://<aoai-resource>.openai.azure.com/openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' \
  --data '{
  "destinationResourceId": "<resourceId>",
  "region": "<region>"
}'

Dado que se trata de una operación de larga duración, compruebe el estado de la copia del modelo ajustado proporcionando el identificador de punto de control de la cuenta de origen usada en la llamada POST.

Comprobar el estado de la copia

curl --request GET \
  --url 'https://<aoai-resource>.openai.azure.com//openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' 

Nota:

Al copiar un punto de control desde una cuenta de origen, el mismo nombre de punto de control se conserva en la cuenta de destino. Asegúrese de usar exactamente este mismo nombre para ajustar, implementar o cualquier otra operación de la cuenta de destino. Este punto de control no aparece en la interfaz de usuario ni en la list checkpoints API.

Análisis del modelo personalizado

Azure OpenAI adjunta un archivo de resultados denominado results.csv a cada trabajo de ajuste preciso después de que finalice. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El identificador de archivo del archivo de resultados se muestra para cada modelo personalizado. Puede usar la API REST para recuperar el identificador de archivo y descargar el archivo de resultados para su análisis.

En el siguiente ejemplo de Python se usa la API REST para recuperar el identificador de archivo del primer archivo de resultados adjunto al trabajo de ajuste preciso del modelo personalizado. A continuación, descarga el archivo en el directorio de trabajo para su análisis.

curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<JOB_ID>" \
  -H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/files/<RESULT_FILE_ID>/content" \
    -H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>

El archivo de resultados es un archivo CSV que contiene una fila de encabezado y una fila para cada paso de entrenamiento que el trabajo de ajuste fino realiza. El archivo de resultados contiene las columnas siguientes:

Nombre de la columna Descripción
step El número del paso de entrenamiento. Un paso de entrenamiento representa un solo paso, hacia delante y hacia atrás, en un lote de datos de entrenamiento.
train_loss La pérdida del lote de entrenamiento.
train_mean_token_accuracy El porcentaje de token del lote de entrenamiento que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
valid_loss La pérdida del lote de validación.
validation_mean_token_accuracy Porcentaje de tokens en el lote de validación que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
full_valid_loss La pérdida de validación calculada al final de cada época. Cuando el entrenamiento va bien, la pérdida debe disminuir.
full_valid_mean_token_accuracy La precisión media válida de los tokens calculada al final de cada época. Cuando el entrenamiento va bien, la precisión del token debe aumentar.

También puede ver los datos en su archivo results.csv como gráficos en el portal de Foundry. Al seleccionar el vínculo del modelo entrenado, aparecen tres gráficos: pérdida, precisión media del token y precisión del token. Si proporcionó datos de validación, ambos conjuntos de datos aparecen en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si sus datos de entrenamiento y validación se desvían, podría estar sobreajustando. Pruebe el entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

Cuando esté satisfecho con las métricas del trabajo de ajuste o simplemente quiera pasar a la inferencia, debe implementar el modelo.

Si va a implementar para realizar una validación adicional, considere la posibilidad de implementar para realizar pruebas mediante una implementación de desarrollador.

Si está listo para implementar para producción o tiene necesidades específicas de residencia de datos, siga la guía de implementación.

Variable Definición
token Un token de autorización. Hay varias maneras de generar un token de autorización. El método más sencillo para las pruebas iniciales es abrir Azure Cloud Shell desde Azure Portal. A continuación, ejecute az account get-access-token. Puede usar este token como token de autorización temporal para las pruebas de API. Se recomienda almacenar este token en una nueva variable de entorno.
subscription Identificador de suscripción para el recurso de Azure OpenAI asociado.
resource_group Nombre del grupo de recursos para el recurso de Azure OpenAI.
resource_name El nombre del recurso de Azure OpenAI.
model_deployment_name Nombre personalizado para la nueva implementación de modelos ajustados. Se hace referencia a este nombre en el código durante las llamadas de finalización del chat.
fine_tuned_model El modelo ajustado. Recupere este valor del trabajo de ajuste de resultados en el paso anterior. Su aspecto es similar a gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Debe añadir el valor al JSON deploy_data. Como alternativa, puede implementar un punto de control pasando el identificador de punto de control, que aparece en el formato ftchkpt-e559c011ecc04fc68eaa339d8227d02d.
curl -X POST "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>?api-version=2024-10-21" \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "sku": {"name": "standard", "capacity": 1},
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": "<FINE_TUNED_MODEL>",
            "version": "1"
        }
    }
}'

Para obtener información sobre la implementación entre regiones y cómo usar el modelo implementado, consulte Uso del modelo optimizado implementado.

Realizar un ajuste continuo

Después de crear un modelo ajustado, es posible que desee seguir refinando el modelo a lo largo del tiempo a través de un ajuste más preciso. El ajuste continuo es el proceso iterativo de seleccionar un modelo ya ajustado como modelo base y ajustarlo más adelante en nuevos conjuntos de ejemplos de entrenamiento. El ajuste continuo solo se admite para los modelos openAI.

Para realizar un ajuste preciso en un modelo que ha ajustado previamente, use el mismo proceso descrito en Creación de un modelo personalizado. Pero en lugar de especificar el nombre de un modelo base genérico, especifique el identificador del modelo optimizado. El identificador del modelo ajustado se ve como gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "suffix": "<additional text used to help identify fine-tuned models>"
}'

También se recomienda incluir el suffix parámetro para distinguir más fácilmente entre las iteraciones del modelo ajustado. El suffix parámetro toma una cadena y se establece para identificar el modelo ajustado. El sufijo puede contener hasta 40 caracteres (a a z, A a Z, 0 a 9, - y _) que se agregan al nombre de su modelo afinado.

Si no está seguro del identificador del modelo optimizado existente, puede encontrar esta información en la página Modelos de Foundry. O bien, puede generar una lista de modelos para un recurso de Azure OpenAI mediante la API REST.

Limpia tus implementaciones, modelos personalizados y archivos de entrenamiento

Cuando ya no necesite el modelo personalizado, puede eliminar la implementación y el modelo. También puede eliminar los archivos de entrenamiento y validación que cargó en el servicio, si es necesario.

Eliminar la implementación del modelo

Puede usar cualquiera de estos métodos para eliminar la implementación del modelo personalizado:

Eliminación de un modelo personalizado

Puede eliminar el modelo personalizado mediante Foundry.

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Debe eliminar la implementación del modelo para poder eliminar el modelo personalizado.

Eliminación de los archivos de entrenamiento

Opcionalmente, puede eliminar los archivos de entrenamiento y validación que cargó para el entrenamiento y los archivos de resultados que se crearon durante el entrenamiento, desde su suscripción a Azure OpenAI. Puede usar Foundry para eliminar los archivos.

Hay dos experiencias únicas de ajuste preciso en el portal de Microsoft Foundry:

Importante

Los elementos marcados (versión preliminar) en este artículo se encuentran actualmente en versión preliminar pública. Esta versión preliminar se ofrece sin acuerdo de nivel de servicio y no se recomienda para las cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure.

Prerrequisitos

Modelos compatibles

Para comprobar qué regiones admiten actualmente el ajuste preciso, consulte el artículo sobre los modelos.

O bien, puede ajustar un modelo previamente ajustado, formateado como base-model.ft-{jobid}.

Revisión del flujo de trabajo del portal de Foundry

Dedique un momento a revisar el flujo de trabajo de ajuste para usar el portal de Foundry:

  1. Prepare los datos de entrenamiento y validación.
  2. Use el cuadro de diálogo Crear un modelo optimizado en el portal de Foundry para entrenar el modelo personalizado.
    1. Seleccione un método de entrenamiento.
    2. Seleccione un modelo base.
    3. Elija el tipo de entrenamiento.
    4. Elija los datos de entrenamiento.
    5. Opcionalmente, elija los datos de validación.
    6. Opcionalmente, configure los parámetros de tarea para el trabajo de ajuste.
    7. Opcionalmente, habilite la implementación automática para el modelo personalizado resultante.
    8. Revise las opciones y entrene el nuevo modelo personalizado.
  3. Compruebe el estado del modelo con ajuste preciso personalizado.
  4. Implemente el modelo personalizado para su uso.
  5. Use el modelo personalizado.
  6. Opcionalmente, analice el modelo personalizado para mejorar el rendimiento y ajustarlo.

Preparación de los datos de entrenamiento y validación

Los conjuntos de datos de entrenamiento y validación constan de ejemplos de entrada y salida para saber cómo desea que se realice el modelo.

Los datos de entrenamiento y validación que use deben tener el formato de documento JSON Lines (JSONL). También debe tener formato en el formato conversacional que usa la API de finalizaciones de chat .

Además del formato JSONL, los archivos de datos de entrenamiento y validación deben codificarse en UTF-8 e incluir una marca de orden de bytes (BOM). Cada archivo debe tener un tamaño inferior a 512 MB.

Recomendamos generalmente que uses las instrucciones e indicaciones que encontraste que funcionaron mejor en cada ejemplo de entrenamiento. Este enfoque le ayuda a obtener los mejores resultados, especialmente si tiene menos de cien ejemplos.

Formato de archivo de ejemplo

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato de archivo de chat de varios turnos para Azure OpenAI

También se admiten varios turnos de una conversación en una sola línea del archivo de entrenamiento JSONL. Para omitir el ajuste fino de mensajes específicos del asistente, agregue el par de clave-valor opcional weight. Actualmente, weight se puede establecer en 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Finalizaciones de chat con visión

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Consideraciones sobre el tamaño del conjunto de datos

Cuantos más ejemplos de entrenamiento tenga, mejor. Los trabajos de ajuste fino no continuarán sin al menos 10 ejemplos de entrenamiento, pero un número tan pequeño no es suficiente para influir notablemente en las respuestas del modelo. Un procedimiento recomendado para el ajuste correcto es proporcionar cientos, si no miles, de ejemplos de entrenamiento. Se recomienda empezar con 50 ejemplos bien diseñados.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Pero tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena su modelo en una gran cantidad de datos internos sin primero depurar el conjunto de datos, dejando solo los ejemplos de mayor calidad, podría funcionar peor de lo esperado.

Creación de un modelo optimizado

El portal de Foundry proporciona el cuadro de diálogo Crear un modelo ajustado para que pueda crear y entrenar un modelo optimizado para el recurso de Azure en un solo lugar.

  1. Vaya al portal de Foundry e inicie sesión con credenciales que tengan acceso al recurso de Azure OpenAI. Durante el flujo de trabajo de inicio de sesión, seleccione el directorio, la suscripción de Azure y el recurso de Azure OpenAI adecuados.

  2. Vaya a Herramientas>Ajuste preciso y, a continuación, seleccione Ajustar modelo.

    Captura de pantalla que muestra las selecciones para crear un modelo personalizado en el portal de Foundry.

  3. Seleccione un modelo para ajustarlo y, a continuación, seleccione Siguiente.

    Captura de pantalla de la selección de modelos en el portal de Foundry.

    Aparece el cuadro de diálogo Crear un modelo ajustado .

    Captura de pantalla del cuadro de diálogo para crear un modelo ajustado.

Elección del método de entrenamiento

El primer paso es confirmar la elección del modelo y el método de entrenamiento. No todos los modelos admiten todos los métodos de entrenamiento.

Al seleccionar el modelo, también puede seleccionar un modelo optimizado previamente, como se describe más adelante en este artículo.

Elegir el tipo de entrenamiento.

Foundry ofrece tres niveles de entrenamiento para satisfacer las necesidades de los clientes.

Nivel de entrenamiento estándar

El nivel Estándar proporciona capacidad dedicada para el ajuste fino con rendimiento predecible y SLA. Es ideal para cargas de trabajo de producción que requieren un rendimiento garantizado.

Nivel de entrenamiento estándar global

El nivel de aprendizaje global amplía el alcance de la personalización del modelo con los precios más asequibles de otras ofertas globales. No ofrece residencia de datos. Si necesita residencia de datos, consulte la lista de regiones disponibles para el modelo elegido.

Los datos de entrenamiento y los pesos del modelo resultante podrían copiarse a otra región de Azure.

Al usar este nivel, puede hacer lo siguiente:

  • Entrene los modelos de OpenAI más recientes desde más de una docena de regiones de Azure OpenAI.
  • Benefíciese de las tasas de entrenamiento por token más bajas en comparación con el nivel Estándar.

Nivel de aprendizaje para desarrolladores

El nivel Desarrollador es una opción rentable que usa la capacidad inactiva para cargas de trabajo no urgentes o exploratorias. Es posible que los trabajos de este nivel se adelanten y reanuden más adelante, por lo que es ideal para la experimentación y los casos de uso sensibles a los costes.

Elección de los datos de entrenamiento

El siguiente paso consiste en elegir los datos de entrenamiento preparados existentes o cargar nuevos datos de entrenamiento preparados para usarlos al personalizar el modelo seleccionando Agregar datos de entrenamiento.

El cuadro de diálogo Datos de entrenamiento muestra los conjuntos de datos cargados previamente existentes. También proporciona opciones para cargar nuevos datos de entrenamiento.

Captura de pantalla del panel para los datos de entrenamiento en el portal de Foundry

  • Si los datos de entrenamiento ya se han cargado en el servicio, seleccione Archivos del recurso de IA conectada. A continuación, seleccione el archivo en la lista desplegable.

  • Para cargar nuevos datos de entrenamiento, use una de las siguientes opciones:

    • Seleccione Cargar archivos para cargar datos de entrenamiento desde un archivo local.
    • Seleccione Blob de Azure u otras ubicaciones web compartidas para importar datos de entrenamiento desde Azure Blob Storage u otra ubicación web compartida.

Para archivos de datos de gran tamaño, se recomienda importar desde Blob Storage. Los archivos grandes se pueden volver inestables al cargarlos a través de formularios de varias partes porque las solicitudes son atómicas y no se pueden reintentar ni reanudar. Para más información sobre Blob Storage, consulte ¿Qué es Azure Blob Storage?.

Elija los datos de validación (opcional)

Si tiene un conjunto de datos de validación, seleccione Agregar datos de entrenamiento. Puede elegir los datos de validación preparados existentes o cargar nuevos datos de validación preparados para usarlos al personalizar el modelo.

El cuadro de diálogo Datos de validación muestra los conjuntos de datos de entrenamiento y validación cargados previamente. También proporciona opciones para cargar nuevos datos de validación.

Captura de pantalla del panel para los datos de validación en el portal de Foundry.

  • Si los datos de validación ya se han cargado en el servicio, seleccione Elegir conjunto de datos. A continuación, seleccione el archivo en la lista desplegable.

  • Para cargar nuevos datos de validación, use una de las siguientes opciones:

    • Seleccione Archivo local para cargar datos de validación desde un archivo local.
    • Seleccione Blob de Azure u otras ubicaciones web compartidas para importar datos de validación desde Azure Blob Storage u otra ubicación web compartida.

Para archivos de datos de gran tamaño, se recomienda importar desde Blob Storage. Los archivos grandes se pueden volver inestables al cargarlos a través de formularios de varias partes porque las solicitudes son atómicas y no se pueden reintentar ni reanudar.

Hacer que el modelo sea identificable (opcional)

Se recomienda incluir un suffix parámetro para distinguir más fácilmente entre las iteraciones del modelo ajustado. Un suffix parámetro toma una cadena de hasta 18 caracteres y se usa para asignar un nombre al modelo optimizado resultante.

Configuración de parámetros de entrenamiento (opcional)

Puede proporcionar valores iniciales opcionales y ajustar hiperparámetros adicionales.

Una semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debería producir los mismos resultados, pero en casos excepcionales podrían diferir. Si no especifica una semilla, se genera una aleatoriamente.

Captura de pantalla del área para configurar valores iniciales e hiperparámetros en el portal de Foundry.

Los hiperparámetros siguientes están disponibles para la optimización mediante el portal de Foundry:

Nombre Tipo Descripción
Tamaño de lote Integer El tamaño del lote a usar para el entrenamiento. El tamaño del lote es el número de ejemplos de entrenamiento utilizados para entrenar una pasada hacia adelante y hacia atrás. En general, encontramos que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes.

El valor predeterminado y el valor máximo de esta propiedad son específicos de un modelo base. Un tamaño de lote mayor significa que los parámetros del modelo se actualizan con menos frecuencia, pero con una varianza menor.
Multiplicador de velocidad de aprendizaje Number El multiplicador de la tasa de aprendizaje que se usará para el entrenamiento. La tasa de aprendizaje de ajuste fino es la tasa de aprendizaje original utilizada para el preentrenamiento, multiplicada por este valor.

Las tasas de aprendizaje más grandes tienden a mejorar con tamaños de lote más grandes. Se recomienda experimentar con valores en el intervalo de 0,02 a 0,2 para ver lo que genera los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
Número de épocas Integer El número de épocas para entrenar el modelo. Una época se refiere a un ciclo completo a través del conjunto de datos de entrenamiento.

Habilitación de la implementación automática (opcional)

Para ahorrar tiempo, puede habilitar opcionalmente la implementación automática para el modelo resultante. Si el entrenamiento finaliza correctamente, el modelo se implementa según el tipo de implementación seleccionado. El nombre de implementación se basa en el nombre único generado para el modelo personalizado y en el sufijo opcional que podría haber proporcionado anteriormente.

Captura de pantalla del interruptor para la implementación automática en el portal Foundry.

Nota:

Actualmente solo se admiten implementaciones globales estándar y de desarrollador para la implementación automática. Ninguna de estas opciones proporciona residencia de datos. Para obtener más información, consulte la documentación de tipos de implementación.

Revisión de las opciones y entrenamiento del modelo

Revise las opciones y, a continuación, seleccione Enviar para empezar a entrenar el nuevo modelo optimizado.

Comprobación del estado del modelo personalizado

Después de enviar el trabajo de ajuste, aparecerá una página con detalles sobre el modelo ajustado. Puede encontrar el estado y más información sobre su modelo con ajuste fino en la página Ajuste fino del portal de Foundry.

Es posible que el trabajo esté en cola detrás de otros trabajos del sistema. El entrenamiento del modelo puede tardar minutos o horas, en función del tamaño del modelo y del conjunto de datos.

Generación de puntos de control

Cuando finaliza cada época de entrenamiento, se genera un punto de control. Un punto de comprobación es una versión totalmente funcional de un modelo que se puede implementar y usar como modelo de destino para trabajos posteriores de ajuste preciso.

Los puntos de control pueden ser especialmente útiles, ya que pueden generar instantáneas antes del sobreajuste. Cuando finaliza un trabajo de ajuste preciso, tiene las tres versiones más recientes del modelo disponibles para implementar. Puede copiar puntos de control entre recursos y suscripciones a través de la API REST.

Pausa y reanudación

Puede realizar un seguimiento del progreso en ambas vistas de ajuste del portal de Foundry. El trabajo pasa por los mismos estados que los trabajos de ajuste normales (En cola, En ejecución, Completado).

También puede revisar los archivos de resultados mientras se ejecuta el entrenamiento para obtener un vistazo al progreso y si el entrenamiento continúa según lo previsto.

Durante el entrenamiento, puede ver las métricas y pausar el trabajo según sea necesario. La pausa puede ser útil si las métricas no coinciden o si cree que el modelo no está aprendiendo a un ritmo correcto. Al pausar un trabajo de entrenamiento, se crea un punto de control que se puede implementar una vez completadas las evaluaciones de seguridad. Este punto de control está disponible para implementar y usar para la inferencia, o puede reanudar el trabajo para completarlo. La operación de pausa solo es aplicable a los trabajos que han sido entrenados para al menos un paso y que están en un estado de En ejecución.

Captura de pantalla del ajuste de refuerzo con un trabajo en ejecución.

Análisis del modelo personalizado

Azure OpenAI adjunta un archivo de resultados denominado results.csv a cada trabajo de ajuste preciso después de que finalice. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El identificador de archivo del archivo de resultados se muestra para cada modelo personalizado en la columna Id. de archivo de resultados en el panel Modelos del portal de Foundry. Puede usar el identificador de archivo para identificar y descargar el archivo de resultados desde el panel Archivos de datos del portal de Foundry.

El archivo de resultados es un archivo CSV que contiene una fila de encabezado y una fila para cada paso de entrenamiento que el trabajo de ajuste fino realiza. El archivo de resultados contiene las columnas siguientes:

Nombre de la columna Descripción
step El número del paso de entrenamiento. Un paso de entrenamiento representa un solo paso, hacia delante y hacia atrás, en un lote de datos de entrenamiento.
train_loss La pérdida del lote de entrenamiento.
train_mean_token_accuracy El porcentaje de token del lote de entrenamiento que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
valid_loss La pérdida del lote de validación.
validation_mean_token_accuracy Porcentaje de tokens en el lote de validación que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
full_valid_loss La pérdida de validación calculada al final de cada época. Cuando el entrenamiento va bien, la pérdida debe disminuir.
full_valid_mean_token_accuracy La precisión media válida de los tokens calculada al final de cada época. Cuando el entrenamiento va bien, la precisión del token debe aumentar.

También puede ver los datos en su archivo results.csv como gráficos en el portal de Foundry. Al seleccionar el vínculo del modelo entrenado, aparecen tres gráficos: pérdida, precisión media del token y precisión del token. Si proporcionó datos de validación, ambos conjuntos de datos aparecen en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si sus datos de entrenamiento y validación se desvían, podría estar sobreajustando. Pruebe el entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

Cuando esté satisfecho con las métricas del trabajo de ajuste o simplemente quiera pasar a la inferencia, debe implementar el modelo.

Si va a implementar para realizar una validación adicional, considere la posibilidad de implementar para realizar pruebas mediante una implementación de desarrollador.

Si está listo para implementar para producción o tiene necesidades específicas de residencia de datos, siga la guía de implementación.

Uso de un modelo optimizado implementado

Después de implementar el modelo optimizado, puede usarlo como cualquier otro modelo implementado. Puede usar el área de juegos en Foundry para experimentar con la nueva implementación. También puede usar la API de REST para llamar al modelo ajustado desde su propia aplicación. Incluso puede empezar a usar este nuevo modelo optimizado en el flujo de avisos para compilar la aplicación de IA generativa.

Nota:

En el caso de los modelos de chat, el mensaje del sistema que utiliza para orientar su modelo ajustado (ya sea implementado o disponible para pruebas en el área de juegos) debe ser el mismo que el mensaje del sistema que usó para el entrenamiento. Si usa un mensaje de sistema diferente, es posible que el modelo no funcione según lo previsto.

Realizar un ajuste continuo

Después de crear un modelo ajustado, es posible que desee seguir refinando el modelo a lo largo del tiempo a través de un ajuste más preciso. El ajuste continuo es el proceso iterativo de seleccionar un modelo ya ajustado como modelo base y ajustarlo más adelante en nuevos conjuntos de ejemplos de entrenamiento.

Para realizar un ajuste preciso en un modelo que ha ajustado anteriormente, use el mismo proceso descrito en Creación de un modelo ajustado. Pero en lugar de especificar el nombre de un modelo base genérico, especifique su modelo ya afinado. Un modelo personalizado ajustado se ve como gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft.

Captura de pantalla de la interfaz para crear un modelo personalizado, con un modelo optimizado resaltado.

Limpieza de implementaciones, modelos personalizados y archivos de entrenamiento

Cuando ya no necesite el modelo personalizado, puede eliminar la implementación y el modelo. También puede eliminar los archivos de entrenamiento y validación que cargó en el servicio, si es necesario.

Eliminar la implementación del modelo

Importante

Después de implementar un modelo personalizado, si en cualquier momento la implementación permanece inactiva durante más de 15 días, se elimina la implementación. La implementación de un modelo personalizado está inactiva si el modelo se implementó hace más de 15 días y no se realizaron finalizaciones de chat ni llamadas API de respuesta durante un período continuo de 15 días.

La eliminación de una implementación inactiva no elimina ni afecta al modelo personalizado subyacente. El modelo personalizado se puede volver a implementar en cualquier momento.

Como se describe en Precios de Azure OpenAI en modelos de Microsoft Foundry, cada modelo personalizado (ajustado a sus preferencias) que se implementa incurre en un coste de hospedaje por hora, independientemente de si se realizan finalizaciones o llamadas a la API de respuesta de chat al modelo. Para más información sobre cómo planear y administrar costos con Azure OpenAI, consulte Planeamiento y administración de costos para Azure OpenAI.

Puede eliminar la implementación del modelo personalizado en el panel Implementaciones del portal de Foundry. Seleccione la implementación que desea eliminar y, a continuación, seleccione Eliminar.

Eliminación del modelo personalizado

Puede eliminar un modelo personalizado en el panel Modelos del portal de Foundry. Seleccione el modelo personalizado que desea eliminar en la pestaña Modelos personalizados y, a continuación, seleccione Eliminar.

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Debe eliminar la implementación del modelo para poder eliminar el modelo personalizado.

Eliminación de los archivos de entrenamiento

Opcionalmente, puede eliminar los archivos de entrenamiento y validación que cargó para el entrenamiento, junto con los archivos de resultados generados durante el entrenamiento, en el panel Datos> de administracióny índices del portal de Foundry. Seleccione el archivo que desea eliminar y, a continuación, seleccione Eliminar.

Prerrequisitos

Modelos compatibles

Para comprobar qué regiones admiten actualmente el ajuste preciso, consulte el artículo sobre los modelos.

O bien, puede ajustar un modelo previamente ajustado, formateado como base-model.ft-{jobid}.

Revisión del flujo de trabajo del SDK de Python

Dedique un momento a revisar el flujo de trabajo de ajuste preciso para usar el SDK de Python con Azure OpenAI:

  1. Prepare los datos de entrenamiento y validación.
  2. Seleccione un modelo base.
  3. Cargue los datos de entrenamiento.
  4. Entrene el nuevo modelo personalizado.
  5. Compruebe el estado del modelo personalizado.
  6. Despliegue su modelo personalizado para su uso.
  7. Usa tu modelo personalizado.
  8. Opcionalmente, analice el modelo personalizado para mejorar el rendimiento y ajustarlo.

Preparación de los datos de entrenamiento y validación

Los conjuntos de datos de entrenamiento y validación constan de ejemplos de entrada y salida para saber cómo desea que se realice el modelo.

Los datos de entrenamiento y validación que use deben tener el formato de documento JSON Lines (JSONL). También debe tener formato en el formato conversacional que usa la API de finalizaciones de chat .

Además del formato JSONL, los archivos de datos de entrenamiento y validación deben codificarse en UTF-8 e incluir una marca de orden de bytes (BOM). Cada archivo debe tener un tamaño inferior a 512 MB.

Si desea un tutorial paso a paso sobre el ajuste gpt-4o-mini-2024-07-18preciso, consulte el tutorial de ajuste de la precisión de Azure OpenAI.

Formato de archivo de ejemplo

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish, isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato de archivo de chat de varios turnos

También se admiten varios turnos de una conversación en una sola línea del archivo de entrenamiento JSONL. Para omitir el ajuste fino de mensajes específicos del asistente, agregue el par de clave-valor opcional weight. Actualmente, weight se puede establecer en 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Finalizaciones de chat con visión

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Creación de conjuntos de datos de entrenamiento y validación

Cuantos más ejemplos de entrenamiento tenga, mejor. Los trabajos de ajuste fino no continuarán sin al menos 10 ejemplos de entrenamiento, pero un número tan pequeño no es suficiente para influir notablemente en las respuestas del modelo. Un procedimiento recomendado para el ajuste correcto es proporcionar cientos, si no miles, de ejemplos de entrenamiento.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Pero tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena su modelo en una gran cantidad de datos internos sin primero depurar el conjunto de datos, dejando solo los ejemplos de mayor calidad, podría funcionar peor de lo esperado.

Carga de los datos de aprendizaje

El siguiente paso consiste en elegir los datos de entrenamiento preparados existentes o cargar nuevos datos de entrenamiento preparados para usarlos al personalizar el modelo. Cuando haya preparado los datos de entrenamiento, puede cargar los archivos en el servicio. Hay dos maneras de cargar los datos de entrenamiento:

Para archivos de datos de gran tamaño, se recomienda importar desde Blob Storage. Los archivos grandes se pueden volver inestables al cargarlos a través de formularios de varias partes porque las solicitudes son atómicas y no se pueden reintentar ni reanudar. Para más información sobre Blob Storage, consulte ¿Qué es Azure Blob Storage?.

En el siguiente ejemplo de Python se cargan los archivos de entrenamiento y validación locales mediante el SDK de Python y se recuperan los identificadores de archivo devueltos:

import os
from openai import OpenAI

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

# Upload the training and validation dataset files to Microsoft Foundry with the SDK.
training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'

training_response = client.files.create(file=open(training_file_name, "rb"), purpose="fine-tune")
validation_response = client.files.create(file=open(validation_file_name, "rb"), purpose="fine-tune")
training_file_id = training_response.id
validation_file_id = validation_response.id

print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)

Creación de un modelo personalizado

Después de cargar los archivos de entrenamiento y validación, ya estará listo para iniciar el trabajo de ajuste preciso.

El código de Python siguiente muestra un ejemplo de cómo crear un nuevo trabajo de ajuste preciso mediante el SDK de Python:

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter the base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry, the model can't contain dot/period characters.
    seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If you don't specify a seed, one is generated automatically.
    extra_body={ "trainingType": "GlobalStandard" } # Change this value to your preferred training type. Other options are `Standard` and `Developer`.
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job takes some time to start and finish.

print("Job ID:", response.id)
print(response.model_dump_json(indent=2))

Nota:

Se recomienda usar el nivel Estándar global para el tipo de entrenamiento, ya que ofrece ahorros de costos y usa capacidad global para tiempos de puesta en cola más rápidos. Sin embargo, copia datos y pesos fuera de la región de recursos actual. Si la residencia de datos es un requisito, use un modelo que sea compatible con el entrenamiento de nivel estándar.

También puede pasar parámetros opcionales adicionales, como hiperparámetros, para tomar un mayor control del proceso de ajuste fino. Para el entrenamiento inicial, se recomienda usar los valores predeterminados automáticos que están presentes sin especificar estos parámetros.

Los hiperparámetros admitidos actualmente para el ajuste fino supervisado son:

Nombre Tipo Descripción
batch_size Integer El tamaño del lote a usar para el entrenamiento. El tamaño del lote es el número de ejemplos de entrenamiento utilizados para entrenar una pasada hacia adelante y hacia atrás. En general, encontramos que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes.

El valor predeterminado y el valor máximo de esta propiedad son específicos de un modelo base. Un tamaño de lote mayor significa que los parámetros del modelo se actualizan con menos frecuencia, pero con una varianza menor.
learning_rate_multiplier Number El multiplicador de la tasa de aprendizaje que se usará para el entrenamiento. La tasa de aprendizaje de ajuste fino es la tasa de aprendizaje original utilizada para el preentrenamiento, multiplicada por este valor.

Las tasas de aprendizaje más grandes tienden a mejorar con tamaños de lote más grandes. Se recomienda experimentar con valores en el intervalo de 0.02 para 0.2 ver lo que genera los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs Integer El número de épocas para entrenar el modelo. Una época se refiere a un ciclo completo a través del conjunto de datos de entrenamiento.
seed Integer Los valores iniciales que controlan la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debería producir los mismos resultados, pero en casos excepcionales podrían diferir. Si no especifica valores iniciales, se generan automáticamente.

Para establecer hiperparámetros personalizados con la versión 1.x de la API de Python de OpenAI, proporciónelas como parte de method:

client.fine_tuning.jobs.create(
  training_file="file-abc123", 
  model="gpt-4.1-2025-04-14",
  suffix="my-model",
  seed=105,
  method={
    "type": "supervised", # In this case, the job is using supervised fine-tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  },
  extra_body={ "trainingType": "GlobalStandard" }
)

Para obtener información sobre los hiperparámetros admitidos para los otros métodos de personalización, consulte la guía para la optimización directa de preferencias y la guía para el ajuste fino de refuerzo.

Tipo de entrenamiento

Seleccione el nivel de entrenamiento en función del caso de uso y el presupuesto:

  • Estándar: el entrenamiento se produce en la región actual del recurso de Foundry y proporciona garantías para la residencia de datos. Ideal para cargas de trabajo en las que los datos deben permanecer en una región específica.

  • Global: proporciona precios más asequibles en comparación con Estándar mediante el uso de capacidad más allá de la región actual. Los datos y los pesos se copian a la región donde se lleva a cabo el entrenamiento. Ideal si la residencia de datos no es una restricción y desea tiempos de espera más rápidos.

  • Desarrollador (versión preliminar): proporciona un ahorro significativo de costos mediante el uso de la capacidad inactiva para el entrenamiento. No hay ninguna latencia ni tampoco garantías de Acuerdo de Nivel de Servicio, por lo que los trabajos de este nivel pueden ser interrumpidos y reanudarse automáticamente más adelante. Tampoco hay garantías para la residencia de datos. Ideal para la experimentación y las cargas de trabajo sensibles al precio.

import openai
from openai import AzureOpenAI

base_uri = "https://<ACCOUNT-NAME>.services.ai.azure.com"
api_key = "<API-KEY>"
api_version = "2025-04-01-preview"
client = AzureOpenAI(
azure_endpoint=base_uri,
api_key=api_key,
api_version=api_version
)
try:
    client.fine_tuning.jobs.create(
    model="gpt-4.1-mini",
    training_file="<FILE-ID>",
    extra_body={"trainingType": "developerTier"}
    )
except openai.APIConnectionError as e:
    print("The server could not be reached")
    print(e.__cause__) # An underlying exception, likely raised within httpx.
except openai.RateLimitError as e:
    print("A 429 status code was received; we should back off a bit.")
except openai.APIStatusError as e:
    print("Another non-200-range status code was received")
    print(e.status_code)
    print(e.response)
    print(e.body)

Comprobación del estado del trabajo de ajuste preciso

response = client.fine_tuning.jobs.retrieve(job_id)

print("Job ID:", response.id)
print("Status:", response.status)
print(response.model_dump_json(indent=2))

Enumeración de eventos de ajuste preciso

Para examinar los eventos individuales de ajuste que se generaron durante el entrenamiento, ejecute el siguiente comando. Antes de ejecutar el comando, es posible que tenga que actualizar la biblioteca cliente de OpenAI a la versión más reciente mediante pip install openai --upgrade.

response = client.fine_tuning.jobs.list_events(fine_tuning_job_id=job_id, limit=10)
print(response.model_dump_json(indent=2))

Lista de puntos de comprobación

La finalización de cada época de entrenamiento genera un punto de control. Un punto de comprobación es una versión totalmente funcional de un modelo que se puede implementar y usar como modelo de destino para trabajos posteriores de ajuste preciso. Los puntos de control pueden ser especialmente útiles, ya que pueden generar instantáneas antes del sobreajuste.

Cuando finaliza un trabajo de ajuste preciso, tiene las tres versiones más recientes del modelo disponibles para implementar. El modelo ajustado representa la última época. Las dos épocas anteriores están disponibles como puntos de control.

Puede ejecutar el siguiente comando para recuperar la lista de puntos de control asociados a un trabajo de ajuste preciso individual. Antes de ejecutar el comando, es posible que tenga que actualizar la biblioteca cliente de OpenAI a la versión más reciente mediante pip install openai --upgrade.

response = client.fine_tuning.jobs.checkpoints.list(job_id)
print(response.model_dump_json(indent=2))

Análisis del modelo personalizado

Azure OpenAI adjunta un archivo de resultados denominado results.csv a cada trabajo de ajuste preciso después de que finalice. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El identificador de archivo del archivo de resultados se muestra para cada modelo personalizado. Puede usar el SDK de Python para recuperar el identificador de archivo y descargar el archivo de resultados para su análisis.

En el siguiente ejemplo de Python se recupera el identificador de archivo del primer archivo de resultados adjunto al trabajo de ajuste preciso del modelo personalizado. A continuación, usa el SDK de Python para descargar el archivo en el directorio de trabajo actual para su análisis.

# Retrieve the file ID of the first result file from the fine-tuning job
# for the customized model.
response = client.fine_tuning.jobs.retrieve(job_id)
if response.status == 'succeeded':
    result_file_id = response.result_files[0]

retrieve = client.files.retrieve(result_file_id)

# Download the result file.
print(f'Downloading result file: {result_file_id}')

with open(retrieve.filename, "wb") as file:
    result = client.files.content(result_file_id).read()
    file.write(result)

El archivo de resultados es un archivo CSV que contiene una fila de encabezado y una fila para cada paso de entrenamiento que el trabajo de ajuste fino realiza. El archivo de resultados contiene las columnas siguientes:

Nombre de la columna Descripción
step El número del paso de entrenamiento. Un paso de entrenamiento representa un solo paso, hacia delante y hacia atrás, en un lote de datos de entrenamiento.
train_loss La pérdida del lote de entrenamiento.
train_mean_token_accuracy El porcentaje de token del lote de entrenamiento que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
valid_loss La pérdida del lote de validación.
validation_mean_token_accuracy Porcentaje de tokens en el lote de validación que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
full_valid_loss La pérdida de validación calculada al final de cada época. Cuando el entrenamiento va bien, la pérdida debe disminuir.
full_valid_mean_token_accuracy La precisión media válida de los tokens calculada al final de cada época. Cuando el entrenamiento va bien, la precisión del token debe aumentar.

También puede ver los datos en el archivo results.csv como gráficos en el portal de Microsoft Foundry. Al seleccionar el vínculo del modelo entrenado, aparecen tres gráficos: pérdida, precisión media del token y precisión del token. Si proporcionó datos de validación, ambos conjuntos de datos aparecen en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si sus datos de entrenamiento y validación se desvían, podría estar sobreajustando. Pruebe el entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

Cuando esté satisfecho con las métricas del trabajo de ajuste o simplemente quiera pasar a la inferencia, debe implementar el modelo.

Si va a implementar para realizar una validación adicional, considere la posibilidad de implementar para realizar pruebas mediante una implementación de desarrollador.

A diferencia de los comandos anteriores del SDK, debe usar la API del plano de control para la implementación. Esta tarea requiere autorización independiente, una ruta de acceso de API diferente y otra versión de API.

Variable Definición
token Un token de autorización. Hay varias maneras de generar un token de autorización. El método más sencillo para las pruebas iniciales es abrir Azure Cloud Shell desde Azure Portal. A continuación, ejecute az account get-access-token. Puede usar este token como token de autorización temporal para las pruebas de API. Se recomienda almacenar este token en una nueva variable de entorno.
subscription Identificador de suscripción para el recurso de Azure OpenAI asociado.
resource_group Nombre del grupo de recursos para el recurso de Azure OpenAI.
resource_name El nombre del recurso de Azure OpenAI.
model_deployment_name Nombre personalizado para la nueva implementación de modelos ajustados. Se hace referencia a este nombre en el código durante las llamadas de finalización del chat.
fine_tuned_model El modelo ajustado. Recupere este valor del trabajo de ajuste de resultados en el paso anterior. Su aspecto es similar a gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Debe añadir el valor al JSON deploy_data. Como alternativa, puede implementar un punto de control pasando el identificador de punto de control, que aparece en el formato ftchkpt-e559c011ecc04fc68eaa339d8227d02d.
import json
import os
import requests

token= os.getenv("<TOKEN>") 
subscription = "<YOUR_SUBSCRIPTION_ID>"  
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="gpt-41-ft" # Custom deployment name that you use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # Control plane API version rather than the data plane API for this call 
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}

deploy_data = {
    "sku": {"name": "standard", "capacity": 1}, 
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": <"fine_tuned_model">, # Retrieve this value from the previous call; it looks like gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83
            "version": "1"
        }
    }
}
deploy_data = json.dumps(deploy_data)

request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'

print('Creating a new deployment...')

r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)

print(r)
print(r.reason)
print(r.json())

Para obtener información sobre la implementación entre regiones y cómo usar el modelo implementado, consulte Uso del modelo optimizado implementado.

Si está listo para implementar para producción o tiene necesidades específicas de residencia de datos, siga la guía de implementación.

Realizar un ajuste continuo

Después de crear un modelo ajustado, es posible que desee seguir refinando el modelo a lo largo del tiempo a través de un ajuste más preciso. El ajuste continuo es el proceso iterativo de seleccionar un modelo ya ajustado como modelo base y ajustarlo más adelante en nuevos conjuntos de ejemplos de entrenamiento. El ajuste continuo solo se admite para los modelos openAI.

Para realizar un ajuste preciso en un modelo que ha ajustado previamente, use el mismo proceso descrito en Creación de un modelo personalizado. Pero en lugar de especificar el nombre de un modelo base genérico, especifique el identificador del modelo optimizado. El identificador del modelo ajustado se ve como gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7.

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7"
)
job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job takes some time to start and finish.

print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

También se recomienda incluir el suffix parámetro para distinguir más fácilmente entre las iteraciones del modelo ajustado. El suffix parámetro toma una cadena y se establece para identificar el modelo ajustado. Con la API de Python de OpenAI, puede agregar una cadena de hasta 18 caracteres al nombre del modelo optimizado.

Si no está seguro del identificador del modelo optimizado existente, puede encontrar esta información en la página Modelos de Microsoft Foundry. O bien, puede generar una lista de modelos para un recurso de Azure OpenAI mediante la API REST.

Limpia tus implementaciones, modelos personalizados y archivos de entrenamiento

Cuando ya no necesite el modelo personalizado, puede eliminar la implementación y el modelo. También puede eliminar los archivos de entrenamiento y validación que cargó en el servicio, si es necesario.

Eliminar la implementación del modelo

Importante

Después de implementar un modelo personalizado, si en cualquier momento la implementación permanece inactiva durante más de 15 días, se elimina la implementación. La implementación de un modelo personalizado está inactiva si el modelo se implementó hace más de 15 días y no se realizaron finalizaciones de chat ni llamadas API de respuesta durante un período continuo de 15 días.

La eliminación de una implementación inactiva no elimina ni afecta al modelo personalizado subyacente. El modelo personalizado se puede volver a implementar en cualquier momento.

Como se describe en Precios de Azure OpenAI en modelos de Microsoft Foundry, cada modelo personalizado (ajustado a sus preferencias) que se implementa incurre en un coste de hospedaje por hora, independientemente de si se realizan finalizaciones o llamadas a la API de respuesta de chat al modelo. Para más información sobre cómo planear y administrar costos con Azure OpenAI, consulte Planeamiento y administración de costos para Azure OpenAI.

Puede usar cualquiera de estos métodos para eliminar la implementación del modelo personalizado:

Eliminación de un modelo personalizado

Puede eliminar el modelo personalizado mediante Foundry.

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Debe eliminar la implementación del modelo para poder eliminar el modelo personalizado.

Eliminación de los archivos de entrenamiento

Opcionalmente, puede eliminar los archivos de entrenamiento y validación que cargó para el entrenamiento y los archivos de resultados que se crearon durante el entrenamiento, desde su suscripción a Azure OpenAI. Puede usar los métodos siguientes para eliminar los archivos de entrenamiento, validación y resultado:

En el siguiente ejemplo de Python se usa el SDK de Python para eliminar los archivos de entrenamiento, validación y resultado del modelo personalizado:

print('Checking for existing uploaded files.')
results = []

# Get the complete list of uploaded files in your subscription.
files = openai.File.list().data
print(f'Found {len(files)} total uploaded files in the subscription.')

# Enumerate all uploaded files. Extract the IDs for the
# files with file names that match your training dataset file and
# validation dataset file.
for item in files:
    if item["filename"] in [training_file_name, validation_file_name, result_file_name]:
        results.append(item["id"])
print(f'Found {len(results)} already uploaded files that match our files')

# Enumerate the file IDs for your files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

Prerrequisitos

Modelos compatibles

Para comprobar qué regiones admiten actualmente el ajuste preciso, consulte el artículo sobre los modelos.

O bien, puede ajustar un modelo previamente ajustado, formateado como base-model.ft-{jobid}.

Revisión del flujo de trabajo de la API REST

Dedique un momento a revisar el flujo de trabajo de ajuste para usar la API REST y Python con Azure OpenAI:

  1. Prepare los datos de entrenamiento y validación.
  2. Seleccione un modelo base.
  3. Cargue los datos de entrenamiento.
  4. Entrene el nuevo modelo personalizado.
  5. Compruebe el estado del modelo personalizado.
  6. Despliegue su modelo personalizado para su uso.
  7. Usa tu modelo personalizado.
  8. Opcionalmente, analice el modelo personalizado para mejorar el rendimiento y ajustarlo.

Preparación de los datos de entrenamiento y validación

Los conjuntos de datos de entrenamiento y validación constan de ejemplos de entrada y salida para saber cómo desea que se realice el modelo.

Los datos de entrenamiento y validación que use deben tener el formato de documento JSON Lines (JSONL). También debe tener formato en el formato conversacional que usa la API de finalizaciones de chat .

Además del formato JSONL, los archivos de datos de entrenamiento y validación deben codificarse en UTF-8 e incluir una marca de orden de bytes (BOM). Cada archivo debe tener un tamaño inferior a 512 MB.

Si desea un tutorial paso a paso sobre el ajuste gpt-4o-mini-2024-07-18preciso, consulte el tutorial de ajuste de la precisión de Azure OpenAI.

Formato de archivo de ejemplo

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato de archivo de chat de varios turnos

También se admiten varios turnos de una conversación en una sola línea del archivo de entrenamiento JSONL. Para omitir el ajuste fino de mensajes específicos del asistente, agregue el par de clave-valor opcional weight. Actualmente, weight se puede establecer en 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Finalizaciones de chat con visión

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Creación de conjuntos de datos de entrenamiento y validación

Cuantos más ejemplos de entrenamiento tenga, mejor. Los trabajos de ajuste fino no continuarán sin al menos 10 ejemplos de entrenamiento, pero un número tan pequeño no es suficiente para influir notablemente en las respuestas del modelo. Un procedimiento recomendado para el ajuste correcto es proporcionar cientos, si no miles, de ejemplos de entrenamiento.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Pero tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena su modelo en una gran cantidad de datos internos sin primero depurar el conjunto de datos, dejando solo los ejemplos de mayor calidad, podría funcionar peor de lo esperado.

Carga de los datos de aprendizaje

El siguiente paso consiste en elegir los datos de entrenamiento preparados existentes o cargar nuevos datos de entrenamiento preparados para usarlos al personalizar el modelo. Cuando haya preparado los datos de entrenamiento, puede cargar los archivos en el servicio. Hay dos maneras de cargar los datos de entrenamiento:

Para archivos de datos de gran tamaño, se recomienda importar desde Blob Storage. Los archivos grandes se pueden volver inestables al cargarlos a través de formularios de varias partes porque las solicitudes son atómicas y no se pueden reintentar ni reanudar. Para más información sobre Blob Storage, consulte ¿Qué es Azure Blob Storage?.

Cargar datos de entrenamiento

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\training_set.jsonl;type=application/json"

Cargar datos de validación

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\validation_set.jsonl;type=application/json"

Creación de un modelo personalizado

Después de cargar los archivos de entrenamiento y validación, ya estará listo para iniciar el trabajo de ajuste preciso. En el código siguiente se muestra un ejemplo de cómo crear un nuevo trabajo de ajuste preciso mediante la API REST.

En este ejemplo se incluye pasar el parámetro de valores iniciales. La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debería producir los mismos resultados, pero en casos excepcionales podrían diferir. Si no especifica valores iniciales, se generan automáticamente.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105
}'

Si va a ajustar un modelo que admite el entrenamiento global, puede especificar el tipo de entrenamiento mediante el extra_body argumento con nombre y mediante api-version=2025-04-01-preview:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2025-04-01-preview \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105,
    "trainingType": "globalstandard"
}'

También puede pasar parámetros opcionales adicionales, como hiperparámetros, para tomar un mayor control del proceso de ajuste preciso. Para el entrenamiento inicial, se recomienda usar los valores predeterminados automáticos que están presentes sin especificar estos parámetros.

Los hiperparámetros admitidos actualmente para el ajuste fino supervisado son:

Nombre Tipo Descripción
batch_size Integer El tamaño del lote a usar para el entrenamiento. El tamaño del lote es el número de ejemplos de entrenamiento utilizados para entrenar una pasada hacia adelante y hacia atrás. En general, encontramos que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes.

El valor predeterminado y el valor máximo de esta propiedad son específicos de un modelo base. Un tamaño de lote mayor significa que los parámetros del modelo se actualizan con menos frecuencia, pero con una varianza menor.
learning_rate_multiplier Number El multiplicador de la tasa de aprendizaje que se usará para el entrenamiento. La tasa de aprendizaje de ajuste fino es la tasa de aprendizaje original utilizada para el preentrenamiento, multiplicada por este valor.

Las tasas de aprendizaje más grandes tienden a mejorar con tamaños de lote más grandes. Se recomienda experimentar con valores en el intervalo de 0.02 para 0.2 ver lo que genera los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs Integer El número de épocas para entrenar el modelo. Una época se refiere a un ciclo completo a través del conjunto de datos de entrenamiento.
seed Integer Los valores iniciales que controlan la reproducibilidad del trabajo.

Para obtener información sobre los hiperparámetros admitidos para los otros métodos de personalización, consulte la guía para la optimización directa de preferencias y la guía para el ajuste fino de refuerzo.

Selección de un tipo de entrenamiento

Seleccione el nivel de entrenamiento en función del caso de uso y el presupuesto:

  • Estándar: el entrenamiento se produce en la región actual del recurso de Foundry y proporciona garantías para la residencia de datos. Ideal para cargas de trabajo en las que los datos deben permanecer en una región específica.

  • Global: proporciona precios más asequibles en comparación con Estándar mediante el uso de capacidad más allá de la región actual. Los datos y los pesos se copian a la región donde se lleva a cabo el entrenamiento. Ideal si la residencia de datos no es una restricción y desea tiempos de espera más rápidos.

  • Desarrollador (versión preliminar): proporciona un ahorro significativo de costos mediante el uso de la capacidad inactiva para el entrenamiento. No hay ninguna latencia ni tampoco garantías de Acuerdo de Nivel de Servicio, por lo que los trabajos de este nivel pueden ser interrumpidos y reanudarse automáticamente más adelante. Tampoco hay garantías sobre la ubicación de los datos. Ideal para la experimentación y las cargas de trabajo sensibles al precio.

curl -X POST "https://<ACCOUNT-NAME>.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview" -H "Content-Type: application/json" -H "api-key: <API-KEY>" -d "{"model": "gpt-4.1", "training_file": "<FILE_ID>", "hyperparameters": {"prompt_loss_weight": 0.1}, "trainingType": "developerTier"}"

Compruebe el estado del modelo personalizado

Después de iniciar un trabajo de ajuste preciso, puede tardar algún tiempo en finalizar. Es posible que el trabajo esté en cola detrás de otros trabajos del sistema. El entrenamiento del modelo puede tardar minutos o horas, en función del tamaño del modelo y del conjunto de datos.

En el siguiente ejemplo se usa la API REST para comprobar el estado del trabajo de ajuste fino. En el ejemplo se recupera información sobre el trabajo mediante el identificador de trabajo devuelto del ejemplo anterior.

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Enumeración de eventos de ajuste preciso

Para examinar los eventos individuales de ajuste que se generaron durante el entrenamiento:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/events \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Lista de puntos de comprobación

La finalización de cada época de entrenamiento genera un punto de control. Un punto de comprobación es una versión totalmente funcional de un modelo que se puede implementar y usar como modelo de destino para trabajos posteriores de ajuste preciso. Los puntos de control pueden ser especialmente útiles, ya que pueden generar instantáneas antes del sobreajuste.

Cuando finaliza un trabajo de ajuste preciso, tiene las tres versiones más recientes del modelo disponibles para implementar. El modelo ajustado representa la última época. Las dos épocas anteriores están disponibles como puntos de control.

Puede ejecutar el siguiente comando para recuperar la lista de puntos de control asociados a un trabajo individual de ajuste preciso:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Pausa y reanudación

Durante el entrenamiento, puede ver los registros y las métricas y pausar el trabajo según sea necesario. La pausa puede ser útil si las métricas no coinciden o si cree que el modelo no está aprendiendo a un ritmo correcto.

Una vez que se pausa el trabajo de entrenamiento y se completan las evaluaciones de seguridad, se crea un punto de control que se puede implementar. Este punto de control está disponible para implementar y usar para la inferencia, o puede reanudar el trabajo para completarlo.

La operación de pausa solo es aplicable a los trabajos que han sido entrenados para al menos un paso y que están en un estado de En ejecución.

Pausa

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/pause \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Reanudación

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/resume \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Copia de un modelo (versión preliminar)

Ahora puede copiar un modelo de punto de control ajustado de una región a otra, entre distintas suscripciones, pero dentro del mismo inquilino. El proceso usa API dedicadas para ayudar a garantizar transferencias eficaces y seguras. Esta característica solo está disponible actualmente con la API y no a través del portal de la Fundición.

Una vez copiado el modelo de la región A a la región B, puede ajustar continuamente el modelo en la región B e implementar el modelo desde esta ubicación.

Nota:

La eliminación del punto de control del modelo en la región de origen no hace que el modelo se elimine en la región de destino. Para eliminar el modelo en ambas regiones después de copiarlo, debe implementar el modelo por separado en cada región.

Prerrequisitos

  • El recurso o la cuenta de destino deben tener al menos un trabajo de ajuste.
  • El recurso de destino o la cuenta no deben deshabilitar el acceso a la red pública (al menos mientras se envía la solicitud de copia).
  • Solo puede copiar en la cuenta de destino si la cuenta que inicia la copia tiene permisos suficientes para acceder a la cuenta de destino.

Configurar permisos

  1. Cree una identidad administrada asignada por el usuario.
  2. Asigne el rol de usuario de Azure AI a la identidad administrada asignada por el usuario en el recurso o la cuenta de destino.
  3. Asigne la identidad administrada asignada por el usuario a la cuenta de recursos de origen.

Copia del modelo

curl --request POST \
  --url 'https://<aoai-resource>.openai.azure.com/openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' \
  --data '{
  "destinationResourceId": "<resourceId>",
  "region": "<region>"
}'

Dado que se trata de una operación de larga duración, compruebe el estado de la copia del modelo ajustado proporcionando el identificador de punto de control de la cuenta de origen usada en la llamada POST.

Comprobar el estado de la copia

curl --request GET \
  --url 'https://<aoai-resource>.openai.azure.com//openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' 

Nota:

Al copiar un punto de control desde una cuenta de origen, el mismo nombre de punto de control se conserva en la cuenta de destino. Asegúrese de usar exactamente este mismo nombre para ajustar, implementar o cualquier otra operación de la cuenta de destino. Este punto de control no aparece en la interfaz de usuario ni en la list checkpoints API.

Análisis del modelo personalizado

Azure OpenAI adjunta un archivo de resultados denominado results.csv a cada trabajo de ajuste preciso después de que finalice. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El identificador de archivo del archivo de resultados se muestra para cada modelo personalizado. Puede usar la API REST para recuperar el identificador de archivo y descargar el archivo de resultados para su análisis.

En el siguiente ejemplo de Python se usa la API REST para recuperar el identificador de archivo del primer archivo de resultados adjunto al trabajo de ajuste preciso del modelo personalizado. A continuación, descarga el archivo en el directorio de trabajo para su análisis.

curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<JOB_ID>" \
  -H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/files/<RESULT_FILE_ID>/content" \
    -H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>

El archivo de resultados es un archivo CSV que contiene una fila de encabezado y una fila para cada paso de entrenamiento que el trabajo de ajuste fino realiza. El archivo de resultados contiene las columnas siguientes:

Nombre de la columna Descripción
step El número del paso de entrenamiento. Un paso de entrenamiento representa un solo paso, hacia delante y hacia atrás, en un lote de datos de entrenamiento.
train_loss La pérdida del lote de entrenamiento.
train_mean_token_accuracy El porcentaje de token del lote de entrenamiento que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
valid_loss La pérdida del lote de validación.
validation_mean_token_accuracy Porcentaje de tokens en el lote de validación que el modelo predijo correctamente.

Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones [[1, 2], [0, 5], [4, 2]], este valor se establece en 0.83 (5 de 6) si el modelo predijo [[1, 1], [0, 5], [4, 2]].
full_valid_loss La pérdida de validación calculada al final de cada época. Cuando el entrenamiento va bien, la pérdida debe disminuir.
full_valid_mean_token_accuracy La precisión media válida de los tokens calculada al final de cada época. Cuando el entrenamiento va bien, la precisión del token debe aumentar.

También puede ver los datos en su archivo results.csv como gráficos en el portal de Foundry. Al seleccionar el vínculo del modelo entrenado, aparecen tres gráficos: pérdida, precisión media del token y precisión del token. Si proporcionó datos de validación, ambos conjuntos de datos aparecen en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si sus datos de entrenamiento y validación se desvían, podría estar sobreajustando. Pruebe el entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

Cuando esté satisfecho con las métricas del trabajo de ajuste o simplemente quiera pasar a la inferencia, debe implementar el modelo.

Si va a implementar para realizar una validación adicional, considere la posibilidad de implementar para realizar pruebas mediante una implementación de desarrollador.

Si está listo para implementar para producción o tiene necesidades específicas de residencia de datos, siga la guía de implementación.

Variable Definición
token Un token de autorización. Hay varias maneras de generar un token de autorización. El método más sencillo para las pruebas iniciales es abrir Azure Cloud Shell desde Azure Portal. A continuación, ejecute az account get-access-token. Puede usar este token como token de autorización temporal para las pruebas de API. Se recomienda almacenar este token en una nueva variable de entorno.
subscription Identificador de suscripción para el recurso de Azure OpenAI asociado.
resource_group Nombre del grupo de recursos para el recurso de Azure OpenAI.
resource_name El nombre del recurso de Azure OpenAI.
model_deployment_name Nombre personalizado para la nueva implementación de modelos ajustados. Se hace referencia a este nombre en el código durante las llamadas de finalización del chat.
fine_tuned_model El modelo ajustado. Recupere este valor del trabajo de ajuste de resultados en el paso anterior. Su aspecto es similar a gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Debe añadir el valor al JSON deploy_data. Como alternativa, puede implementar un punto de control pasando el identificador de punto de control, que aparece en el formato ftchkpt-e559c011ecc04fc68eaa339d8227d02d.
curl -X POST "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>?api-version=2024-10-21" \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "sku": {"name": "standard", "capacity": 1},
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": "<FINE_TUNED_MODEL>",
            "version": "1"
        }
    }
}'

Para obtener información sobre la implementación entre regiones y cómo usar el modelo implementado, consulte Uso del modelo optimizado implementado.

Realizar un ajuste continuo

Después de crear un modelo ajustado, es posible que desee seguir refinando el modelo a lo largo del tiempo a través de un ajuste más preciso. El ajuste continuo es el proceso iterativo de seleccionar un modelo ya ajustado como modelo base y ajustarlo más adelante en nuevos conjuntos de ejemplos de entrenamiento. El ajuste continuo solo se admite para los modelos openAI.

Para realizar un ajuste preciso en un modelo que ha ajustado previamente, use el mismo proceso descrito en Creación de un modelo personalizado. Pero en lugar de especificar el nombre de un modelo base genérico, especifique el identificador del modelo optimizado. El identificador del modelo ajustado se ve como gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "suffix": "<additional text used to help identify fine-tuned models>"
}'

También se recomienda incluir el suffix parámetro para distinguir más fácilmente entre las iteraciones del modelo ajustado. El suffix parámetro toma una cadena y se establece para identificar el modelo ajustado. El sufijo puede contener hasta 40 caracteres (a a z, A a Z, 0 a 9, - y _) que se agregan al nombre de su modelo afinado.

Si no está seguro del identificador del modelo optimizado existente, puede encontrar esta información en la página Modelos de Foundry. O bien, puede generar una lista de modelos para un recurso de Azure OpenAI mediante la API REST.

Limpia tus implementaciones, modelos personalizados y archivos de entrenamiento

Cuando ya no necesite el modelo personalizado, puede eliminar la implementación y el modelo. También puede eliminar los archivos de entrenamiento y validación que cargó en el servicio, si es necesario.

Eliminar la implementación del modelo

Puede usar cualquiera de estos métodos para eliminar la implementación del modelo personalizado:

Eliminación de un modelo personalizado

Puede eliminar el modelo personalizado mediante Foundry.

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Debe eliminar la implementación del modelo para poder eliminar el modelo personalizado.

Eliminación de los archivos de entrenamiento

Opcionalmente, puede eliminar los archivos de entrenamiento y validación que cargó para el entrenamiento y los archivos de resultados que se crearon durante el entrenamiento, desde su suscripción a Azure OpenAI. Puede usar Foundry para eliminar los archivos.