Tous les produits
Search
Centre de documentation

Alibaba Cloud Model Studio:Introduction to model fine-tuning

Dernière mise à jour :Oct 11, 2026

Si les performances d'un modèle ne répondent pas à vos attentes après l'application de méthodes d'optimisation telles que le prompt engineering ou les appels de plugins, vous pouvez recourir au fine-tuning de modèle dans Alibaba Cloud Model Studio. Stratégie centrale pour améliorer les performances, le fine-tuning renforce considérablement les capacités d'un modèle dans des secteurs industriels ou des scénarios métier spécifiques. Il permet également d'aligner les sorties sur les préférences humaines et de réduire la latence. Trois méthodes d'entraînement sont disponibles : le supervised fine-tuning (SFT), le continual pre-training (CPT) et le direct preference optimization (DPO).

Présentation du fine-tuning de modèle

Le fine-tuning de modèle constitue une méthode essentielle pour optimiser les performances d'un modèle. Il permet notamment :

  • D'améliorer les performances du modèle pour des secteurs d'activité ou des besoins métier spécifiques
  • De réduire la latence de sortie du modèle
  • De limiter les hallucinations du modèle
  • D'aligner le modèle sur les valeurs ou les préférences humaines
  • De remplacer des modèles de grande taille par des modèles légers après fine-tuning

Au cours du processus de fine-tuning, le modèle acquiert à partir des données d'entraînement des caractéristiques propres à un métier ou à un scénario donné, telles que des connaissances, un ton, des styles d'expression et une conscience de soi. Étant donné que le modèle a déjà assimilé de nombreux exemples liés à des secteurs ou scénarios spécifiques durant l'entraînement, ses performances en inférence one-shot ou zero-shot après entraînement surpassent ses performances few-shot avant entraînement. Cette approche permet ainsi d'économiser des tokens en entrée et de réduire la latence de sortie du modèle.

Processus de fine-tuning de modèle

image

Pour plus d'informations, consultez :

Modèles pris en charge

Modèles pris en charge

Singapour

Génération de texte

Nom du modèle

Code du modèle

Entraînement SFT tous paramètres (sft)

Entraînement SFT efficace (efficient_sft)

Qwen3-14B

qwen3-14b

×

Supported

Compréhension visuelle (Qwen-VL)

Nom du modèle

Code du modèle

Entraînement SFT tous paramètres (sft)

Entraînement SFT efficace (efficient_sft)

-

-

-

-

Chine du Nord 2 (Pékin)

Génération de texte

Service de modèle

Code du modèle

Entraînement CPT tous paramètres (cpt)

Entraînement SFT tous paramètres (sft)

Entraînement SFT efficace (efficient_sft)

Entraînement DPO tous paramètres (dpo_full)

Entraînement DPO efficace (dpo_lora)

Qwen3.6-Flash-2026-04-16

qwen3.6-flash-2026-04-16

×

Supported

×

×

×

Qwen3.5-27B

qwen3.5-27b

×

Supported

Supported

×

×

Qwen3.5-9B

qwen3.5-9b

×

Supported

Supported

×

×

Qwen3.5-Flash-2026-02-23

qwen3.5-flash-2026-02-23

×

Supported

×

×

×

Qwen3-32B

qwen3-32b

Supported

Supported

Supported

Supported

Supported

Qwen3-30B-A3B-Instruct-2507

qwen3-30b-a3b-instruct-2507

Supported

Supported

Supported

×

×

Qwen3-14B

qwen3-14b

×

Supported

Supported

Supported

Supported

Qwen3-8B

qwen3-8b

×

Supported

Supported

Supported

Supported

Qwen3-4B-Instruct-2507

qwen3-4b-instruct-2507

Supported

Supported

Supported

Supported

Supported

Qwen3-1.7B

qwen3-1.7b

Supported

Supported

Supported

Supported

Supported

Qwen3-0.6B

qwen3-0.6b

Supported

Supported

Supported

Supported

Supported

Qwen2.5-72B-Instruct

qwen2.5-72b-instruct

Supported

Supported

Supported

Supported

Supported

Qwen2.5-32B-Instruct

qwen2.5-32b-instruct

Supported

Supported

Supported

Supported

Supported

Qwen2.5-14B-Instruct

