Todos los productos
Search
Centro de documentos

Alibaba Cloud Model Studio:Introducción al ajuste fino de modelos

Última actualización: Oct 12, 2026

Puede utilizar el ajuste fino de modelos en Alibaba Cloud Model Studio si el rendimiento de un modelo no cumple con sus expectativas después de haber probado métodos de optimización como ingeniería de indicaciones y llamadas a complementos. Como estrategia central para mejorar el rendimiento del modelo, el ajuste fino puede mejorar significativamente las capacidades del modelo en industrias o escenarios empresariales específicos, alinear sus salidas con las preferencias humanas y reducir la latencia de salida. El ajuste fino de modelos incluye tres métodos de entrenamiento: ajuste fino supervisado (SFT), preentrenamiento continuo (CPT) y optimización directa de preferencias (DPO).

Introducción al ajuste fino de modelos

El ajuste fino de modelos es un método importante para optimizar el rendimiento del modelo. Puede:

  • Mejorar el rendimiento del modelo en industrias específicas o para necesidades comerciales específicas
  • Reducir la latencia de salida del modelo
  • Suprimir la alucinación del modelo
  • Alinear el modelo con valores o preferencias humanas
  • Reemplazar modelos más grandes con modelos ligeros ajustados

Durante el proceso de ajuste fino, el modelo aprende características específicas del negocio o del escenario a partir de los datos de entrenamiento, como conocimiento, tono, estilos de expresión y autoconciencia. Debido a que el modelo ya ha aprendido muchos ejemplos para industrias o escenarios específicos durante el entrenamiento, su rendimiento con indicaciones de uno o cero disparos después del entrenamiento es mejor que su rendimiento con pocos disparos antes del entrenamiento. Esto ahorra tokens de entrada y reduce la latencia de salida del modelo.

Proceso de ajuste fino del modelo

imagen

Para obtener más información, consulte:

Modelos compatibles

Modelos admitidos

Singapore

Generación de texto

Modelo

Código de modelo

Entrenamiento de parámetros completos SFT

Entrenamiento eficiente SFT

Qwen3.8-27B

qwen3.8-27b

✓

✓

Qwen3.6-27B

qwen3.6-27b

✓

✓

Qwen3.5-27B

qwen3.5-27b

✓

✓

Qwen3.5-9B

qwen3.5-9b

✓

✓

Qwen3-14B

qwen3-14b

×

✓

Comprensión visual (Qwen-VL)

Nombre del modelo

Código de modelo

SFT Entrenamiento de parámetros completos

SFT Entrenamiento eficiente

-

-

-

-

Norte de China 2 (Beijing)

Generación de texto

Servicio de modelo

Código de modelo

CPT Entrenamiento de parámetros completos

SFT Entrenamiento de parámetros completos

SFT Entrenamiento eficiente

DPO Entrenamiento de parámetros completos

DPO Entrenamiento eficiente

Qwen3.8-27B

qwen3.8-27b

×

✓

✓

×

×

Qwen3.7-Plus-2026-05-26

qwen3.7-plus-2026-05-26

×

✓

×

×

×

Qwen3.6-27B

qwen3.6-27b

×

✓

✓

×

×

Qwen3.6-Flash-2026-04-16

qwen3.6-flash-2026-04-16

×

✓

×

×

×

Qwen3.6-Plus-2026-04-02

qwen3.6-plus-2026-04-02

✓

✓

×

×

×

Qwen3.5-27B

qwen3.5-27b

×

✓

✓

×

×

Qwen3.5-9B

qwen3.5-9b

×

✓

✓

×

×

Qwen3.5-4B

qwen3.5-4b

×

✓

✓

×

×

Qwen3.5-Flash-2026-02-23

qwen3.5-flash-2026-02-23

×

✓

×

×

×

Qwen3.5-Plus-2026-02-15

qwen3.5-plus-2026-02-15

×

✓

×

×

×

Qwen3-32B

qwen3-32b

✓

✓

✓

✓

✓

Qwen3-30B-A3B-Instruct-2507

qwen3-30b-a3b-instruct-2507

✓

✓

✓

×

×

Qwen3-14B

qwen3-14b

×

✓

✓

✓

✓

Qwen3-8B

qwen3-8b

×

✓

✓

✓

✓

Qwen3-4B-Instruct-2507

qwen3-4b-instruct-2507

✓

✓

✓

✓

✓

Qwen3-1.7B

qwen3-1.7b

✓

✓

✓

✓

✓

Qwen3-0.6B

qwen3-0.6b

✓

✓

✓

✓

✓

Qwen2.5-72B-Instruct

qwen2.5-72b-instruct

✓

✓

✓

✓

✓

Qwen2.5-32B-Instruct

qwen2.5-32b-instruct

✓

✓

✓

✓

✓

Qwen2.5-14B-Instruct

qwen2.5-14b-instruct

✓

✓

✓

✓

✓

Qwen2.5-7B-Instruct

qwen2.5-7b-instruct

✓

✓

✓

✓

✓

Qwen-Plus-Character-2025-11-06

qwen-plus-character-2025-11-06

×

✓

✓

✓

✓

Comprensión visual (Qwen-VL)

Servicio de modelo

Código de modelo

CPT Entrenamiento de parámetros completos

SFT Entrenamiento de parámetros completos

SFT Entrenamiento eficiente

DPO Entrenamiento de parámetros completos

DPO Entrenamiento eficiente

Qwen3-VL-8B-Instruct

qwen3-vl-8b-instruct

×

✓

✓

×

×

Qwen3-VL-8B-Thinking

qwen3-vl-8b-thinking

×

✓

✓

×

×

Qwen3-VL-4B-Instruct

qwen3-vl-4b-instruct

×

✓

✓

×

×

Qwen2.5-VL-72B-Instruct

qwen2.5-vl-72b-instruct

×

✓

✓

×

×

Qwen2.5-VL-32B-Instruct

qwen2.5-vl-32b-instruct

×

✓

✓

×

×

Qwen2.5-VL-7B-Instruct

qwen2.5-vl-7b-instruct

×

✓

✓

×

×

Comparación de métodos de ajuste

Función

CPT (Preentrenamiento continuo)

SFT (Ajuste fino supervisado)

DPO (Optimización directa de preferencias)

Resumen

Complementa el conocimiento (Inyecta conocimiento de dominio)

Aprende a realizar tareas (Sigue instrucciones)

Realiza mejor las tareas (Se alinea con las preferencias humanas)

Datos de entrada

Más de 10 millones de tokens

Texto de dominio no etiquetado

Más de 1,000 entradas

Pares de "pregunta-respuesta" de alta calidad

Más de 100 conjuntos

Pares de respuestas "mejor-peor" para la misma instrucción

Objetivo principal

