Compartir a través de


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 indicaciones
  • La capacidad de aprender de más ejemplos de los que caben en el límite máximo de contexto de solicitud de un modelo.
  • Ahorro de tokens debido a indicaciones más cortas
  • Solicitudes de baja latencia, especialmente cuando se usan modelos más pequeños.

A diferencia del aprendizaje en pocos pasos, el ajuste preciso mejora el modelo mediante el entrenamiento en más ejemplos de los que caben en un mensaje. Dado que los pesos se adaptan a la tarea, se incluyen menos ejemplos o instrucciones, lo que reduce los tokens por llamada y reduce potencialmente el coste y la latencia.

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

En este artículo, aprenderá a:

  • Elección de los conjuntos de datos y formatos adecuados para ajustar
  • 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

Consulte la página de modelos para comprobar qué regiones admiten actualmente el ajuste preciso.

O bien, puede realizar el ajuste preciso de un modelo previamente ajustado, con el formato base-model.ft-{jobid}.

Preparar los datos

Los conjuntos de datos de entrenamiento y validación consisten en ejemplos de entrada y salida para cómo desea que el modelo funcione.

Los datos de entrenamiento y validación que use deben estar formateados como un documento de líneas JSON (JSONL) y en el formato conversacional que utiliza la API de finalización de chats.

Se recomienda usar las instrucciones y las señales que mejor funcionaron en cada ejemplo de entrenamiento. Esto 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 del 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 preciso de los mensajes del asistente, agregue el par de valores de clave 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."}]}

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). El archivo debe tener un tamaño inferior a 512 MB.

Consideración del tamaño de los conjuntos de datos

Cuantos más ejemplos de entrenamiento tenga, mejor. Los trabajos de ajuste preciso no se llevarán a cabo 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. Es recomendable proporcionar cientos, o incluso miles, de ejemplos de entrenamiento para llevarlos a cabo correctamente. Se recomienda empezar con 50 datos de entrenamiento 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. Sin embargo, tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena el modelo en una gran cantidad de datos internos, sin previamente depurar el conjunto de datos para dejar solo los ejemplos de mayor calidad, podría terminar con un modelo que rinda 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 Crear > Ajustar y seleccione el botón Ajustar en la parte 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 seleccione Enviar para empezar a entrenar el nuevo modelo optimizado.

Selección del modelo base

Los modelos disponibles pueden estar limitados por la región del proyecto. La elección del modelo influye tanto en el rendimiento como en el costo del modelo.

Al seleccionar el modelo, también puede seleccionar un modelo optimizado previamente.

Método de personalización

Se pueden admitir distintos métodos de personalización en función del modelo seleccionado:

  • 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 de preferencias directas (DPO): alinea el modelo con respuestas preferidas por el usuario. Ideal para mejorar la calidad de la respuesta.

  • Refuerzo (RFT): Utiliza señales de recompensa de evaluadores modelo para optimizar comportamientos complejos.

Nota:

En el resto de este documento se describen los pasos para el método de ajuste fino supervisado. Para obtener instrucciones específicas de otros métodos de personalización, consulte artículos para DPO o RFT.

Tipo de entrenamiento

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

  • Estándar: la formación se lleva a cabo en la región del recurso Foundry actual, lo que garantiza la residencia de los 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 garantía de latencia o acuerdo de nivel de servicio, por lo que los trabajos de este nivel se pueden reemplazar y reanudar 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.

Datos de entrenamiento y validación

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

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

Una vez seleccionados o cargados los archivos de datos, las comprobaciones de validación se producen automáticamente para confirmar que están en el formato correcto.

Nota:

Los archivos de datos de entrenamiento deben tener el formato JSONL, estar codificados en UTF-8 con una marca de orden de bytes (BOM). El archivo debe tener un tamaño inferior a 512 MB. Aunque 10 es el número mínimo de muestras necesarias en un conjunto de datos, se recomienda al menos 100s de ejemplos de entrenamiento para enseñar al modelo una nueva aptitud.

Parámetros opcionales

Sufijo

Se recomienda completar el campo de sufijo para que sea más fácil distinguir entre diferentes iteraciones de su modelo afinado. Un sufijo toma una cadena de hasta 18 caracteres y se usa al asignar un nombre al modelo optimizado resultante.

Seed

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 se especifica una semilla, se genera aleatoriamente una para usted.

Hiperparámetros

Los hiperparámetros para el trabajo de ajuste se pueden configurar manualmente o dejar como valores predeterminados.

Los hiperparámetros siguientes están disponibles:

Nombre Tipo Descripción
batch_size entero 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 se establece en -1, batch_size se calcula como un 0,2 % de los ejemplos del conjunto de entrenamiento y 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 que se usó 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 rango de 0,02 a 0,2 para ver qué produce los mejores resultados. Una tasa de aprendizaje más pequeña podría ser útil para evitar el sobreajuste.
n_epochs entero 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 se establece en -1, el número de épocas se determina dinámicamente en función de los datos de entrada.

Habilitación de la implementación automática

Para ahorrar tiempo, puede habilitar la implementación automática para el modelo resultante. Si el entrenamiento finaliza correctamente, el modelo se implementa mediante 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.

Nota:

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, verá una vista de tabla en la que se muestran todos los envíos de trabajos de ajuste. Haga clic en la página de detalles del trabajo para ver más información sobre los resultados individuales.

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

Metrics