qwen2.5-14b-instruct

Supported

Supported

Supported

Supported

Supported

Qwen2.5-7B-Instruct

qwen2.5-7b-instruct

Supported

Supported

Supported

Supported

Supported

Qwen-Plus-Character-2025-11-06

qwen-plus-character-2025-11-06

×

Supported

Supported

Supported

Supported

Compréhension visuelle (Qwen-VL)

Service de modèle

Code du modèle

Entraînement CPT tous paramètres (cpt)

Entraînement SFT tous paramètres (sft)

Entraînement SFT efficace (efficient_sft)

Entraînement DPO tous paramètres (dpo_full)

Entraînement DPO efficace (dpo_lora)

Qwen3-VL-8B-Instruct

qwen3-vl-8b-instruct

×

Supported

Supported

×

×

Qwen3-VL-8B-Thinking

qwen3-vl-8b-thinking

×

Supported

Supported

×

×

Qwen3-VL-4B-Instruct

qwen3-vl-4b-instruct

×

Supported

Supported

×

×

Qwen2.5-VL-72B-Instruct

qwen2.5-vl-72b-instruct

×

Supported

Supported

×

×

Qwen2.5-VL-32B-Instruct

qwen2.5-vl-32b-instruct

×

Supported

Supported

×

×

Qwen2.5-VL-7B-Instruct

qwen2.5-vl-7b-instruct

×

Supported

Supported

×

×

Comparaison des méthodes d'ajustement

Fonctionnalité

CPT (Continual Pre-training)

SFT (Supervised Fine-tuning)

DPO (Direct Preference Optimization)

Résumé

Complète les connaissances (Injecte des connaissances métier)

Apprend à exécuter des tâches (Suit les instructions)

Exécute mieux les tâches (S'aligne sur les préférences humaines)

Données d'entrée

Plus de 10 millions de tokens

Texte métier non étiqueté

Plus de 1 000 entrées

Paires « question-réponse » de haute qualité

Plus de 100 ensembles

Paires de réponses « meilleure-moins bonne » pour la même instruction

Objectif principal

Adaptation au domaine. Acquisition d'un vocabulaire spécialisé et de faits spécifiques.

Enseigne au modèle les formats de conversation et les capacités d'exécution de tâches.

Aligne davantage les sorties du modèle sur les valeurs et préférences humaines.

Méthode d'apprentissage

Apprentissage auto-supervisé (Prédit le mot suivant)

Apprentissage supervisé (Imite la vérité terrain)

Apprentissage direct par préférence (Augmente la probabilité de bonnes réponses et diminue celle des mauvaises)

Étape du modèle

Généralement avant le SFT

Après le CPT et avant le DPO

Généralement après le SFT, comme étape finale d'alignement.

Comparaison des modes d'entraînement

Entraînement tous paramètres

Entraînement efficace (LoRA, recommandé)

Scénarios

• Le modèle doit acquérir de nouvelles capacités

• Obtention de performances globales optimales.

• Optimisation des performances du modèle pour des scénarios spécifiques.

• Scénarios sensibles aux coûts et au temps.

Durée d'entraînement

Plus longue, avec une convergence plus lente.

Plus courte, avec une convergence plus rapide.

Facturation

Mode de facturation

Paiement à l'utilisation basé sur le volume de données d'entraînement

Formule de facturation

Frais d'entraînement du modèle = (Total des tokens dans les données d'entraînement + Total des tokens dans les données d'entraînement mixtes) × Nombre d'époques × Prix unitaire d'entraînement (Unité de facturation minimale : 1 token)

Consultez les frais d'entraînement estimés en bas de la Model Fine-tuning console et cliquez sur Computing Details pour afficher le nombre total de tokens d'entraînement, le nombre d'époques et le prix unitaire d'entraînement.

Prix unitaire de l'entraînement

Le tableau suivant présente les prix unitaires d'entraînement pour les modèles prédéfinis. Le prix unitaire d'entraînement d'un modèle personnalisé est identique à celui du modèle prédéfini correspondant.

Singapour

Qwen

Service de modèle

Code du modèle

Tarif

Qwen3-14B

qwen3-14b

0,0016 $/1 000 tokens

Qwen-VL

Service de modèle

Code du modèle

Tarif

-

-

-

Calculer les tokens pour les images et les vidéos

Images

Formule : Image Tokens = h_bar * w_bar / token_pixels + 2

  • h_bar, w_bar : hauteur et largeur de l'image redimensionnée. Avant le traitement, le modèle effectue un prétraitement pour réduire l'image à une limite de pixels spécifique. Cette limite dépend des valeurs des paramètres max_pixels et vl_high_resolution_images. Pour plus d'informations, reportez-vous à Traiter les images haute résolution.

  • token_pixels : valeur en pixels correspondant à chaque token visuel. Cette valeur varie selon le modèle :

    • qwen3.8-series,qwen3.7-series, qwen3.6-series, qwen3.5-series, Qwen3-VL, qwen-vl-max et qwen-vl-plus : chaque token correspond à 32x32 pixels.
    • QVQ et autres modèles Qwen2.5-VL : chaque token correspond à 28x28 pixels.

Le code suivant illustre la logique approximative de mise à l'échelle des images utilisée par le modèle. Utilisez-le pour estimer le nombre de tokens d'une image. Pour la facturation réelle, reportez-vous à la réponse de l'API.

import math
from PIL import Image  # pip install Pillow

def smart_size(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_size("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}")

Vidéos

  • Fichiers vidéo :

    Lors du traitement d'un fichier vidéo, le modèle extrait d'abord les images, puis calcule le nombre total de tokens pour l'ensemble des images vidéo. Ce calcul étant complexe, utilisez le code suivant pour estimer la consommation totale de tokens d'une vidéo en fournissant son chemin d'accès :

    # 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_MAX_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)
    
  • Liste d'images :

    Si une vidéo est transmise sous forme de liste d'images, cela signifie que l'extraction des images a déjà été effectuée. Utilisez le code suivant pour calculer la consommation de tokens en fournissant le chemin d'accès et le nombre d'images :

    # 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_MAX_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")
    

Chine du Nord 2 (Pékin)

Qwen

Service de modèle

Code du modèle

Tarif

Qwen3.5-27B

qwen3.5-27b

0,006876 $/1 000 tokens

Qwen3.5-9B

qwen3.5-9b

0,00275 $/1 000 tokens

Qwen3-32B

qwen3-32b

0,005501 $/1 000 tokens

Qwen3-30B-A3B-Instruct-2507

qwen3-30b-a3b-instruct-2507

0,004126 $/1 000 tokens

Qwen3-14B

qwen3-14b

0,004126 $/1 000 tokens

Qwen3-8B

qwen3-8b

0,000825 $/1 000 tokens

Qwen3-4B-Instruct-2507

qwen3-4b-instruct-2507

0,000825 $/1 000 tokens

Qwen3-1.7B

qwen3-1.7b

0,000619 $/1 000 tokens

Qwen3-0.6B

qwen3-0.6b

0,000413 $/1 000 tokens

Qwen2.5-72B-Instruct

qwen2.5-72b-instruct

0,020628 $/1 000 tokens

Qwen2.5-32B-Instruct

qwen2.5-32b-instruct

0,004126 $/1 000 tokens

Qwen2.5-14B-Instruct

qwen2.5-14b-instruct

0,004126 $/1 000 tokens

Qwen2.5-7B-Instruct

qwen2.5-7b-instruct

0,000825 $/1 000 tokens

Qwen-Plus-Character-2025-11-06

qwen-plus-character-2025-11-06

0,020628 $/1 000 tokens

Qwen-VL

Service de modèle

Code du modèle

Tarif

Qwen3-VL-8B-Instruct

qwen3-vl-8b-instruct

0,00165 $/1 000 tokens

Qwen3-VL-8B-Thinking

qwen3-vl-8b-thinking

0,00165 $/1 000 tokens

Qwen3-VL-4B-Instruct

qwen3-vl-4b-instruct

0,000825 $/1 000 tokens

Qwen2.5-VL-72B-Instruct

qwen2.5-vl-72b-instruct

0,006876 $/1 000 tokens

Qwen2.5-VL-32B-Instruct

qwen2.5-vl-32b-instruct

0,00275 $/1 000 tokens

Qwen2.5-VL-7B-Instruct

qwen2.5-vl-7b-instruct

0,001375 $/1 000 tokens

Calculer les tokens pour les images et les vidéos

Images

Formule : Image Tokens = h_bar * w_bar / token_pixels + 2

  • h_bar, w_bar : hauteur et largeur de l'image redimensionnée. Avant le traitement, le modèle effectue un prétraitement pour réduire l'image à une limite de pixels spécifique. Cette limite dépend des valeurs des paramètres max_pixels et vl_high_resolution_images. Pour plus d'informations, reportez-vous à Traiter les images haute résolution.

  • token_pixels : valeur en pixels correspondant à chaque token visuel. Cette valeur varie selon le modèle :

    • qwen3.8-series,qwen3.7-series, qwen3.6-series, qwen3.5-series, Qwen3-VL, qwen-vl-max et qwen-vl-plus : chaque token correspond à 32x32 pixels.
    • QVQ et autres modèles Qwen2.5-VL : chaque token correspond à 28x28 pixels.

Le code suivant illustre la logique approximative de mise à l'échelle des images utilisée par le modèle. Utilisez-le pour estimer le nombre de tokens d'une image. Pour la facturation réelle, reportez-vous à la réponse de l'API.

import math
from PIL import Image  # pip install Pillow

def smart_size(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_size("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}")

Vidéos

  • Fichiers vidéo :

    Lors du traitement d'un fichier vidéo, le modèle extrait d'abord les images, puis calcule le nombre total de tokens pour l'ensemble des images vidéo. Ce calcul étant complexe, utilisez le code suivant pour estimer la consommation totale de tokens d'une vidéo en fournissant son chemin d'accès :

    # 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_MAX_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)
    
  • Liste d'images :

    Si une vidéo est transmise sous forme de liste d'images, cela signifie que l'extraction des images a déjà été effectuée. Utilisez le code suivant pour calculer la consommation de tokens en fournissant le chemin d'accès et le nombre d'images :

    # 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_MAX_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")
    

Avant d'affiner un modèle

  • Bien que l'affinage des modèles de génération de texte permette d'obtenir d'excellents résultats dans des scénarios métier spécifiques, cette approche présente les limites suivantes :

    • Durée importante : Cela inclut la création d'un jeu de données CPT à grande échelle (au moins 50 millions de tokens), la constitution d'un jeu de données SFT efficace (plus de 1 000 entrées), la collecte d'un nombre suffisant de cas négatifs (plus de 100) pour élaborer un jeu de données DPO pertinent destiné à la facturation du déploiement de modèle, ainsi que la lenteur des itérations d'optimisation du modèle.
    • Coût élevé : Un modèle affiné ne peut être utilisé qu'après son déploiement, et la facturation du déploiement de modèle est onéreuse.
  • Alibaba Cloud Model Studio recommande d'essayer en premier lieu le Prompt Engineering ou le Function Calling pour personnaliser votre application. L'affinage de modèle constitue généralement le « dernier recours » pour améliorer les performances. En effet :

    1. Dans de nombreuses tâches, un modèle peut initialement offrir des résultats médiocres, mais l'application de techniques de prompt appropriées permet d'améliorer ces résultats sans nécessiter d'affinage.
    2. L'optimisation itérative des prompts et des plugins s'avère plus agile et plus rentable que les itérations d'affinage, car l'affinage peut exiger une nouvelle collecte, un nettoyage et une optimisation des données, ainsi que le recueil de cas négatifs et la réalisation d'enquêtes clients.
    3. Même si vous décidez finalement de procéder à un affinage, le travail initial sur l'ingénierie des prompts et l'optimisation des plugins ne sera pas perdu. Ces travaux préliminaires peuvent être entièrement réutilisés lors de la constitution du jeu de données d'affinage.

Prise en main

Affiner un modèle via la console

Étapes d'affinageCapture d'écran de la console

Étape 1 : Sur la page Model Fine-tuning, cliquez sur Create Training Task.

image
Étape 2 : Configurer l'entraînement
  • Training Method : Supervised Fine-tuning (SFT)
  • Select Model : Qwen3-8B
  • Training Method : Efficient Training
  • Configure Parameters : Vous pouvez conserver les paramètres par défaut, car Model Studio fournit des configurations recommandées pour les hyperparamètres d'affinage.

Cette combinaison offre un temps d'entraînement court et des exigences réduites en matière de données.

Étape 3 : Configurer les données
  • Training Set : Sélectionnez le jeu de données d'affinage téléchargé pour construire le modèle.

    Exemple de données : SFT-ChatML_format_example.jsonl.

  • Mixed Training : Désactivé

  • Validation Set : Lorsqu'il est défini sur Automatic Splitting, 10 % des données sont utilisées comme ensemble de validation.

image
Étape 4 : Configurer les paramètres de sauvegarde des snapshots de paramètres du modèle (checkpoint)
  • Pour le Model Name, conservez le nom par défaut.
  • Maximum Export Count : Conservez la valeur par défaut.
  • Checkpoint save interval : Conservez la valeur par défaut.

RemarqueUne fois l'affinage du modèle terminé, vous pouvez exporter un snapshot de paramètres sur la plateforme Model Studio. Vous pouvez ensuite déployer le modèle sur Model Studio à partir de ce snapshot de paramètres.

Les snapshots de paramètres exportés sont stockés dans le stockage cloud et ne peuvent être ni consultés ni téléchargés.

image

Étape 5 : Cliquez sur « Start Training » et attendez la fin de l'entraînement du modèle.

Étape 6 : Utilisez la fonctionnalité Model Deployment d'Alibaba Cloud Model Studio pour déployer le modèle personnalisé entraîné. Après le déploiement, vous pouvez évaluer le modèle affiné. Pour plus d'informations, consultez Déploiement de modèle.

Processus typique d'affinage

Les trois méthodes d'affinage proposées par Model Studio ne s'excluent pas mutuellement ; elles sont progressives et complémentaires.

CPT (facultatif) → SFT → DPO (facultatif)

  1. CPT (Continual Pre-Training) - Complète les connaissances (Les modèles généraux possèdent des connaissances vastes mais peu profondes, qui peuvent ne pas répondre aux exigences de précision et de profondeur des domaines spécialisés)

    • Modèle financier : Apprend la terminologie financière
    • Modèle médical : Mémorise la pathologie médicamenteuse
    • Modèle juridique : Comprend les articles de loi et la jurisprudence
  2. SFT (Supervised Fine-Tuning) - Apprend à exécuter des tâches

    • Bot de service client : Apprend les procédures de service client
    • Assistant de code : Apprend les paradigmes de programmation
    • Appel d'outils (Agent) : Apprend à utiliser MCP
  3. DPO (Direct Preference Optimization) - Exécute mieux les tâches

    • Sécurité et responsabilité : Rejette les suggestions nuisibles
    • Concision et efficacité : Fournit des réponses concises
    • Objectivité et neutralité : Évalue de manière juste et objective

Format des données d'affinage

Jeu d'entraînement SFT

Les données d'entraînement au format SFT ChatML (Chat Markup Language) prennent en charge les conversations multi-tours et divers paramétrages de rôles.

Les paramètres OpenAI name et weight ne sont pas pris en charge. Toutes les sorties assistant seront entraînées.

# 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"}
  ...
]}

Pour plus d'informations sur les différences entre system, user et assistant, consultez Vue d'ensemble. Jeux de données d'entraînement exemples : SFT-ChatML_format_example.jsonl, SFT-ChatML_format_example.xlsx. Les formats XLS et XLSX ne prennent en charge que les conversations à tour unique.

Toutes les lignes assistant d'une seule entrée de données d'entraînement prennent en charge le paramètre "loss_weight", qui définit l'importance relative de cette ligne pendant l'entraînement. (Plage : de 0.0 à 1.0. Une valeur plus élevée indique une importance supérieure.)

Ce paramètre est disponible en avant-première sur invitation. Pour l'utiliser, contactez votre gestionnaire de compte.

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

Conseils pour la constitution des jeux de données

Exigences relatives à la taille du jeu de données

Pour le CPT, le jeu de données nécessite au moins 50 millions de tokens de données de pré-entraînement de haute qualité. Pour le SFT, il faut au moins 1 000 entrées de données d'affinage de haute qualité. Pour le DPO, le jeu de données requiert généralement plusieurs centaines d'entrées de données de préférences humaines. Si les résultats de l'évaluation du modèle après affinage des données ne sont pas satisfaisants, le moyen le plus simple d'améliorer les performances consiste à collecter davantage de données pour l'entraînement.

Si vous manquez de données, nous vous recommandons de créer une application agent et d'utiliser un index de base de connaissances pour renforcer les capacités du modèle. Dans de nombreux scénarios métier complexes, vous pouvez également combiner l'affinage de modèle et la récupération via base de connaissances.

Par exemple, dans un scénario de service client, vous pouvez utiliser l'affinage de modèle pour corriger le ton de l'agent, ses styles d'expression et sa conscience de soi. Les connaissances professionnelles liées au scénario peuvent être introduites dynamiquement dans le contexte du modèle via une base de connaissances.

Alibaba Cloud Model Studio recommande de commencer par créer et tester une application de génération augmentée par récupération (RAG). Après avoir collecté suffisamment de données d'application, vous pourrez alors utiliser l'affinage de modèle pour améliorer encore les performances du modèle.

Vous pouvez également recourir aux stratégies suivantes pour enrichir votre jeu de données :

  1. Utilisez un grand modèle linguistique (LLM) pour simuler la génération de contenu adapté à des scénarios métier spécifiques, afin de produire davantage de données pour l'affinage. (Nous recommandons de sélectionner un modèle plus volumineux et performant pour la génération.)
  2. Acquérez davantage de données par divers moyens, tels que la collecte à partir de scénarios d'application, l'extraction Web, les réseaux sociaux et forums en ligne, les jeux de données publics, les partenaires et ressources sectorielles, ainsi que les contributions des utilisateurs.

Diversité et équilibre des données

Les exigences en matière d'affinage de modèle varient selon le scénario. Par exemple, le professionnalisme est crucial pour des scénarios métier spécifiques, tandis que la polyvalence prime dans les scénarios de questions-réponses. Vous devez concevoir des cas d'utilisation des données en fonction des modules métier ou des contextes d'usage dont le modèle a la charge. Ainsi, l'efficacité de l'entraînement dépend non seulement du volume de données, mais aussi du professionnalisme et de la diversité des données adaptées au scénario visé.

À titre d'exemple, dans un scénario de conversation IA intelligente, un jeu de données professionnel et diversifié devrait couvrir les cas métier suivants :

Activité spécifique

Scénarios/activités diversifiés

Service client e-commerce

Notifications promotionnelles, conseil avant-vente, accompagnement pendant la vente, service après-vente, suivi post-vente, gestion des réclamations, etc.

Services financiers

Conseil en prêt, conseils en investissement et gestion de patrimoine, services de carte de crédit, gestion de comptes bancaires, etc.

Santé en ligne

Consultation sur les symptômes, prise de rendez-vous, instructions de visite, renseignements sur les médicaments, conseils de santé, etc.

Secrétaire IA

Informations informatiques, informations administratives, informations RH, demandes sur les avantages sociaux, consultations du calendrier de l'entreprise, etc.

Assistant de voyage

Planification de voyage, guides d'entrée et de sortie, conseil en assurance voyage, présentations des coutumes et cultures locales, etc.

Conseiller juridique d'entreprise

Examen de contrats, protection de la propriété intellectuelle, vérifications de conformité, questions-réponses sur le droit du travail, conseil en transactions transfrontalières, analyse juridique de cas individuels, etc.

Il est également important de noter que la quantité de données pour chaque scénario/activité doit être relativement équilibrée, et que la proportion des données doit correspondre à la proportion réelle du scénario. Cela évite d'avoir trop de données d'un seul type, ce qui pourrait amener le modèle à privilégier l'apprentissage de ces caractéristiques au détriment de sa capacité de généralisation.

Séparation des jeux d'entraînement et de validation

Le réglage fin du modèle s'effectue directement dans la console.

  • Séparez automatiquement un jeu de données d'entraînement complet et échantillonnez aléatoirement une petite quantité de données pour constituer un jeu de validation.
  • Choisissez d'importer un jeu de données distinct.

Pendant l'entraînement, la console affiche en temps réel la perte du jeu de validation ainsi que la précision des tokens.

image

FAQ

Puis-je effectuer le réglage fin de mon propre modèle ?

Model Studio ne permet ni le réglage fin, ni l'importation de modèles personnalisés, ni l'exportation de modèles téléchargés.