Adaptación al dominio. Aprende vocabulario especializado y hechos.

Enseña al modelo formatos de conversación y capacidades de ejecución de tareas.

Hace que las salidas del modelo se alineen mejor con los valores y preferencias humanas.

Método de aprendizaje

Aprendizaje autosupervisado (Predice la siguiente palabra)

Aprendizaje supervisado (Imita la verdad fundamental)

Aprendizaje directo de preferencias (Aumenta la probabilidad de buenas respuestas y disminuye la probabilidad de malas respuestas)

Etapa del modelo

Generalmente antes de SFT

Después de CPT y antes de DPO

Generalmente después de SFT, como paso final para la alineación.

Comparación de patrones de entrenamiento

Entrenamiento de parámetros completos

Entrenamiento eficiente (LoRA, recomendado)

Escenarios

• El modelo necesita adquirir nuevas capacidades

• Lograr un rendimiento global óptimo.

• Optimizar el rendimiento del modelo para escenarios específicos.

• Para escenarios sensibles a los costos y al tiempo.

Tiempo de entrenamiento

Más largo, con una convergencia más lenta.

Más corto, con una convergencia más rápida.

Facturación

Método de facturación

Pago por uso basado en la cantidad de datos de entrenamiento

Fórmula de facturación

Tarifa de entrenamiento del modelo = (Total de tokens en datos de entrenamiento + Total de tokens en datos de entrenamiento mixtos) × Número de épocas × Precio unitario de entrenamiento (Unidad mínima de facturación: 1 token)

Puede ver la tarifa estimada de entrenamiento en la parte inferior de la consola de Model Fine-tuning y hacer clic en Billing Details para ver el número total de tokens de entrenamiento, el número de épocas y el precio unitario de entrenamiento.

Precio unitario de entrenamiento

La siguiente tabla enumera los precios unitarios de entrenamiento para modelos preconstruidos. El precio unitario de entrenamiento para un modelo personalizado es el mismo que el del modelo preconstruido correspondiente.

Singapore

Qwen

Servicio de modelo

Código de modelo

Precios

Qwen3.8-27B

qwen3.8-27b

$0.0075/Mil tokens

Qwen3.6-27B

qwen3.6-27b

$0.0075/Mil tokens

Qwen3.5-27B

qwen3.5-27b

$0.0075/Mil tokens

Qwen3.5-9B

qwen3.5-9b

$0.003/Mil tokens

Qwen3-14B

qwen3-14b

$0.0016/Mil tokens

Qwen-VL

Servicio de modelo

Código de modelo

Precio

-

-

-

Calcular tokens para imágenes y videos

Imágenes

Fórmula: Image Tokens = h_bar * w_bar / token_pixels + 2

  • h_bar, w_bar: La altura y el ancho de la imagen escalada. Antes de procesar una imagen, el modelo realiza un preprocesamiento para reducirla a un límite de píxeles específico. Este límite depende de los valores de los parámetros max_pixels y vl_high_resolution_images. Para obtener más información, consulte Procesar imágenes de alta resolución.

  • token_pixels: El valor de píxel correspondiente a cada token visual. Esto varía según el modelo:

    • qwen3.8-series,qwen3.7-series, qwen3.6-series, qwen3.5-series, Qwen3-VL, qwen-vl-max y qwen-vl-plus:Cada token corresponde a 32x32 píxeles.
    • QVQ y otros modelos Qwen2.5-VL:Cada token corresponde a 28x28 píxeles.

El siguiente código demuestra la lógica aproximada de escalado de imágenes utilizada por el modelo. Úselo para estimar los tokens de una imagen. Para la facturación real, consulte la respuesta de la API.

import math
from PIL import Image  # pip install Pillow

def smart_resize(image_path, max_pixels, vl_high_resolution_images):
    """Calculates the scaled dimensions of an image based on model parameters to estimate image tokens."""
    image = Image.open(image_path)
    height, width = image.height, image.width

    # The scaling factor is 32 for models such as Qwen3.6, Qwen3.5, and Qwen3-VL. For other models, it is 28.
    factor = 32
    h_bar = round(height / factor) * factor
    w_bar = round(width / factor) * factor

    # Token lower limit: 4 tokens
    min_pixels = 4 * factor * factor

    # If vl_high_resolution_images=True, the token upper limit is fixed at 16384, and max_pixels is ignored.
    if vl_high_resolution_images:
        max_pixels = 16384 * factor * factor

    # Constrains the total number of pixels to the range [min_pixels, max_pixels].
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = math.floor(height / beta / factor) * factor
        w_bar = math.floor(width / beta / factor) * factor
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = math.ceil(height * beta / factor) * factor
        w_bar = math.ceil(width * beta / factor) * factor

    return h_bar, w_bar

if __name__ == "__main__":
    # Note: The values of max_pixels and vl_high_resolution_images must match the parameters passed when calling the model.
    h_bar, w_bar = smart_resize("xxx/test.jpg", max_pixels=2560 * 32 * 32, vl_high_resolution_images=False)
    print(f"Scaled image dimensions: Height {h_bar}, Width {w_bar}")

    # Each image includes one <vision_bos> and one <vision_eos> token.
    token = int(h_bar * w_bar / (32 * 32)) + 2
    print(f"Number of image tokens: {token}")

Videos

  • Archivos de video:

    Al procesar un archivo de video, el modelo primero extrae fotogramas y luego calcula el número total de tokens para todos los fotogramas del video. Dado que este cálculo es complejo, puede utilizar el siguiente código para estimar el consumo total de tokens de un video proporcionando su ruta:

# Before use, install: pip install opencv-python
import math
import os
import logging
import cv2

logger = logging.getLogger(__name__)

FRAME_FACTOR = 2

# For models such as Qwen3.6, Qwen3.5, Qwen3-VL, qwen-vl-max-0813, qwen-vl-plus-0815, and qwen-vl-plus-0710, the image scaling factor is 32.
IMAGE_FACTOR = 32

# For other models, the image scaling factor is 28.
# IMAGE_FACTOR = 28

# Maximum aspect ratio for video frames
MAX_RATIO = 200
# Pixel lower limit for video frames
VIDEO_MIN_PIXELS = 4 * 32 * 32
# Pixel upper limit for video frames. For the Qwen3-VL-Plus model, VIDEO_MAX_PIXELS is 640 * 32 * 32. For other models, it is 768 * 32 * 32.
VIDEO_MAX_PIXELS = 640 * 32 * 32

# If the user does not pass the FPS parameter, the default value is used for fps.
FPS = 2.0
# Minimum number of extracted frames
FPS_MIN_FRAMES = 4
# Maximum number of extracted frames (set based on the selected model)
FPS_MAX_FRAMES = 2000

# Maximum pixel value for video input. For the Qwen3-VL-Plus model, set VIDEO_TOTAL_PIXELS to 131072 * 32 * 32. For other models, set it to 65536 * 32 * 32.
VIDEO_TOTAL_PIXELS = int(float(os.environ.get('VIDEO_TOTAL_PIXELS', 131072 * 32 * 32)))

def round_by_factor(number: int, factor: int) -> int:
    """Returns the integer closest to 'number' that is divisible by 'factor'."""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """Returns the smallest integer that is greater than or equal to 'number' and divisible by 'factor'."""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """Returns the largest integer that is less than or equal to 'number' and divisible by 'factor'."""
    return math.floor(number / factor) * factor

def extract_vision_info(conversations):
    vision_infos = []
    if isinstance(conversations[0], dict):
        conversations = [conversations]
    for conversation in conversations:
        for message in conversation:
            if isinstance(message["content"], list):
                for ele in message["content"]:
                    if (
                        "image" in ele
                        or "image_url" in ele
                        or "video" in ele
                        or ele.get("type","") in ("image", "image_url", "video")
                    ):
                        vision_infos.append(ele)
    return vision_infos

def smart_nframes(ele,total_frames,video_fps):
    """Calculates the number of extracted video frames.

    Args:
        ele (dict): A dictionary containing the video configuration.
            - fps: Controls the number of input frames extracted for the model.
        total_frames (int): The original total number of frames in the video.
        video_fps (int | float): The original frame rate of the video.

    Raises:
        An error is reported if nframes is not within the interval [FRAME_FACTOR, total_frames].

    Returns:
        The number of video frames for model input.
    """
    assert not ("fps" in ele and "nframes" in ele), "Only accept either `fps` or `nframes`"
    fps = ele.get("fps", FPS)
    min_frames = ceil_by_factor(ele.get("min_frames", FPS_MIN_FRAMES), FRAME_FACTOR)
    max_frames = floor_by_factor(ele.get("max_frames", min(FPS_MAX_FRAMES, total_frames)), FRAME_FACTOR)
    duration = total_frames / video_fps if video_fps != 0 else 0
    if duration-int(duration)>(1/fps):
        total_frames = math.ceil(duration * video_fps)
    else:
        total_frames = math.ceil(int(duration)*video_fps)
    nframes = total_frames / video_fps * fps
    if nframes > total_frames:
        logger.warning(f"smart_nframes: nframes[{nframes}] > total_frames[{total_frames}]")
    nframes = int(min(min(max(nframes, min_frames), max_frames), total_frames))
    if not (FRAME_FACTOR <= nframes and nframes <= total_frames):
        raise ValueError(f"nframes should in interval [{FRAME_FACTOR}, {total_frames}], but got {nframes}.")

    return nframes

def get_video(video_path):
    # Get video information
    cap = cv2.VideoCapture(video_path)

    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    # Get video height
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    video_fps = cap.get(cv2.CAP_PROP_FPS)
    return frame_height, frame_width, total_frames, video_fps

def smart_resize(ele, path, factor=IMAGE_FACTOR):
    # Get the original width and height of the video
    height, width, total_frames, video_fps = get_video(path)
    # Token lower limit for video frames
    min_pixels = VIDEO_MIN_PIXELS
    total_pixels = VIDEO_TOTAL_PIXELS
    # Number of extracted video frames
    nframes = smart_nframes(ele, total_frames, video_fps)
    max_pixels = max(min(VIDEO_MAX_PIXELS, total_pixels / nframes * FRAME_FACTOR),int(min_pixels * 1.05))

    # The aspect ratio of the video should not exceed 200:1 or 1:200.
    if max(height, width) / min(height, width) > MAX_RATIO:
        raise ValueError(
            f"absolute aspect ratio must be smaller than {MAX_RATIO}, got {max(height, width) / min(height, width)}"
        )

    h_bar = max(factor, round_by_factor(height, factor))
    w_bar = max(factor, round_by_factor(width, factor))
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = floor_by_factor(height / beta, factor)
        w_bar = floor_by_factor(width / beta, factor)
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = ceil_by_factor(height * beta, factor)
        w_bar = ceil_by_factor(width * beta, factor)
    return h_bar, w_bar

def token_calculate(video_path, fps):
    # Pass the video path and the fps frame extraction parameter.
    messages = [{"content": [{"video": video_path, "fps": fps}]}]
    vision_infos = extract_vision_info(messages)[0]

    resized_height, resized_width = smart_resize(vision_infos, video_path)

    height, width, total_frames, video_fps = get_video(video_path)
    num_frames = smart_nframes(vision_infos, total_frames, video_fps)
    print(f"Original video dimensions: {height}*{width}, Model input dimensions: {resized_height}*{resized_width}, Total video frames: {total_frames}, Total frames extracted when fps is {fps}: {num_frames}", end=", ")
    video_token = int(math.ceil(num_frames / 2) * resized_height / 32 * resized_width / 32)
    video_token += 2   # The system automatically adds <|vision_bos|> and <|vision_eos|> visual markers (1 token each).
    return video_token

video_token = token_calculate("xxx/test.mp4", 1)
print("Video tokens:", video_token)
  • Lista de imágenes:

    Cuando un video se pasa como una lista de imágenes, significa que la extracción de fotogramas ya se ha realizado. Utilice el siguiente código para calcular el consumo de tokens proporcionando la ruta y el número de imágenes:

# Before use, install: pip install Pillow
import math
import os
import logging
from typing import Tuple
from PIL import Image

logger = logging.getLogger(__name__)

# ==================== Constant Definitions ====================
FRAME_FACTOR = 2
# For models such as Qwen3-VL, qwen-vl-max-0813, qwen-vl-plus-0815, and qwen-vl-plus-0710, the scaling factor is 32.
IMAGE_FACTOR = 32

# For other models, the scaling factor is 28.
# IMAGE_FACTOR = 28

# Constants for token calculation
TOKEN_DIVISOR = 32  # Divisor for token calculation
VISION_SPECIAL_TOKENS = 2  # <|vision_bos|> and <|vision_eos|> markers

# Maximum aspect ratio for video frames
MAX_RATIO = 200
# Pixel lower limit for video frames
VIDEO_MIN_PIXELS = 4 * 32 * 32
# Pixel upper limit for video frames. For the Qwen3-VL-Plus model, VIDEO_MAX_PIXELS is 640 * 32 * 32. For other models, it is 768 * 32 * 32.
VIDEO_MAX_PIXELS = 640 * 32 * 32

# Maximum pixel value for video input. For the Qwen3-VL-Plus model, set VIDEO_TOTAL_PIXELS to 131072 * 32 * 32. For other models, set it to 65536 * 32 * 32.
VIDEO_TOTAL_PIXELS = int(float(os.environ.get('VIDEO_TOTAL_PIXELS', 131072 * 32 * 32)))

def round_by_factor(number: int, factor: int) -> int:
    """Returns the integer closest to 'number' that is divisible by 'factor'."""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """Returns the smallest integer that is greater than or equal to 'number' and divisible by 'factor'."""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """Returns the largest integer that is less than or equal to 'number' and divisible by 'factor'."""
    return math.floor(number / factor) * factor

def get_image_size(image_path: str) -> Tuple[int, int]:
    if not os.path.exists(image_path):
        raise FileNotFoundError(f"Image file not found: {image_path}")

    try:
        image = Image.open(image_path)
        height = image.height
        width = image.width
        image.close()  # Close the file promptly
        return height, width
    except Exception as e:
        raise ValueError(f"Cannot read image file {image_path}: {str(e)}")

def smart_resize(height: int, width: int, nframes: int, factor: int = IMAGE_FACTOR) -> Tuple[int, int]:
    """
    Calculates the scaled dimensions of an image

    Args:
        height: Original image height
        width: Original image width
        nframes: Number of video frames
        factor: Scaling factor, defaults to IMAGE_FACTOR

    Returns:
        (resized_height, resized_width) The scaled height and width

    Raises:
        ValueError: Aspect ratio exceeds the limit
    """
    # Token lower limit for video frames
    min_pixels = VIDEO_MIN_PIXELS
    total_pixels = VIDEO_TOTAL_PIXELS
    # Number of extracted video frames
    max_pixels = max(min(VIDEO_MAX_PIXELS, total_pixels / nframes * FRAME_FACTOR), int(min_pixels * 1.05))

    # The aspect ratio of the video should not exceed 200:1 or 1:200.
    aspect_ratio = max(height, width) / min(height, width)
    if aspect_ratio > MAX_RATIO:
        raise ValueError(
            f"Image aspect ratio must be less than {MAX_RATIO}:1, but is currently {aspect_ratio:.2f}:1"
        )

    h_bar = max(factor, round_by_factor(height, factor))
    w_bar = max(factor, round_by_factor(width, factor))
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = floor_by_factor(height / beta, factor)
        w_bar = floor_by_factor(width / beta, factor)
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = ceil_by_factor(height * beta, factor)
        w_bar = ceil_by_factor(width * beta, factor)
    return h_bar, w_bar

def calculate_video_tokens(image_path: str, nframes: int = 1, factor: int = IMAGE_FACTOR, verbose: bool = True) -> int:
    """

    Args:
        image_path: Path to the video frame file
        nframes: Number of video frames,
        factor: Scaling factor, defaults to IMAGE_FACTOR
        verbose: Whether to print detailed information

    Returns:
        The number of tokens consumed

    Raises:
        FileNotFoundError: The file does not exist
        ValueError: The file format is invalid or the aspect ratio exceeds the limit
    """
    # Get the original image dimensions (read only once)
    height, width = get_image_size(image_path)

    # Calculate the scaled dimensions
    resized_height, resized_width = smart_resize(height, width, nframes, factor)

    # Calculate the number of tokens
    # Formula: ceil(nframes/2) * (height/TOKEN_DIVISOR) * (width/TOKEN_DIVISOR) + VISION_SPECIAL_TOKENS
    video_token = int(
        math.ceil(nframes / 2) *
        (resized_height / TOKEN_DIVISOR) *
        (resized_width / TOKEN_DIVISOR)
    )
    # Add visual marker tokens (<|vision_bos|> and <|vision_eos|>)
    video_token += VISION_SPECIAL_TOKENS

    if verbose:
        print(f"Original video frame dimensions: {height}x{width}, Model input dimensions: {resized_height}x{resized_width}, ", end="")

    return video_token

if __name__ == "__main__":
    try:
        video_token = calculate_video_tokens("xxx/test.jpg", nframes=30)
        print(f"Video tokens: {video_token}\n")
    except Exception as e:
        print(f"Error: {str(e)}\n")

Norte de China 2 (Beijing)

Qwen

Servicio de modelo

Código de modelo

Precio

Qwen3.8-27B

qwen3.8-27b

$0.007067/Mil tokens

Qwen3.7-Plus-2026-05-26

qwen3.7-plus-2026-05-26

$0.048132/Mil tokens

Qwen3.6-27B

qwen3.6-27b

$0.006876/Mil tokens

Qwen3.6-Flash-2026-04-16

qwen3.6-flash-2026-04-16

$0.006876/Mil tokens

Qwen3.6-Plus-2026-04-02

qwen3.6-plus-2026-04-02

$0.041256/Mil tokens

Qwen3.5-27B

qwen3.5-27b

$0.006876/Mil tokens

Qwen3.5-9B

qwen3.5-9b

$0.00275/Mil tokens

Qwen3.5-4B

qwen3.5-4b

$0.00212/Mil tokens

Qwen3.5-Flash-2026-02-23

qwen3.5-flash-2026-02-23

$0.006876/Mil tokens

Qwen3.5-Plus-2026-02-15

qwen3.5-plus-2026-02-15

$0.041256/Mil tokens

Qwen3-32B

qwen3-32b

$0.005501/Mil tokens

Qwen3-30B-A3B-Instruct-2507

qwen3-30b-a3b-instruct-2507

$0.004126/Mil tokens

Qwen3-14B

qwen3-14b

$0.004126/Mil tokens

Qwen3-8B

qwen3-8b

$0.000825/Mil tokens

Qwen3-4B-Instruct-2507

qwen3-4b-instruct-2507

$0.000825/Mil tokens

Qwen3-1.7B

qwen3-1.7b

$0.000619/Mil tokens

Qwen3-0.6B

qwen3-0.6b

$0.000413/Mil tokens

Qwen2.5-72B-Instruct

qwen2.5-72b-instruct

$0.020628/Mil tokens

Qwen2.5-32B-Instruct

qwen2.5-32b-instruct

$0.004126/Mil tokens

Qwen2.5-14B-Instruct

qwen2.5-14b-instruct

$0.004126/Mil tokens

Qwen2.5-7B-Instruct

qwen2.5-7b-instruct

$0.000825/Mil tokens

Qwen-Plus-Character-2025-11-06

qwen-plus-character-2025-11-06

$0.020628/Mil tokens

Qwen-VL

Servicio de modelo

Código de modelo

Precio

Qwen3-VL-8B-Instruct

qwen3-vl-8b-instruct

$0.00165/Mil tokens

Qwen3-VL-8B-Thinking

qwen3-vl-8b-thinking

$0.00165/Mil tokens

Qwen3-VL-4B-Instruct

qwen3-vl-4b-instruct

$0.000825/Mil tokens

Qwen2.5-VL-72B-Instruct

qwen2.5-vl-72b-instruct

$0.006876/Mil tokens

Qwen2.5-VL-32B-Instruct

qwen2.5-vl-32b-instruct

$0.00275/Mil tokens

Qwen2.5-VL-7B-Instruct

qwen2.5-vl-7b-instruct

$0.001375/Mil tokens

Calcular tokens para imágenes y videos

Imágenes

Fórmula: Image Tokens = h_bar * w_bar / token_pixels + 2

  • h_bar, w_bar: La altura y el ancho de la imagen escalada. Antes de procesar una imagen, el modelo realiza un preprocesamiento para reducirla a un límite de píxeles específico. Este límite depende de los valores de los parámetros max_pixels y vl_high_resolution_images. Para obtener más información, consulte Procesar imágenes de alta resolución.

  • token_pixels: El valor de píxel correspondiente a cada token visual. Esto varía según el modelo:

    • qwen3.8-series,qwen3.7-series, qwen3.6-series, qwen3.5-series, Qwen3-VL, qwen-vl-max y qwen-vl-plus:Cada token corresponde a 32x32 píxeles.
    • QVQ y otros modelos Qwen2.5-VL:Cada token corresponde a 28x28 píxeles.

El siguiente código demuestra la lógica aproximada de escalado de imágenes utilizada por el modelo. Úselo para estimar los tokens de una imagen. Para la facturación real, consulte la respuesta de la API.

import math
from PIL import Image  # pip install Pillow

def smart_resize(image_path, max_pixels, vl_high_resolution_images):
    """Calculates the scaled dimensions of an image based on model parameters to estimate image tokens."""
    image = Image.open(image_path)
    height, width = image.height, image.width

    # The scaling factor is 32 for models such as Qwen3.6, Qwen3.5, and Qwen3-VL. For other models, it is 28.
    factor = 32
    h_bar = round(height / factor) * factor
    w_bar = round(width / factor) * factor

    # Token lower limit: 4 tokens
    min_pixels = 4 * factor * factor

    # If vl_high_resolution_images=True, the token upper limit is fixed at 16384, and max_pixels is ignored.
    if vl_high_resolution_images:
        max_pixels = 16384 * factor * factor

    # Constrains the total number of pixels to the range [min_pixels, max_pixels].
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = math.floor(height / beta / factor) * factor
        w_bar = math.floor(width / beta / factor) * factor
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = math.ceil(height * beta / factor) * factor
        w_bar = math.ceil(width * beta / factor) * factor

    return h_bar, w_bar

if __name__ == "__main__":
    # Note: The values of max_pixels and vl_high_resolution_images must match the parameters passed when calling the model.
    h_bar, w_bar = smart_resize("xxx/test.jpg", max_pixels=2560 * 32 * 32, vl_high_resolution_images=False)
    print(f"Scaled image dimensions: Height {h_bar}, Width {w_bar}")

    # Each image includes one <vision_bos> and one <vision_eos> token.
    token = int(h_bar * w_bar / (32 * 32)) + 2
    print(f"Number of image tokens: {token}")

Videos

  • Archivos de video:

    Al procesar un archivo de video, el modelo primero extrae fotogramas y luego calcula el número total de tokens para todos los fotogramas del video. Dado que este cálculo es complejo, puede utilizar el siguiente código para estimar el consumo total de tokens de un video proporcionando su ruta:

# Before use, install: pip install opencv-python
import math
import os
import logging
import cv2

logger = logging.getLogger(__name__)

FRAME_FACTOR = 2

# For models such as Qwen3.6, Qwen3.5, Qwen3-VL, qwen-vl-max-0813, qwen-vl-plus-0815, and qwen-vl-plus-0710, the image scaling factor is 32.
IMAGE_FACTOR = 32

# For other models, the image scaling factor is 28.
# IMAGE_FACTOR = 28

# Maximum aspect ratio for video frames
MAX_RATIO = 200
# Pixel lower limit for video frames
VIDEO_MIN_PIXELS = 4 * 32 * 32
# Pixel upper limit for video frames. For the Qwen3-VL-Plus model, VIDEO_MAX_PIXELS is 640 * 32 * 32. For other models, it is 768 * 32 * 32.
VIDEO_MAX_PIXELS = 640 * 32 * 32

# If the user does not pass the FPS parameter, the default value is used for fps.
FPS = 2.0
# Minimum number of extracted frames
FPS_MIN_FRAMES = 4
# Maximum number of extracted frames (set based on the selected model)
FPS_MAX_FRAMES = 2000

# Maximum pixel value for video input. For the Qwen3-VL-Plus model, set VIDEO_TOTAL_PIXELS to 131072 * 32 * 32. For other models, set it to 65536 * 32 * 32.
VIDEO_TOTAL_PIXELS = int(float(os.environ.get('VIDEO_TOTAL_PIXELS', 131072 * 32 * 32)))

def round_by_factor(number: int, factor: int) -> int:
    """Returns the integer closest to 'number' that is divisible by 'factor'."""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """Returns the smallest integer that is greater than or equal to 'number' and divisible by 'factor'."""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """Returns the largest integer that is less than or equal to 'number' and divisible by 'factor'."""
    return math.floor(number / factor) * factor

def extract_vision_info(conversations):
    vision_infos = []
    if isinstance(conversations[0], dict):
        conversations = [conversations]
    for conversation in conversations:
        for message in conversation:
            if isinstance(message["content"], list):
                for ele in message["content"]:
                    if (
                        "image" in ele
                        or "image_url" in ele
                        or "video" in ele
                        or ele.get("type","") in ("image", "image_url", "video")
                    ):
                        vision_infos.append(ele)
    return vision_infos

def smart_nframes(ele,total_frames,video_fps):
    """Calculates the number of extracted video frames.

    Args:
        ele (dict): A dictionary containing the video configuration.
            - fps: Controls the number of input frames extracted for the model.
        total_frames (int): The original total number of frames in the video.
        video_fps (int | float): The original frame rate of the video.

    Raises:
        An error is reported if nframes is not within the interval [FRAME_FACTOR, total_frames].

    Returns:
        The number of video frames for model input.
    """
    assert not ("fps" in ele and "nframes" in ele), "Only accept either `fps` or `nframes`"
    fps = ele.get("fps", FPS)
    min_frames = ceil_by_factor(ele.get("min_frames", FPS_MIN_FRAMES), FRAME_FACTOR)
    max_frames = floor_by_factor(ele.get("max_frames", min(FPS_MAX_FRAMES, total_frames)), FRAME_FACTOR)
    duration = total_frames / video_fps if video_fps != 0 else 0
    if duration-int(duration)>(1/fps):
        total_frames = math.ceil(duration * video_fps)
    else:
        total_frames = math.ceil(int(duration)*video_fps)
    nframes = total_frames / video_fps * fps
    if nframes > total_frames:
        logger.warning(f"smart_nframes: nframes[{nframes}] > total_frames[{total_frames}]")
    nframes = int(min(min(max(nframes, min_frames), max_frames), total_frames))
    if not (FRAME_FACTOR <= nframes and nframes <= total_frames):
        raise ValueError(f"nframes should in interval [{FRAME_FACTOR}, {total_frames}], but got {nframes}.")

    return nframes

def get_video(video_path):
    # Get video information
    cap = cv2.VideoCapture(video_path)

    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    # Get video height
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    video_fps = cap.get(cv2.CAP_PROP_FPS)
    return frame_height, frame_width, total_frames, video_fps

def smart_resize(ele, path, factor=IMAGE_FACTOR):
    # Get the original width and height of the video
    height, width, total_frames, video_fps = get_video(path)
    # Token lower limit for video frames
    min_pixels = VIDEO_MIN_PIXELS
    total_pixels = VIDEO_TOTAL_PIXELS
    # Number of extracted video frames
    nframes = smart_nframes(ele, total_frames, video_fps)
    max_pixels = max(min(VIDEO_MAX_PIXELS, total_pixels / nframes * FRAME_FACTOR),int(min_pixels * 1.05))

    # The aspect ratio of the video should not exceed 200:1 or 1:200.
    if max(height, width) / min(height, width) > MAX_RATIO:
        raise ValueError(
            f"absolute aspect ratio must be smaller than {MAX_RATIO}, got {max(height, width) / min(height, width)}"
        )

    h_bar = max(factor, round_by_factor(height, factor))
    w_bar = max(factor, round_by_factor(width, factor))
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = floor_by_factor(height / beta, factor)
        w_bar = floor_by_factor(width / beta, factor)
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = ceil_by_factor(height * beta, factor)
        w_bar = ceil_by_factor(width * beta, factor)
    return h_bar, w_bar

def token_calculate(video_path, fps):
    # Pass the video path and the fps frame extraction parameter.
    messages = [{"content": [{"video": video_path, "fps": fps}]}]
    vision_infos = extract_vision_info(messages)[0]

    resized_height, resized_width = smart_resize(vision_infos, video_path)

    height, width, total_frames, video_fps = get_video(video_path)
    num_frames = smart_nframes(vision_infos, total_frames, video_fps)
    print(f"Original video dimensions: {height}*{width}, Model input dimensions: {resized_height}*{resized_width}, Total video frames: {total_frames}, Total frames extracted when fps is {fps}: {num_frames}", end=", ")
    video_token = int(math.ceil(num_frames / 2) * resized_height / 32 * resized_width / 32)
    video_token += 2   # The system automatically adds <|vision_bos|> and <|vision_eos|> visual markers (1 token each).
    return video_token

video_token = token_calculate("xxx/test.mp4", 1)
print("Video tokens:", video_token)
  • Lista de imágenes:

    Cuando un video se pasa como una lista de imágenes, significa que la extracción de fotogramas ya se ha realizado. Utilice el siguiente código para calcular el consumo de tokens proporcionando la ruta y el número de imágenes:

# Before use, install: pip install Pillow
import math
import os
import logging
from typing import Tuple
from PIL import Image

logger = logging.getLogger(__name__)

# ==================== Constant Definitions ====================
FRAME_FACTOR = 2
# For models such as Qwen3-VL, qwen-vl-max-0813, qwen-vl-plus-0815, and qwen-vl-plus-0710, the scaling factor is 32.
IMAGE_FACTOR = 32

# For other models, the scaling factor is 28.
# IMAGE_FACTOR = 28

# Constants for token calculation
TOKEN_DIVISOR = 32  # Divisor for token calculation
VISION_SPECIAL_TOKENS = 2  # <|vision_bos|> and <|vision_eos|> markers

# Maximum aspect ratio for video frames
MAX_RATIO = 200
# Pixel lower limit for video frames
VIDEO_MIN_PIXELS = 4 * 32 * 32
# Pixel upper limit for video frames. For the Qwen3-VL-Plus model, VIDEO_MAX_PIXELS is 640 * 32 * 32. For other models, it is 768 * 32 * 32.
VIDEO_MAX_PIXELS = 640 * 32 * 32

# Maximum pixel value for video input. For the Qwen3-VL-Plus model, set VIDEO_TOTAL_PIXELS to 131072 * 32 * 32. For other models, set it to 65536 * 32 * 32.
VIDEO_TOTAL_PIXELS = int(float(os.environ.get('VIDEO_TOTAL_PIXELS', 131072 * 32 * 32)))

def round_by_factor(number: int, factor: int) -> int:
    """Returns the integer closest to 'number' that is divisible by 'factor'."""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """Returns the smallest integer that is greater than or equal to 'number' and divisible by 'factor'."""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """Returns the largest integer that is less than or equal to 'number' and divisible by 'factor'."""
    return math.floor(number / factor) * factor

def get_image_size(image_path: str) -> Tuple[int, int]:
    if not os.path.exists(image_path):
        raise FileNotFoundError(f"Image file not found: {image_path}")

    try:
        image = Image.open(image_path)
        height = image.height
        width = image.width
        image.close()  # Close the file promptly
        return height, width
    except Exception as e:
        raise ValueError(f"Cannot read image file {image_path}: {str(e)}")

def smart_resize(height: int, width: int, nframes: int, factor: int = IMAGE_FACTOR) -> Tuple[int, int]:
    """
    Calculates the scaled dimensions of an image

    Args:
        height: Original image height
        width: Original image width
        nframes: Number of video frames
        factor: Scaling factor, defaults to IMAGE_FACTOR

    Returns:
        (resized_height, resized_width) The scaled height and width

    Raises:
        ValueError: Aspect ratio exceeds the limit
    """
    # Token lower limit for video frames
    min_pixels = VIDEO_MIN_PIXELS
    total_pixels = VIDEO_TOTAL_PIXELS
    # Number of extracted video frames
    max_pixels = max(min(VIDEO_MAX_PIXELS, total_pixels / nframes * FRAME_FACTOR), int(min_pixels * 1.05))

    # The aspect ratio of the video should not exceed 200:1 or 1:200.
    aspect_ratio = max(height, width) / min(height, width)
    if aspect_ratio > MAX_RATIO:
        raise ValueError(
            f"Image aspect ratio must be less than {MAX_RATIO}:1, but is currently {aspect_ratio:.2f}:1"
        )

    h_bar = max(factor, round_by_factor(height, factor))
    w_bar = max(factor, round_by_factor(width, factor))
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = floor_by_factor(height / beta, factor)
        w_bar = floor_by_factor(width / beta, factor)
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = ceil_by_factor(height * beta, factor)
        w_bar = ceil_by_factor(width * beta, factor)
    return h_bar, w_bar

def calculate_video_tokens(image_path: str, nframes: int = 1, factor: int = IMAGE_FACTOR, verbose: bool = True) -> int:
    """

    Args:
        image_path: Path to the video frame file
        nframes: Number of video frames,
        factor: Scaling factor, defaults to IMAGE_FACTOR
        verbose: Whether to print detailed information

    Returns:
        The number of tokens consumed

    Raises:
        FileNotFoundError: The file does not exist
        ValueError: The file format is invalid or the aspect ratio exceeds the limit
    """
    # Get the original image dimensions (read only once)
    height, width = get_image_size(image_path)

    # Calculate the scaled dimensions
    resized_height, resized_width = smart_resize(height, width, nframes, factor)

    # Calculate the number of tokens
    # Formula: ceil(nframes/2) * (height/TOKEN_DIVISOR) * (width/TOKEN_DIVISOR) + VISION_SPECIAL_TOKENS
    video_token = int(
        math.ceil(nframes / 2) *
        (resized_height / TOKEN_DIVISOR) *
        (resized_width / TOKEN_DIVISOR)
    )
    # Add visual marker tokens (<|vision_bos|> and <|vision_eos|>)
    video_token += VISION_SPECIAL_TOKENS

    if verbose:
        print(f"Original video frame dimensions: {height}x{width}, Model input dimensions: {resized_height}x{resized_width}, ", end="")

    return video_token

if __name__ == "__main__":
    try:
        video_token = calculate_video_tokens("xxx/test.jpg", nframes=30)
        print(f"Video tokens: {video_token}\n")
    except Exception as e:
        print(f"Error: {str(e)}\n")

Antes de ajustar finamente un modelo

  • Aunque el ajuste fino de modelos de generación de texto puede lograr excelentes resultados en escenarios comerciales específicos, tiene las siguientes limitaciones:

    • Consumo de tiempo: Esto incluye la creación de un conjunto de datos CPT a gran escala (al menos 50 millones de tokens), la construcción de un conjunto de datos SFT efectivo (1,000+ entradas), la recopilación de suficientes casos erróneos (100+) para construir un conjunto de datos DPO efectivo, y la lentitud de las iteraciones de optimización del modelo.
    • Alto costo: Un modelo ajustado solo se puede utilizar después de su implementación, y la facturación de implementación del modelo es elevada.
  • Alibaba Cloud Model Studio recomienda que primero intente utilizar Ingeniería de Prompts o Llamada a Funciones para personalizar su aplicación. El ajuste fino del modelo suele ser el "último recurso" para mejorar el rendimiento del modelo. Esto se debe a que:

    1. En muchas tareas, un modelo puede tener inicialmente un rendimiento deficiente, pero aplicar las técnicas de prompt correctas puede mejorar los resultados sin necesidad de ajustar el modelo.
    2. Optimizar iterativamente los prompts y los complementos es más ágil y rentable que las iteraciones de ajuste fino del modelo, ya que el ajuste fino puede requerir volver a recopilar, limpiar y optimizar datos, recolectar casos erróneos y realizar encuestas a clientes.
    3. Incluso si finalmente decide realizar el ajuste fino del modelo, el trabajo inicial en ingeniería de prompts y optimización de complementos no se desperdiciará. Este trabajo preliminar se puede reutilizar completamente al construir el conjunto de datos de ajuste fino.

Introducción

Ajustar finamente un modelo mediante la consola

  1. Inicie sesión en la consola de Model Studio. En el panel de navegación izquierdo, elija Model Training > Model Fine-tuning y luego haga clic en Create Training Task.

    Crear tarea de entrenamiento
  2. En la sección Training Configuration, complete la siguiente configuración:

    • Método de entrenamiento: Seleccione Supervised Fine-tuning (SFT).
    • Seleccionar un modelo: Seleccione Qwen3-8B.
    • Método de entrenamiento (se muestra después de seleccionar un modelo): Seleccione Efficient Training.

    Esta combinación requiere poco tiempo de entrenamiento y pocos registros de datos.

  3. En la sección Configuración de hiperparámetros, mantenga las Configuraciones de parámetros predeterminadas. Model Studio proporciona configuraciones recomendadas para los hiperparámetros de ajuste fino.

  4. En la sección Data Configuration, complete la siguiente configuración:

    • Conjunto de entrenamiento: Seleccione un conjunto de datos de ajuste fino cargado. Muestra de datos: SFT-ChatML_format_example.jsonl.
    • Entrenamiento mixto: Manténgalo desactivado.
    • Validation Set: Seleccione Automatic Split para dividir 10% del conjunto de entrenamiento como conjunto de validación.
    Configuración de datos
  5. En la sección Salida de entrenamiento, configure cómo se guardan las instantáneas de parámetros del modelo (puntos de control). Mantenga los valores predeterminados para las siguientes configuraciones:

    • Nombre del modelo: Una vez completado el entrenamiento, el último punto de control se publica automáticamente en My Models con este nombre.
    • Hasta: Establece el número de modelos que exporta finalmente la tarea de entrenamiento.
    • Intervalo de guardado de puntos de control: Puede seleccionar Calculated by epoch o Calculated by step.
    Salida de entrenamiento

    NotaUna vez completado el ajuste fino, debe exportar una instantánea de parámetros antes de poder implementar el modelo en Model Studio basándose en dicha instantánea. Las instantáneas de parámetros exportadas se guardan en almacenamiento en la nube y no se pueden acceder ni descargar.

  6. Haga clic en Start Training y espere a que finalice el entrenamiento del modelo.

  7. Elija Model Inference > Dedicated Deployment para implementar el modelo personalizado entrenado. Una vez completada la implementación, puede evaluar el modelo ajustado. Para obtener más información, consulte Introducción a la implementación dedicada.

Proceso típico de ajuste fino

Los tres métodos de ajuste fino proporcionados por Model Studio no son mutuamente excluyentes, sino progresivos y complementarios.

CPT (optional) → SFT → DPO (optional)

  1. CPT (preentrenamiento continuo): Complementa el conocimiento (los modelos generales tienen un conocimiento amplio pero superficial, que podría no cumplir con los requisitos de profundidad y precisión de los campos profesionales).

    • Modelo financiero: Learns financial terms
    • Modelo médico: Memorizes drug pathology
    • Modelo legal: Understands legal articles and precedents
  2. SFT (ajuste fino supervisado) - Aprende cómo realizar tareas

    • Bot de servicio al cliente: Learns customer service procedures
    • Asistente de código: Learns programming paradigms
    • Llamada a herramientas (Agente): Learns to use MCP
  3. DPO (optimización directa de preferencias) - Realiza tareas mejor

    • Seguridad y responsabilidad: Rejects harmful suggestions
    • Concisión y eficacia: Provides concise answers
    • Objetividad y neutralidad: Evaluates fairly and objectively

Formato de datos de ajuste fino

Conjunto de entrenamiento SFT

Los datos de entrenamiento en formato SFT ChatML (Chat Markup Language) admiten conversaciones de múltiples turnos y varias configuraciones de roles.

Los parámetros name y weight de OpenAI no son compatibles. Se entrenarán todas las salidas del asistente.

# A single line of training data (in JSON format) has the following typical structure when expanded:
{"messages": [
  {"role": "system", "content": "System input 1"},
  {"role": "user", "content": "User input 1"},
  {"role": "assistant", "content": "Expected model output 1"},
  {"role": "user", "content": "User input 2"},
  {"role": "assistant", "content": "Expected model output 2"}
  ...
]}

Para obtener información sobre las diferencias entre system, user y assistant, consulte Descripción general. Conjuntos de datos de entrenamiento de ejemplo: SFT-ChatML_format_example.jsonl, SFT-ChatML_format_example.xlsx. Los formatos XLS y XLSX solo admiten conversaciones de un solo turno.

Todas las líneas del asistente en una sola entrada de datos de entrenamiento admiten el parámetro "loss_weight", que establece la importancia relativa de esa línea durante el entrenamiento. (Rango: de 0.0 a 1.0. Un valor mayor indica mayor importancia.)

Este parámetro está disponible en vista previa por invitación. Para utilizarlo, póngase en contacto con su gerente de cuenta.

 {"role": "assistant", "content": "Expected model output 1", "loss_weight": 1.0},
 {"role": "assistant", "content": "Expected model output 2", "loss_weight": 0.5}

Consejos para la creación de conjuntos de datos

Requisitos de tamaño del conjunto de datos

Para CPT, el conjunto de datos requiere al menos 50 millones de tokens de datos de preentrenamiento de alta calidad. Para SFT, el conjunto de datos requiere al menos 1,000 entradas de datos de ajuste fino de alta calidad. Para DPO, el conjunto de datos generalmente requiere cientos de entradas de datos de preferencia humana. Si los resultados de la evaluación del modelo después del ajuste fino de datos no son satisfactorios, la forma más sencilla de mejorar es recopilar más datos para el entrenamiento.

Si carece de datos, recomendamos construir una aplicación de agente y utilizar un índice de base de conocimientos para mejorar las capacidades del modelo. En muchos escenarios empresariales complejos, también puede utilizar una combinación de ajuste fino del modelo y recuperación de base de conocimientos.

Por ejemplo, en un escenario de atención al cliente, puede utilizar el ajuste fino del modelo para abordar problemas relacionados con el tono, los estilos de expresión y la autoconciencia del agente de servicio al cliente. El conocimiento profesional relacionado con el escenario se puede introducir dinámicamente en el contexto del modelo mediante una base de conocimientos.

Alibaba Cloud Model Studio recomienda que primero construya y pruebe una aplicación de generación aumentada por recuperación (RAG). Después de recopilar suficientes datos de la aplicación, puede utilizar el ajuste fino del modelo para mejorar aún más su rendimiento.

También puede utilizar las siguientes estrategias para ampliar su conjunto de datos:

  1. Utilice un modelo de lenguaje grande (LLM) para simular la generación de contenido para escenarios empresariales específicos y ayudarle a generar más datos para el ajuste fino. (Recomendamos seleccionar un modelo más grande y de alto rendimiento para la generación.)
  2. Adquiera más datos a través de diversos métodos, como la recopilación desde escenarios de aplicación, rastreo web, redes sociales y foros en línea, conjuntos de datos públicos, socios y recursos de la industria, y contribuciones de usuarios.

Diversidad y equilibrio de datos

Los requisitos para el ajuste fino del modelo varían según el escenario. Por ejemplo, la especialización es crítica para escenarios empresariales específicos, mientras que la versatilidad es más importante para escenarios de preguntas y respuestas. Debe diseñar casos de uso de datos basándose en los módulos empresariales o escenarios de uso de los que el modelo es responsable. Por lo tanto, la eficacia del entrenamiento depende no solo del volumen de datos, sino también de la especialización y diversidad de los datos para el escenario específico.

Por ejemplo, en un escenario de conversación inteligente con IA, un conjunto de datos profesional y diverso debe incluir los siguientes escenarios empresariales:

Negocio específico

Escenarios/negocios diversos

Servicio al cliente de comercio electrónico

Envío de promociones, consulta preventa, orientación durante la venta, servicio posventa, seguimiento posventa, gestión de quejas, etc.

Servicios financieros

Consulta de préstamos, asesoramiento en inversiones y gestión patrimonial, servicios de tarjetas de crédito, gestión de cuentas bancarias, etc.

Atención médica en línea

Consulta de síntomas, registro de citas, instrucciones de visita, consulta de información sobre medicamentos, consejos de salud, etc.

Secretario de IA

Información de TI, información administrativa, información de recursos humanos, consultas sobre beneficios para empleados, consultas del calendario de la empresa, etc.

Asistente de viajes

Planificación de viajes, guías de entrada y salida, consulta de seguros de viaje, introducciones a las costumbres y cultura del destino, etc.

Asesor legal corporativo

Revisión de contratos, protección de propiedad intelectual, verificaciones de cumplimiento, preguntas y respuestas sobre derecho laboral, consulta de transacciones transfronterizas, análisis legal de casos individuales, etc.

También es importante tener en cuenta que la cantidad de datos para cada escenario o negocio debe ser relativamente equilibrada, y la proporción de datos debe coincidir con la proporción real del escenario. Esto evita tener demasiados datos de un solo tipo, lo cual podría causar que el modelo se sesgue hacia el aprendizaje de esas características y afecte su capacidad de generalización.

División de los conjuntos de entrenamiento y validación

Puede realizar el ajuste fino del modelo en la consola.

  • Dividir automáticamente un conjunto de datos de entrenamiento completo y muestrear aleatoriamente una pequeña cantidad de datos para formar un conjunto de validación.
  • Elija cargar un conjunto de datos por separado.

La consola muestra la pérdida del conjunto de validación y la precisión de tokens en tiempo real durante el entrenamiento.

La página Configuración de datos también incluye un interruptor de Entrenamiento mixto (desactivado por defecto). Cuando se selecciona División automática, 10% del conjunto de entrenamiento se divide aleatoriamente como conjunto de validación por defecto.

FAQ

¿Puedo ajustar finamente mi propio modelo?

Model Studio no admite el ajuste fino, la carga de sus propios modelos ni la exportación de modelos descargados.