Puede supervisar las siguientes métricas navegando hasta el pivote Monitor:

  • train_loss: la pérdida para el 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: la 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 en el 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 de tipo [[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 ve una divergencia entre los datos de entrenamiento y los de validación, puede indicar que existe un sobreajuste. Pruebe un 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. Los puntos de control pueden visualizarse navegando a la pestaña Puntos de control.

Un punto de control es una versión totalmente funcional de un modelo, que se puede implementar y usar como modelo de destino para trabajos posteriores de ajuste fino. Los puntos de control pueden ser útiles, ya que pueden proporcionar instantáneas antes del sobreajuste. Cuando se complete un trabajo de ajuste preciso, tendrá 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. Una vez pausado el trabajo de entrenamiento, se creará un punto de comprobación que se pueda implementar una vez completadas las evaluaciones de seguridad. Este punto de control disponible para implementar y usar para la inferencia o reanudar el trabajo aún más hasta su finalización. La operación de pausa solo es aplicable a los trabajos que se han entrenado durante al menos un paso y están en estado En ejecución. La pausa solo se admite para los modelos de OpenAI.

Implementación del modelo optimizado

Una vez que esté satisfecho con las métricas del trabajo de ajuste preciso, puede implementar el modelo haciendo clic en el botón Implementar situado en la parte superior derecha de la página de detalles y configurando las opciones de implementación.

Consulte la guía de despliegue de ajuste fino para obtener más detalles.

Uso de un modelo optimizado implementado

Después de implementar el modelo optimizado, puede usarlo como cualquier otro modelo implementado. Puede usar el Playground en Foundry para experimentar con su 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:

Para los modelos de chat, el mensaje del sistema que utilice para guiar su modelo ajustado (ya sea que esté implementado o disponible para pruebas en el entorno de pruebas) debe ser el mismo que el mensaje del sistema que utilizó para el entrenamiento. Si usa un mensaje de sistema diferente, es posible que el modelo no funcione según lo previsto.

Ajuste preciso continuo

Una vez que haya creado 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 previamente, usaría el mismo proceso que se describe en la creación de un modelo ajustado, pero en lugar de especificar el nombre de un modelo base genérico, especificaría el modelo ya optimizado. Un modelo personalizado y ajustado tendría el siguiente aspecto gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft.

Nota:

El ajuste continuo solo se admite para los modelos openAI.

Limpiar los recursos

Cuando haya terminado con el modelo ajustado, 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 quince (15) días, la implementación se eliminará automáticamente. La implementación de un modelo personalizado es inactivasi el modelo se ha implementado hace más de quince (15) días y no se han realizado finalizaciones ni llamadas de finalización de chat 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, y el modelo personalizado se puede volver a implementar en cualquier momento. Como se describe en Precios de Foundry Models de Microsoft en Azure OpenAI, cada modelo personalizado (ajustado) implementado incurre en un coste de hospedaje por hora, independientemente de si se realizan solicitudes de finalización o de finalización de chat. Para más información sobre el planeamiento y la administración de costos con Azure OpenAI, consulte las instrucciones de Planeamiento para administrar los costos de Azure OpenAI.

Puede eliminar la implementación de su modelo ajustado con precisión en la página de Compilación > Modelos en el portal de Foundry.

Eliminación del modelo optimizado

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

Nota:

No se puede eliminar un modelo ajustado si tiene una implementación existente. Primero debe eliminar la implementación de modelo para poder eliminar el modelo optimizado.

Prerrequisitos

Modelos compatibles

Consulte la página de modelos para comprobar qué regiones admiten actualmente el ajuste preciso.

O bien, puede ajustar un modelo previamente ajustado, con el formato 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 consisten en ejemplos de entrada y salida para cómo desea que el modelo funcione.

Los datos de entrenamiento y validación que use deben estar formateados como un documento de líneas JSON (JSONL) y en el formato conversacional que utiliza la API de finalización de chats.

Si desea un tutorial detallado del ajuste preciso de un modelo gpt-4o-mini-2024-07-18, consulte el tutorial de ajuste preciso 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 del 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 preciso de los mensajes del asistente, agregue el par de valores de clave 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 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."}]}

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). El archivo debe tener un tamaño inferior a 512 MB.

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. Es recomendable proporcionar cientos, o incluso miles, de ejemplos de entrenamiento para llevarlos a cabo correctamente.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Sin embargo, tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrenas el modelo con una gran cantidad de datos internos, sin primero depurar el conjunto de datos para incluir solo los ejemplos de mayor calidad, podrías acabar con un modelo que funcione mucho peor de lo esperado.

Carga de los datos de aprendizaje

El siguiente paso consiste en elegir los datos de entrenamiento que ya están preparados o cargar nuevos datos de entrenamiento que se usarán 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:

En cuanto a los archivos de datos grandes, le recomendamos que los importe desde el almacén de blobs de Azure. Los archivos grandes pueden volverse inestables cuando se cargan a través de formularios multiparte porque las solicitudes son atómicas y no se pueden volver a intentar o reanudar. Para obtener más información acerca de Azure Blob Storage, consulte ¿Qué es Azure Blob Storage?

Nota:

Los archivos de datos de entrenamiento deben tener el formato JSONL, estar codificados en UTF-8 con una marca de orden de bytes (BOM). El archivo debe tener un tamaño inferior a 512 MB.

En el siguiente ejemplo de Python se cargan 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 siguiente código de Python muestra un ejemplo de cómo crear un nuevo trabajo de ajuste preciso con 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 base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry the model cannot contain dot/period characters.
    seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
    extra_body={ "trainingType": "GlobalStandard" } # Change this 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 will take some time to start and complete.

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 aprovecha la 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, utilice un modelo que soporte el entrenamiento en el nivel Estándar.

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 los Fine-Tuning supervisados son:

Nombre Tipo Descripción
batch_size entero 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, hemos comprobado que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes. El valor predeterminado, así como 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 que se usó 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 rango de 0,02 a 0,2 para ver qué produce los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs entero 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 entero La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debe generar los mismos resultados, pero puede diferir en raras ocasiones. Si no se especifica un valor de inicialización, se generará uno 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 will be using Supervised Fine Tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  },
  extra_body={ "trainingType": "GlobalStandard" }
)

Nota:

Consulte las guías de optimización de preferencias directas y ajuste fino por refuerzo para obtener más información sobre sus hiperparámetros admitidos.

Tipo de entrenamiento

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

  • Estándar: la formación se lleva a cabo en la región del recurso Foundry actual, lo que garantiza la residencia de los 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 aprovechando la 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 ahorros de costos significativos aprovechando la capacidad inactiva para el entrenamiento. No hay ninguna garantía de latencia o acuerdo de nivel de servicio, por lo que los trabajos de este nivel se pueden reemplazar y reanudar 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.

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, es posible que tenga que actualizar la biblioteca cliente de OpenAI a la versión más reciente con pip install openai --upgrade para ejecutar este comando.

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

Puntos de control

Cuando finaliza cada época de entrenamiento, se genera un punto de control. Un punto de control es una versión totalmente funcional de un modelo que puede implementarse y usarse como modelo de destino para posteriores trabajos de ajuste. Los puntos de control pueden ser especialmente útiles, ya que pueden proporcionar instantáneas antes de realizar el sobreajuste. Cuando finalice un trabajo de ajuste, dispondrá de las tres versiones más recientes del modelo para implementarlas. La última iteración estará representada por su modelo afinado, las dos iteraciones anteriores estarán disponibles como puntos de control.

Puede ejecutar el comando list checkpoints para recuperar la lista de puntos de control asociados a un trabajo individual de ajuste preciso. Es posible que tenga que actualizar la biblioteca cliente de OpenAI a la versión más reciente con pip install openai --upgrade para ejecutar este comando.

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

Análisis del modelo personalizado

Azure OpenAI asocia un archivo de resultado denominado results.csv a cada trabajo de ajuste preciso una vez completado. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El id. del archivo de resultados se muestra para cada modelo personalizado; igualmente, puede usar el SDK de Python para recuperar el id. 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 y, a continuación, se 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 realizó el trabajo de ajuste preciso. 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 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 de tipo [[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 El porcentaje de tokens que el modelo predijo correctamente en el lote de validación.
Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones de tipo [[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. Seleccione el vínculo del modelo entrenado y verá 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 aparecerán en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si ve una divergencia entre los datos de entrenamiento y validación, es posible que esté realizando un sobreajuste. Pruebe un entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

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

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

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

Variable Definición
token Hay varias maneras de generar un token de autorización. El método más sencillo para las pruebas iniciales es iniciar 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 su almacenamiento en una nueva variable de entorno.
suscripción Identificador de suscripción para el recurso de Azure OpenAI asociado.
grupo_de_recursos Nombre del grupo de recursos para el recurso de Azure OpenAI.
nombre_del_recurso El nombre del recurso de Azure OpenAI.
nombre_de_despliegue_del_modelo Nombre personalizado para la nueva implementación de modelos ajustados. Este es el nombre al que se hará referencia en el código al efectuar llamadas de finalización de chat.
modelo afinado Recupere este valor del trabajo de ajuste de resultados en el paso anterior. Tendrá el siguiente aspecto: gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Tendrá que agregar ese valor al archivo JSON deploy_data. Como alternativa, también puede implementar un punto de control, pasando el id. del punto de control que aparecerá 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 will use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # control plane API version rather than dataplane 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 will look 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())

Obtenga más información sobre la implementación entre regiones y use el modelo implementado aquí.

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

Ajuste preciso continuo

Una vez que haya creado un modelo ajustado, es posible que quiera 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.

Nota:

El ajuste continuo solo se admite para los modelos openAI.

Para realizar un ajuste preciso en un modelo que ha ajustado previamente, usaría el mismo proceso que se describe en creación de un modelo personalizado pero, en lugar de especificar el nombre de un modelo base genérico, especificaría el identificador del modelo ya optimizado. El identificador del modelo optimizado es similar a 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 will take some time to start and complete.

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

También se recomienda incluir el parámetro suffix para facilitar la distinción entre diferentes iteraciones del modelo ajustado. suffix toma una cadena y está configurado para identificar el modelo afinado. Con la API de Python de OpenAI, se admite una cadena de hasta 18 caracteres que se agregará al nombre del modelo optimizado.

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

Limpia tus implementaciones, modelos personalizados y archivos de entrenamiento

Cuando haya terminado con su 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 quince (15) días, la implementación se eliminará automáticamente. La implementación de un modelo personalizado es inactivasi el modelo se ha implementado hace más de quince (15) días y no se han realizado finalizaciones ni llamadas de finalización de chat 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, y el modelo personalizado se puede volver a implementar en cualquier momento. Como se describe en Precios de Foundry Models de Microsoft en Azure OpenAI, cada modelo personalizado (ajustado) implementado incurre en un coste de hospedaje por hora, independientemente de si se realizan solicitudes de finalización o de finalización de chat. Para más información sobre el planeamiento y la administración de costos con Azure OpenAI, consulte las instrucciones de Planeamiento para administrar los costos de Azure OpenAI.

Puede usar varios métodos para eliminar la implementación del modelo personalizado:

Eliminación de un modelo personalizado

Del mismo modo, puede usar varios métodos para eliminar el modelo personalizado:

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Primero debe eliminar la implementación de su modelo antes de poder eliminar su 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 our subscription.
files = openai.File.list().data
print(f'Found {len(files)} total uploaded files in the subscription.')

# Enumerate all uploaded files, extracting the file IDs for the
# files with file names that match your training dataset file and
# validation dataset file names.
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 our files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

Prerrequisitos

Modelos compatibles

Consulte la página de modelos para comprobar qué regiones admiten actualmente el ajuste preciso.

O bien, puede realizar el ajuste preciso de un modelo previamente ajustado, con el formato base-model.ft-{jobid}.

Revisión del flujo de trabajo de la API REST

Dedique un momento a examinar el flujo de trabajo de ajuste fino para usar 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 consisten en ejemplos de entrada y salida para cómo desea que el modelo funcione.

Los datos de entrenamiento y validación que use deben estar formateados como un documento de líneas JSON (JSONL) y en el formato conversacional que utiliza la API de finalización de chats.

Si desea un tutorial detallado del ajuste preciso de un modelo gpt-4o-mini-2024-07-18, consulte el tutorial de ajuste preciso 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 del 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 preciso de los mensajes del asistente, agregue el par de valores de clave 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 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."}]}

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). El archivo debe tener un tamaño inferior a 512 MB.

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. Es recomendable proporcionar cientos, o incluso miles, de ejemplos de entrenamiento para llevarlos a cabo correctamente.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Sin embargo, tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena el modelo con una gran cantidad de datos internos, sin eliminar primero el conjunto de datos para solo los ejemplos de mayor calidad, podría acabar con un modelo que funciona mucho peor de lo esperado.

Carga de los datos de aprendizaje

El siguiente paso consiste en elegir los datos de entrenamiento que ya están preparados o cargar nuevos datos de entrenamiento que se usarán al realizar el ajuste preciso del modelo. Cuando haya preparado los datos de entrenamiento, puede cargar los archivos en el servicio. Hay dos maneras de cargar los datos de entrenamiento:

En cuanto a los archivos de datos grandes, le recomendamos que los importe desde el almacén de blobs de Azure. Los archivos grandes pueden volverse inestables cuando se cargan a través de formularios multiparte porque las solicitudes son atómicas y no se pueden volver a intentar o reanudar. Para obtener más información acerca de Azure Blob Storage, consulte ¿Qué es Azure Blob Storage?

Nota:

Los archivos de datos de entrenamiento deben tener el formato JSONL, estar codificados en UTF-8 con una marca de orden de bytes (BOM). El archivo debe tener un tamaño inferior a 512 MB.

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. El siguiente código muestra un ejemplo de cómo crear un nuevo trabajo de ajuste preciso con la API de REST.

En este ejemplo también se pasa el parámetro de inicialización. La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debe generar los mismos resultados, pero puede diferir en raras ocasiones. Si no se especifica una semilla, se generará una para ti.

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 admita 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 los Fine-Tuning supervisados son:

Nombre Tipo Descripción
batch_size entero 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, hemos comprobado que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes. El valor predeterminado, así como 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 que se usó 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 rango de 0,02 a 0,2 para ver qué produce los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs entero 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 entero La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debe generar los mismos resultados, pero puede diferir en raras ocasiones. Si no se especifica un valor de inicialización, se generará uno automáticamente.

Nota:

Consulte las guías de optimización de preferencias directas y ajuste fino por refuerzo para obtener más información sobre sus hiperparámetros admitidos.

Tipo de entrenamiento

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

  • Estándar: la formación se lleva a cabo en la región del recurso Foundry actual, lo que garantiza la residencia de los 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 aprovechando la 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 ahorros de costos significativos aprovechando la capacidad inactiva para el entrenamiento. No hay ninguna garantía de latencia o acuerdo de nivel de servicio, por lo que los trabajos de este nivel se pueden reemplazar y reanudar 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 haber iniciado un trabajo de ajuste preciso, puede tardar algo de tiempo en completarse. Es posible que el trabajo esté en cola detrás de otros trabajos del sistema. Entrenar el modelo puede tardar minutos u horas, dependiendo del modelo y del tamaño 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 ID de trabajo devuelto por el ejemplo anterior.

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
  -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 siente que el modelo no está aprendiendo a un ritmo correcto. Una vez pausado el trabajo de entrenamiento, se creará un punto de control que se pueda implementar una vez completadas las validaciones de seguridad. Este punto de control disponible para implementar y usar para la inferencia o reanudar el trabajo aún más hasta su finalización. La operación de pausa solo es aplicable a los trabajos que se han entrenado durante al menos un paso y están en estado 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" 

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" 

Copiar 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 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 que el modelo se copia 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 hará que el modelo se elimine en la región de destino. Para eliminar el modelo en ambas regiones una vez copiado, el modelo debe eliminarse por separado en cada región.

Requisitos previos

  • El recurso o la cuenta de destino deben tener al menos un trabajo de ajuste.
  • El recurso o la cuenta de destino no deben deshabilitar el acceso a la red pública. (Al menos al enviar una 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.

Configuración de permisos

  1. Cree una identidad administrada asignada por el usuario.
  2. Asigne un 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.

Copiar 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 optimizado 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 este mismo nombre exacto para ajustar, implementar o para 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.

Puntos de control

Cuando finaliza cada época de entrenamiento, se genera un punto de control. Un punto de control es una versión totalmente funcional de un modelo que puede implementarse y usarse como modelo de destino para posteriores trabajos de ajuste. Los puntos de control pueden ser especialmente útiles, ya que pueden proporcionar instantáneas antes de realizar el sobreajuste. Cuando finalice un trabajo de ajuste, dispondrá de las tres versiones más recientes del modelo para implementarlas. La última iteración estará representada por su modelo afinado, las dos iteraciones anteriores estarán disponibles como puntos de control.

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

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" 

Análisis del modelo personalizado

Azure OpenAI asocia un archivo de resultado denominado results.csv a cada trabajo de ajuste preciso una vez completado. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El id. del archivo de resultados se muestra para cada modelo personalizado; igualmente, puede usar la API de REST para recuperar el id. de archivo y descargar el archivo de resultados para su análisis.

En el siguiente ejemplo de Python se usa la API de REST para recuperar el id. del primer archivo de resultados adjunto al trabajo de ajuste preciso del modelo personalizado y, a continuación, se 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 realizó el trabajo de ajuste preciso. 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 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 de tipo [[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 El porcentaje de tokens que el modelo predijo correctamente en el lote de validación.
Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones de tipo [[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áficas en Foundry portal. Seleccione el vínculo del modelo entrenado y verá 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 aparecerán en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si ve una divergencia entre los datos de entrenamiento y validación, puede ocurrir que haya un sobreajuste. Pruebe un entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

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

Si va a realizar la implementación para 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 de residencia de datos concretas, siga nuestra guía de implementación.

Variable Definición
token Hay varias maneras de generar un token de autorización. El método más sencillo para las pruebas iniciales es iniciar 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 su almacenamiento en una nueva variable de entorno.
suscripción Identificador de suscripción para el recurso de Azure OpenAI asociado.
grupo_de_recursos Nombre del grupo de recursos para el recurso de Azure OpenAI.
nombre_del_recurso El nombre del recurso de Azure OpenAI.
nombre_de_despliegue_del_modelo Nombre personalizado para la nueva implementación de modelos ajustados. Este es el nombre al que se hará referencia en el código al efectuar llamadas de finalización de chat.
modelo afinado Recupere este valor del trabajo de ajuste de resultados en el paso anterior. Tendrá el siguiente aspecto: gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Tendrá que agregar ese valor al archivo JSON deploy_data. Como alternativa, también puede implementar un punto de control, pasando el id. del punto de control que aparecerá 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"
        }
    }
}'

Obtenga más información sobre la implementación entre regiones y use el modelo implementado aquí.

Ajuste preciso continuo

Una vez que haya creado un modelo ajustado, es posible que quiera 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.

Nota:

El ajuste continuo solo se admite para los modelos openAI.

Para realizar un ajuste preciso en un modelo que ha ajustado previamente, usaría el mismo proceso que se describe en creación de un modelo personalizado pero, en lugar de especificar el nombre de un modelo base genérico, especificaría el identificador del modelo ya optimizado. El identificador del modelo optimizado es similar a 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 parámetro suffix para facilitar la distinción entre diferentes iteraciones del modelo ajustado. suffix toma una cadena y está configurado para identificar el modelo afinado. El sufijo puede contener hasta 40 caracteres (a-z, A-Z, 0-9, - y _) que se agregarán al nombre del modelo personalizado.

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

Limpia tus implementaciones, modelos personalizados y archivos de entrenamiento

Cuando haya terminado con su 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 varios métodos para eliminar la implementación del modelo personalizado:

Eliminación de un modelo personalizado

Del mismo modo, puede usar varios métodos para eliminar el modelo personalizado:

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Primero debe eliminar la implementación de su modelo antes de poder eliminar su 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:

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

Si solo va a ajustar los modelos de Azure OpenAI, se recomienda la experiencia centrada en el ajuste preciso de Azure OpenAI, disponible navegando a https://ai.azure.com/resource/overview.

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

Consulte la página de modelos para comprobar qué regiones admiten actualmente el ajuste preciso.

O bien, puede realizar el ajuste preciso de un modelo previamente ajustado, con el formato 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 ajustado en el portal de Foundry para entrenar el modelo personalizado.
    1. Seleccione un método de entrenamiento.
    2. Seleccione un modelo base.
    3. Elección del tipo de entrenamiento
    4. Elija los datos de entrenamiento.
    5. Opcionalmente, elija los datos de validación.
    6. Opcionalmente, configure los parámetros de la tarea para el trabajo de ajuste preciso.
    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 consisten en ejemplos de entrada y salida para cómo desea que el modelo funcione.

Los datos de entrenamiento y validación que use deben estar formateados como un documento de líneas JSON (JSONL) y en el formato conversacional que utiliza la API de finalización de chats.

Por lo general, se recomienda usar las instrucciones y las indicaciones que demostró que funcionaron mejor en cada ejemplo de entrenamiento. Esto le ayudará 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 de 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 preciso de los mensajes del asistente, agregue el par de valores de clave 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 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."}]}

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). El archivo debe tener un tamaño inferior a 512 MB.

Consideración del tamaño de los conjuntos 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. Es recomendable proporcionar cientos, o incluso miles, de ejemplos de entrenamiento para llevarlos a cabo correctamente. Se recomienda empezar con 50 datos de entrenamiento 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. Sin embargo, tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrenas el modelo con una gran cantidad de datos internos, sin primero depurar el conjunto de datos para incluir solo los ejemplos de mayor calidad, podrías acabar con un modelo que funcione mucho peor de lo esperado.

Creación de un modelo ajustado finamente

El portal de Foundry proporciona el cuadro de diálogo Crear un modelo ajustado, por lo que, en un solo lugar, puede crear y entrenar fácilmente un modelo optimizado para el recurso de Azure.

  1. Vaya al portal de Foundry en https://ai.azure.com/ 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. En el portal de Foundry, vaya al panel Herramientas > de Ajuste fino y seleccione Ajustar modelo.

    Captura de pantalla que muestra cómo acceder al Asistente para crear modelos personalizados en el portal de Foundry.

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

    Captura de pantalla del cuadro de diálogo de selección de modelos en el portal de Foundry.

Ahora debería ver el cuadro de diálogo Crear un modelo ajustado .

Captura de pantalla del cuadro de diálogo 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.

  • Ajuste fino supervisado (SFT): compatible con todos los modelos que no son de razonamiento.
  • Optimización de preferencias directas (versión preliminar) (DPO): compatible con GPT-4o.
  • Ajuste fino de refuerzo (versión preliminar) (RFT): compatible con modelos de razonamiento, como o4-mini.

Al seleccionar el modelo, también puede seleccionar un modelo optimizado previamente.

Elegir el tipo de entrenamiento.

Foundry ofrece tres niveles de aprendizaje diseñados para satisfacer diferentes necesidades de los clientes:

Nivel de entrenamiento estándar

Proporciona capacidad dedicada para ajuste fino con rendimiento predecible y acuerdos de nivel de servicio (SLAs). Ideal para cargas de trabajo de producción que requieren un rendimiento garantizado.

Nivel de entrenamiento estándar global

Global Training amplía el alcance de la personalización de modelos con los precios más asequibles de nuestras otras ofertas globales. No ofrece residencia de datos. Si necesita residencia de datos, consulte las regiones enumeradas en la disponibilidad del modelo para el modelo elegido.

Los datos de entrenamiento y los pesos del modelo resultantes serán copiados a otra región de Azure.

  • 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

Una opción rentable que usa la capacidad inactiva para cargas de trabajo no urgentes o exploratorias.
Los trabajos de este nivel se pueden adelantar y reanudar más adelante, lo que los convierte en una opción ideal para la experimentación y los casos de uso sensibles a los costos.

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 y también proporciona opciones para cargar nuevos datos de entrenamiento.

Captura de pantalla del panel de Datos de Entrenamiento del asistente para crear modelos personalizados en el portal de Foundry.

  • Si los datos de entrenamiento ya se han cargado en el servicio, seleccione Archivos del recurso de IA conectada.

    • Seleccione el archivo en la lista desplegable que se muestra.
  • 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 u otra ubicación web compartida.

En cuanto a los archivos de datos grandes, le recomendamos que los importe desde el almacén de blobs de Azure. Los archivos grandes pueden volverse inestables cuando se cargan a través de formularios multiparte porque las solicitudes son atómicas y no se pueden volver a intentar o reanudar. Para obtener más información acerca de Azure Blob Storage, consulte ¿Qué es Azure Blob Storage?

Nota:

Los archivos de datos de entrenamiento deben tener el formato JSONL, estar codificados en UTF-8 con una marca de orden de bytes (BOM). El archivo debe tener un tamaño inferior a 512 MB.

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 que se usarán 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 existentes y proporciona opciones por las que puede cargar nuevos datos de validación.

Captura de pantalla del panel Datos de validación del Asistente para crear modelos personalizados en el portal de Foundry.

  • Si los datos de validación ya se han cargado en el servicio, seleccione Elegir conjunto de datos.

    • Seleccione el archivo de la lista que se muestra en el panel Datos de validación.
  • 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 u otra ubicación web compartida.

En cuanto a los archivos de datos grandes, le recomendamos que los importe desde el almacén de blobs de Azure. Los archivos grandes pueden volverse inestables cuando se cargan a través de formularios multiparte porque las solicitudes son atómicas y no se pueden volver a intentar o reanudar.

Nota:

Al igual que los archivos de datos de entrenamiento, los archivos de datos de validación deben tener el formato JSONL, estar codificados en UTF-8 con una marca de orden de bytes (BOM). El archivo debe tener un tamaño inferior a 512 MB.

Hacer que el modelo sea identificable (opcional)

También se recomienda incluir un suffix parámetro para facilitar la distinción entre diferentes iteraciones del modelo ajustado. Toma suffix una cadena de hasta 18 caracteres y se usa al asignar un nombre al modelo optimizado resultante.

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

Puede proporcionar una inicialización opcional y ajustar hiperparámetros adicionales.

La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debe generar los mismos resultados, pero puede diferir en raras ocasiones. Si no se especifica una semilla, se generará una aleatoriamente.

Captura de pantalla de cierre de la sección de parámetros del Asistente para crear modelos personalizados 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 del lote entero 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, hemos comprobado que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes. El valor predeterminado, así como 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 que se usó 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 rango de 0,02 a 0,2 para ver qué produce los mejores resultados. Una tasa de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
Número de épocas entero 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 se completa correctamente, el modelo se implementará con el tipo de implementación seleccionado. La implementación se denominará en función del nombre único generado para el modelo personalizado y el sufijo opcional que puede haber proporcionado anteriormente.

Captura de pantalla del conmutador de implementación automática en el Asistente para la creación de modelos personalizados en el portal de 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. Consulte la documentación del tipo de implementación para obtener más detalles.

Revisión de las opciones y entrenamiento del modelo

Revise las opciones y 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, verá una página con detalles sobre el modelo ajustado. Puede encontrar el estado y más información sobre su modelo afinado en la página Ajuste de parámetros del portal Foundry.

Es posible que el trabajo esté en cola detrás de otros trabajos del sistema. Entrenar el modelo puede tardar minutos u horas, dependiendo del modelo y del tamaño del conjunto de datos.

Puntos de control

Cuando finaliza cada época de entrenamiento, se genera un punto de control. Un punto de control es una versión totalmente funcional de un modelo que puede implementarse y usarse como modelo de destino para posteriores trabajos de ajuste. Los puntos de control pueden ser especialmente útiles, ya que pueden proporcionar instantáneas antes de realizar el sobreajuste. Cuando finalice un trabajo de ajuste, dispondrá de las tres versiones más recientes del modelo para implementarlas. 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. Verá que el trabajo pasa por los mismos estados que los trabajos de ajuste preciso normales (en cola, en ejecución, realizado correctamente).

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

Nota:

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 siente que el modelo no está aprendiendo a un ritmo correcto. Una vez pausado el trabajo de entrenamiento, se creará un punto de control que se pueda implementar una vez completadas las validaciones de seguridad. Este punto de control disponible para implementar y usar para la inferencia o reanudar el trabajo aún más hasta su finalización. La operación de pausa solo es aplicable a los trabajos que se han entrenado durante al menos un paso y están en estado En ejecución.

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

Análisis del modelo personalizado

Azure OpenAI asocia un archivo de resultado denominado results.csv a cada trabajo de ajuste preciso una vez completado. 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 realizó el trabajo de ajuste preciso. 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 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 de tipo [[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 El porcentaje de tokens que el modelo predijo correctamente en el lote de validación.
Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones de tipo [[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áficas en Foundry portal. Seleccione el vínculo del modelo entrenado y verá 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 aparecerán en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si ve una divergencia entre los datos de entrenamiento y los de validación, puede indicar que existe un sobreajuste. Pruebe un entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

Una vez que se haya satisfecho con las métricas del trabajo de ajuste preciso, o simplemente quiera pasar a la inferencia, debe implementar el modelo.

Si va a realizar la implementación para 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 de residencia de datos concretas, siga nuestra 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 Playground en Foundry para experimentar con su 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 usa para guiar el modelo optimizado (ya sea implementado o disponible para las 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.

Ajuste preciso continuo

Una vez que haya creado 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 previamente, usaría el mismo proceso que se describe en la creación de un modelo ajustado, pero en lugar de especificar el nombre de un modelo base genérico, especificaría el modelo ya optimizado. Un modelo personalizado ajustado tendría un aspecto similar a gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft

Recorte de pantalla de la interfaz de usuario Crear un modelo personalizado con un modelo optimizado resaltado.

Limpieza de implementaciones, modelos personalizados y archivos de entrenamiento

Cuando haya terminado con su 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 quince (15) días, la implementación se eliminará automáticamente. La implementación de un modelo personalizado es inactivasi el modelo se ha implementado hace más de quince (15) días y no se han realizado finalizaciones ni llamadas de finalización de chat 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, y el modelo personalizado se puede volver a implementar en cualquier momento. Como se describe en Precios de Foundry Models de Microsoft en Azure OpenAI, cada modelo personalizado (ajustado) implementado incurre en un coste de hospedaje por hora, independientemente de si se realizan solicitudes de finalización o de finalización de chat. Para más información sobre el planeamiento y la administración de costos con Azure OpenAI, consulte las instrucciones de Planeamiento para administrar los costos de Azure OpenAI.

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

Eliminación del modelo personalizado

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

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Primero debe eliminar la implementación de su modelo antes de poder eliminar su 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 generados durante el entrenamiento, en el panel Datos> de administracióny índices del portal de Foundry. Seleccione el archivo que quiera eliminar y, a continuación, seleccione Eliminar para eliminarlo.

Prerrequisitos

Modelos compatibles

Consulte la página de modelos para comprobar qué regiones admiten actualmente el ajuste preciso.

O bien, puede ajustar un modelo previamente ajustado, con el formato 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 consisten en ejemplos de entrada y salida para cómo desea que el modelo funcione.

Los datos de entrenamiento y validación que use deben estar formateados como un documento de líneas JSON (JSONL) y en el formato conversacional que utiliza la API de finalización de chats.

Si desea un tutorial detallado del ajuste preciso de un modelo gpt-4o-mini-2024-07-18, consulte el tutorial de ajuste preciso 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 del 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 preciso de los mensajes del asistente, agregue el par de valores de clave 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 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."}]}

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). El archivo debe tener un tamaño inferior a 512 MB.

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. Es recomendable proporcionar cientos, o incluso miles, de ejemplos de entrenamiento para llevarlos a cabo correctamente.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Sin embargo, tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrenas el modelo con una gran cantidad de datos internos, sin primero depurar el conjunto de datos para incluir solo los ejemplos de mayor calidad, podrías acabar con un modelo que funcione mucho peor de lo esperado.

Carga de los datos de aprendizaje

El siguiente paso consiste en elegir los datos de entrenamiento que ya están preparados o cargar nuevos datos de entrenamiento que se usarán 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:

En cuanto a los archivos de datos grandes, le recomendamos que los importe desde el almacén de blobs de Azure. Los archivos grandes pueden volverse inestables cuando se cargan a través de formularios multiparte porque las solicitudes son atómicas y no se pueden volver a intentar o reanudar. Para obtener más información acerca de Azure Blob Storage, consulte ¿Qué es Azure Blob Storage?

Nota:

Los archivos de datos de entrenamiento deben tener el formato JSONL, estar codificados en UTF-8 con una marca de orden de bytes (BOM). El archivo debe tener un tamaño inferior a 512 MB.

En el siguiente ejemplo de Python se cargan 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 siguiente código de Python muestra un ejemplo de cómo crear un nuevo trabajo de ajuste preciso con 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 base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry the model cannot contain dot/period characters.
    seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
    extra_body={ "trainingType": "GlobalStandard" } # Change this 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 will take some time to start and complete.

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 aprovecha la 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, utilice un modelo que soporte el entrenamiento en el nivel Estándar.

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 los Fine-Tuning supervisados son:

Nombre Tipo Descripción
batch_size entero 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, hemos comprobado que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes. El valor predeterminado, así como 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 que se usó 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 rango de 0,02 a 0,2 para ver qué produce los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs entero 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 entero La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debe generar los mismos resultados, pero puede diferir en raras ocasiones. Si no se especifica un valor de inicialización, se generará uno 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 will be using Supervised Fine Tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  },
  extra_body={ "trainingType": "GlobalStandard" }
)

Nota:

Consulte las guías de optimización de preferencias directas y ajuste fino por refuerzo para obtener más información sobre sus hiperparámetros admitidos.

Tipo de entrenamiento

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

  • Estándar: la formación se lleva a cabo en la región del recurso Foundry actual, lo que garantiza la residencia de los 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 aprovechando la 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 ahorros de costos significativos aprovechando la capacidad inactiva para el entrenamiento. No hay ninguna garantía de latencia o acuerdo de nivel de servicio, por lo que los trabajos de este nivel se pueden reemplazar y reanudar 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.

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, es posible que tenga que actualizar la biblioteca cliente de OpenAI a la versión más reciente con pip install openai --upgrade para ejecutar este comando.

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

Puntos de control

Cuando finaliza cada época de entrenamiento, se genera un punto de control. Un punto de control es una versión totalmente funcional de un modelo que puede implementarse y usarse como modelo de destino para posteriores trabajos de ajuste. Los puntos de control pueden ser especialmente útiles, ya que pueden proporcionar instantáneas antes de realizar el sobreajuste. Cuando finalice un trabajo de ajuste, dispondrá de las tres versiones más recientes del modelo para implementarlas. La última iteración estará representada por su modelo afinado, las dos iteraciones anteriores estarán disponibles como puntos de control.

Puede ejecutar el comando list checkpoints para recuperar la lista de puntos de control asociados a un trabajo individual de ajuste preciso. Es posible que tenga que actualizar la biblioteca cliente de OpenAI a la versión más reciente con pip install openai --upgrade para ejecutar este comando.

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

Análisis del modelo personalizado

Azure OpenAI asocia un archivo de resultado denominado results.csv a cada trabajo de ajuste preciso una vez completado. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El id. del archivo de resultados se muestra para cada modelo personalizado; igualmente, puede usar el SDK de Python para recuperar el id. 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 y, a continuación, se 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 realizó el trabajo de ajuste preciso. 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 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 de tipo [[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 El porcentaje de tokens que el modelo predijo correctamente en el lote de validación.
Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones de tipo [[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. Seleccione el vínculo del modelo entrenado y verá 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 aparecerán en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si ve una divergencia entre los datos de entrenamiento y validación, es posible que esté realizando un sobreajuste. Pruebe un entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

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

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

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

Variable Definición
token Hay varias maneras de generar un token de autorización. El método más sencillo para las pruebas iniciales es iniciar 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 su almacenamiento en una nueva variable de entorno.
suscripción Identificador de suscripción para el recurso de Azure OpenAI asociado.
grupo_de_recursos Nombre del grupo de recursos para el recurso de Azure OpenAI.
nombre_del_recurso El nombre del recurso de Azure OpenAI.
nombre_de_despliegue_del_modelo Nombre personalizado para la nueva implementación de modelos ajustados. Este es el nombre al que se hará referencia en el código al efectuar llamadas de finalización de chat.
modelo afinado Recupere este valor del trabajo de ajuste de resultados en el paso anterior. Tendrá el siguiente aspecto: gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Tendrá que agregar ese valor al archivo JSON deploy_data. Como alternativa, también puede implementar un punto de control, pasando el id. del punto de control que aparecerá 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 will use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # control plane API version rather than dataplane 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 will look 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())

Obtenga más información sobre la implementación entre regiones y use el modelo implementado aquí.

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

Ajuste preciso continuo

Una vez que haya creado un modelo ajustado, es posible que quiera 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.

Nota:

El ajuste continuo solo se admite para los modelos openAI.

Para realizar un ajuste preciso en un modelo que ha ajustado previamente, usaría el mismo proceso que se describe en creación de un modelo personalizado pero, en lugar de especificar el nombre de un modelo base genérico, especificaría el identificador del modelo ya optimizado. El identificador del modelo optimizado es similar a 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 will take some time to start and complete.

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

También se recomienda incluir el parámetro suffix para facilitar la distinción entre diferentes iteraciones del modelo ajustado. suffix toma una cadena y está configurado para identificar el modelo afinado. Con la API de Python de OpenAI, se admite una cadena de hasta 18 caracteres que se agregará al nombre del modelo optimizado.

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

Limpia tus implementaciones, modelos personalizados y archivos de entrenamiento

Cuando haya terminado con su 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 quince (15) días, la implementación se eliminará automáticamente. La implementación de un modelo personalizado es inactivasi el modelo se ha implementado hace más de quince (15) días y no se han realizado finalizaciones ni llamadas de finalización de chat 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, y el modelo personalizado se puede volver a implementar en cualquier momento. Como se describe en Precios de Foundry Models de Microsoft en Azure OpenAI, cada modelo personalizado (ajustado) implementado incurre en un coste de hospedaje por hora, independientemente de si se realizan solicitudes de finalización o de finalización de chat. Para más información sobre el planeamiento y la administración de costos con Azure OpenAI, consulte las instrucciones de Planeamiento para administrar los costos de Azure OpenAI.

Puede usar varios métodos para eliminar la implementación del modelo personalizado:

Eliminación de un modelo personalizado

Del mismo modo, puede usar varios métodos para eliminar el modelo personalizado:

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Primero debe eliminar la implementación de su modelo antes de poder eliminar su 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 our subscription.
files = openai.File.list().data
print(f'Found {len(files)} total uploaded files in the subscription.')

# Enumerate all uploaded files, extracting the file IDs for the
# files with file names that match your training dataset file and
# validation dataset file names.
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 our files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

Prerrequisitos

Modelos compatibles

Consulte la página de modelos para comprobar qué regiones admiten actualmente el ajuste preciso.

O bien, puede realizar el ajuste preciso de un modelo previamente ajustado, con el formato base-model.ft-{jobid}.

Revisión del flujo de trabajo de la API REST

Dedique un momento a examinar el flujo de trabajo de ajuste fino para usar 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 consisten en ejemplos de entrada y salida para cómo desea que el modelo funcione.

Los datos de entrenamiento y validación que use deben estar formateados como un documento de líneas JSON (JSONL) y en el formato conversacional que utiliza la API de finalización de chats.

Si desea un tutorial detallado del ajuste preciso de un modelo gpt-4o-mini-2024-07-18, consulte el tutorial de ajuste preciso 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 del 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 preciso de los mensajes del asistente, agregue el par de valores de clave 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 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."}]}

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). El archivo debe tener un tamaño inferior a 512 MB.

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. Es recomendable proporcionar cientos, o incluso miles, de ejemplos de entrenamiento para llevarlos a cabo correctamente.

En general, al duplicar el tamaño del conjunto de datos se puede producir un aumento lineal de la calidad del modelo. Sin embargo, tenga en cuenta que los ejemplos de baja calidad pueden afectar negativamente al rendimiento. Si entrena el modelo con una gran cantidad de datos internos, sin eliminar primero el conjunto de datos para solo los ejemplos de mayor calidad, podría acabar con un modelo que funciona mucho peor de lo esperado.

Carga de los datos de aprendizaje

El siguiente paso consiste en elegir los datos de entrenamiento que ya están preparados o cargar nuevos datos de entrenamiento que se usarán al realizar el ajuste preciso del modelo. Cuando haya preparado los datos de entrenamiento, puede cargar los archivos en el servicio. Hay dos maneras de cargar los datos de entrenamiento:

En cuanto a los archivos de datos grandes, le recomendamos que los importe desde el almacén de blobs de Azure. Los archivos grandes pueden volverse inestables cuando se cargan a través de formularios multiparte porque las solicitudes son atómicas y no se pueden volver a intentar o reanudar. Para obtener más información acerca de Azure Blob Storage, consulte ¿Qué es Azure Blob Storage?

Nota:

Los archivos de datos de entrenamiento deben tener el formato JSONL, estar codificados en UTF-8 con una marca de orden de bytes (BOM). El archivo debe tener un tamaño inferior a 512 MB.

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. El siguiente código muestra un ejemplo de cómo crear un nuevo trabajo de ajuste preciso con la API de REST.

En este ejemplo también se pasa el parámetro de inicialización. La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debe generar los mismos resultados, pero puede diferir en raras ocasiones. Si no se especifica una semilla, se generará una para ti.

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 admita 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 los Fine-Tuning supervisados son:

Nombre Tipo Descripción
batch_size entero 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, hemos comprobado que los tamaños de lote más grandes tienden a funcionar mejor para conjuntos de datos más grandes. El valor predeterminado, así como 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 que se usó 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 rango de 0,02 a 0,2 para ver qué produce los mejores resultados. Una velocidad de aprendizaje más pequeña puede ser útil para evitar el sobreajuste.
n_epochs entero 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 entero La semilla controla la reproducibilidad del trabajo. Pasar los mismos parámetros de inicialización y trabajo debe generar los mismos resultados, pero puede diferir en raras ocasiones. Si no se especifica un valor de inicialización, se generará uno automáticamente.

Nota:

Consulte las guías de optimización de preferencias directas y ajuste fino por refuerzo para obtener más información sobre sus hiperparámetros admitidos.

Tipo de entrenamiento

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

  • Estándar: la formación se lleva a cabo en la región del recurso Foundry actual, lo que garantiza la residencia de los 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 aprovechando la 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 ahorros de costos significativos aprovechando la capacidad inactiva para el entrenamiento. No hay ninguna garantía de latencia o acuerdo de nivel de servicio, por lo que los trabajos de este nivel se pueden reemplazar y reanudar 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 haber iniciado un trabajo de ajuste preciso, puede tardar algo de tiempo en completarse. Es posible que el trabajo esté en cola detrás de otros trabajos del sistema. Entrenar el modelo puede tardar minutos u horas, dependiendo del modelo y del tamaño 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 ID de trabajo devuelto por el ejemplo anterior.

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
  -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 siente que el modelo no está aprendiendo a un ritmo correcto. Una vez pausado el trabajo de entrenamiento, se creará un punto de control que se pueda implementar una vez completadas las validaciones de seguridad. Este punto de control disponible para implementar y usar para la inferencia o reanudar el trabajo aún más hasta su finalización. La operación de pausa solo es aplicable a los trabajos que se han entrenado durante al menos un paso y están en estado 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" 

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" 

Copiar 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 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 que el modelo se copia 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 hará que el modelo se elimine en la región de destino. Para eliminar el modelo en ambas regiones una vez copiado, el modelo debe eliminarse por separado en cada región.

Requisitos previos

  • El recurso o la cuenta de destino deben tener al menos un trabajo de ajuste.
  • El recurso o la cuenta de destino no deben deshabilitar el acceso a la red pública. (Al menos al enviar una 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.

Configuración de permisos

  1. Cree una identidad administrada asignada por el usuario.
  2. Asigne un 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.

Copiar 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 optimizado 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 este mismo nombre exacto para ajustar, implementar o para 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.

Puntos de control

Cuando finaliza cada época de entrenamiento, se genera un punto de control. Un punto de control es una versión totalmente funcional de un modelo que puede implementarse y usarse como modelo de destino para posteriores trabajos de ajuste. Los puntos de control pueden ser especialmente útiles, ya que pueden proporcionar instantáneas antes de realizar el sobreajuste. Cuando finalice un trabajo de ajuste, dispondrá de las tres versiones más recientes del modelo para implementarlas. La última iteración estará representada por su modelo afinado, las dos iteraciones anteriores estarán disponibles como puntos de control.

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

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" 

Análisis del modelo personalizado

Azure OpenAI asocia un archivo de resultado denominado results.csv a cada trabajo de ajuste preciso una vez completado. Puede usar el archivo de resultados para analizar el rendimiento de entrenamiento y validación del modelo personalizado. El id. del archivo de resultados se muestra para cada modelo personalizado; igualmente, puede usar la API de REST para recuperar el id. de archivo y descargar el archivo de resultados para su análisis.

En el siguiente ejemplo de Python se usa la API de REST para recuperar el id. del primer archivo de resultados adjunto al trabajo de ajuste preciso del modelo personalizado y, a continuación, se 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 realizó el trabajo de ajuste preciso. 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 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 de tipo [[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 El porcentaje de tokens que el modelo predijo correctamente en el lote de validación.
Por ejemplo, si el tamaño del lote se establece en 3 y los datos contienen finalizaciones de tipo [[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áficas en Foundry portal. Seleccione el vínculo del modelo entrenado y verá 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 aparecerán en el mismo trazado.

Intente disminuir la pérdida con el tiempo y aumentar la precisión. Si ve una divergencia entre los datos de entrenamiento y validación, puede ocurrir que haya un sobreajuste. Pruebe un entrenamiento con menos épocas o un multiplicador de velocidad de aprendizaje más pequeño.

Despliegue de un modelo finamente ajustado

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

Si va a realizar la implementación para 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 de residencia de datos concretas, siga nuestra guía de implementación.

Variable Definición
token Hay varias maneras de generar un token de autorización. El método más sencillo para las pruebas iniciales es iniciar 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 su almacenamiento en una nueva variable de entorno.
suscripción Identificador de suscripción para el recurso de Azure OpenAI asociado.
grupo_de_recursos Nombre del grupo de recursos para el recurso de Azure OpenAI.
nombre_del_recurso El nombre del recurso de Azure OpenAI.
nombre_de_despliegue_del_modelo Nombre personalizado para la nueva implementación de modelos ajustados. Este es el nombre al que se hará referencia en el código al efectuar llamadas de finalización de chat.
modelo afinado Recupere este valor del trabajo de ajuste de resultados en el paso anterior. Tendrá el siguiente aspecto: gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Tendrá que agregar ese valor al archivo JSON deploy_data. Como alternativa, también puede implementar un punto de control, pasando el id. del punto de control que aparecerá 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"
        }
    }
}'

Obtenga más información sobre la implementación entre regiones y use el modelo implementado aquí.

Ajuste preciso continuo

Una vez que haya creado un modelo ajustado, es posible que quiera 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.

Nota:

El ajuste continuo solo se admite para los modelos openAI.

Para realizar un ajuste preciso en un modelo que ha ajustado previamente, usaría el mismo proceso que se describe en creación de un modelo personalizado pero, en lugar de especificar el nombre de un modelo base genérico, especificaría el identificador del modelo ya optimizado. El identificador del modelo optimizado es similar a 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 parámetro suffix para facilitar la distinción entre diferentes iteraciones del modelo ajustado. suffix toma una cadena y está configurado para identificar el modelo afinado. El sufijo puede contener hasta 40 caracteres (a-z, A-Z, 0-9, - y _) que se agregarán al nombre del modelo personalizado.

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

Limpia tus implementaciones, modelos personalizados y archivos de entrenamiento

Cuando haya terminado con su 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 varios métodos para eliminar la implementación del modelo personalizado:

Eliminación de un modelo personalizado

Del mismo modo, puede usar varios métodos para eliminar el modelo personalizado:

Nota:

No se puede eliminar un modelo personalizado si tiene una implementación existente. Primero debe eliminar la implementación de su modelo antes de poder eliminar su 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: