All Products
Search
Document Center

Alibaba Cloud Model Studio:Pengenalan fine-tuning model

Last Updated:Sep 09, 2026

Anda dapat menggunakan fine-tuning model di Alibaba Cloud Model Studio jika performa model tidak memenuhi ekspektasi Anda setelah mencoba metode optimasi seperti rekayasa prompt dan pemanggilan plugin. Sebagai strategi inti untuk meningkatkan performa model, fine-tuning dapat secara signifikan meningkatkan kemampuan model dalam industri atau skenario bisnis tertentu, menyelaraskan outputnya dengan preferensi manusia, serta mengurangi latensi output. Fine-tuning mencakup tiga metode pelatihan: supervised fine-tuning (SFT), continual pre-training (CPT), dan direct preference optimization (DPO).

Pengenalan fine-tuning model

Fine-tuning model merupakan metode penting untuk mengoptimalkan performa model. Metode ini dapat:

  • Meningkatkan performa model dalam industri tertentu atau untuk kebutuhan bisnis spesifik
  • Mengurangi latensi output model
  • Menekan halusinasi model
  • Menyelaraskan model dengan nilai atau preferensi manusia
  • Menggantikan model yang lebih besar dengan model ringan hasil fine-tuning

Selama proses fine-tuning, model mempelajari fitur-fitur spesifik bisnis atau skenario dari data pelatihan, seperti pengetahuan, nada, gaya ekspresi, dan kesadaran diri. Karena model telah mempelajari banyak contoh untuk industri atau skenario tertentu selama pelatihan, performa prompt one-shot atau zero-shot setelah pelatihan lebih baik daripada performa few-shot sebelum pelatihan. Hal ini menghemat token input dan mengurangi latensi output model.

Proses fine-tuning model

Untuk informasi lebih lanjut, lihat:

Model yang didukung

Model yang didukung

Singapura

Generasi teks

Nama model

Kode model

Pelatihan parameter penuh SFT (sft)

Pelatihan efisien SFT (efficient_sft)

Qwen3-14B

qwen3-14b

×

Supported

Pemahaman visual (Qwen-VL)

Nama model

Kode model

Pelatihan parameter penuh SFT (sft)

Pelatihan efisien SFT (efficient_sft)

-

-

-

-

North China 2 (Beijing)

Generasi teks

Layanan model

Kode model

Pelatihan parameter penuh CPT (cpt)

Pelatihan parameter penuh SFT (sft)

Pelatihan efisien SFT (efficient_sft)

Pelatihan parameter penuh DPO (dpo_full)

Pelatihan efisien DPO (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

Pemahaman visual (Qwen-VL)

Layanan model

Kode model

Pelatihan parameter penuh CPT (cpt)

Pelatihan parameter penuh SFT (sft)

Pelatihan efisien SFT (efficient_sft)

Pelatihan parameter penuh DPO (dpo_full)

Pelatihan efisien DPO (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

×

×

Perbandingan metode fine-tuning

Fitur

CPT (Continual Pre-training)

SFT (Supervised Fine-tuning)

DPO (Direct Preference Optimization)

Rangkuman

Menambahkan pengetahuan (Menyuntikkan pengetahuan domain)

Belajar melakukan tugas (Mengikuti instruksi)

Menjalankan tugas lebih baik (Menyelaraskan dengan preferensi manusia)

Data input

Lebih dari 10 juta token

Teks domain tanpa label

Lebih dari 1.000 entri

Pasangan "pertanyaan-jawaban" berkualitas tinggi

Lebih dari 100 set

Pasangan respons "lebih baik-lebih buruk" untuk instruksi yang sama

Tujuan utama

Adaptasi domain. Mempelajari kosakata dan fakta khusus.

Mengajarkan format percakapan dan kemampuan menjalankan tugas kepada model.

Menyelaraskan output model lebih baik dengan nilai dan preferensi manusia.

Metode pembelajaran

Pembelajaran self-supervised (Memprediksi kata berikutnya)

Supervised learning (Meniru ground truth)

Pembelajaran preferensi langsung (Meningkatkan probabilitas respons baik dan menurunkan probabilitas respons buruk)

Tahap model

Umumnya sebelum SFT

Setelah CPT dan sebelum DPO

Umumnya setelah SFT, sebagai langkah terakhir untuk penyelarasan.

Perbandingan pola pelatihan

Pelatihan parameter penuh

Pelatihan efisien (LoRA, direkomendasikan)

Skenario

• Model perlu mendapatkan kemampuan baru

• Mencapai performa global optimal.

• Mengoptimalkan performa model untuk skenario tertentu.

• Untuk skenario yang sensitif terhadap biaya dan waktu.

Waktu pelatihan

Lebih lama, dengan konvergensi lebih lambat.

Lebih singkat, dengan konvergensi lebih cepat.

Penagihan

Metode penagihan

Pay-as-you-go berdasarkan jumlah data pelatihan

Rumus penagihan

Biaya pelatihan model = (Total token dalam data pelatihan + Total token dalam data pelatihan campuran) × Jumlah epoch × Harga satuan pelatihan (Unit penagihan minimum: 1 token)

Anda dapat melihat perkiraan biaya pelatihan di bagian bawah Konsol Fine-tuning Model dan klik Billing Details untuk melihat total jumlah token pelatihan, jumlah epoch, dan harga satuan pelatihan.

Harga satuan pelatihan

Tabel berikut mencantumkan harga satuan pelatihan untuk model yang telah dibuat sebelumnya. Harga satuan pelatihan untuk model kustom sama dengan harga model yang telah dibuat sebelumnya yang sesuai.

Singapura

Qwen

Layanan model

Kode model

Harga

Qwen3-14B

qwen3-14b

$0,0016/1.000 token

Qwen-VL

Layanan model

Kode model

Harga

-

-

-

Hitung token untuk gambar dan video

Tab

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

  • h_bar, w_bar: Tinggi dan lebar gambar yang telah diskalakan. Sebelum memproses gambar, model melakukan pra-pemrosesan untuk mengecilkan ukurannya hingga batas piksel tertentu. Batas ini bergantung pada nilai parameter max_pixels dan vl_high_resolution_images. Untuk informasi lebih lanjut, lihat Process high-resolution images.

  • token_pixels: Nilai piksel yang sesuai dengan setiap token visual. Nilai ini bervariasi tergantung model:

    • qwen3.8-series, qwen3.7-series, qwen3.6-series, qwen3.5-series, Qwen3-VL, qwen-vl-max, dan qwen-vl-plus:Setiap token sesuai dengan 32x32 piksel.
    • QVQ dan model Qwen2.5-VL lainnya:Setiap token sesuai dengan 28x28 piksel.

Kode berikut menunjukkan logika penskalaan gambar perkiraan yang digunakan oleh model. Gunakan kode ini untuk memperkirakan jumlah token gambar. Untuk penagihan aktual, rujuk tanggapan 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}")

Tab

  • File video:

    Saat memproses file video, model pertama-tama mengekstraksi frame lalu menghitung jumlah total token untuk semua frame video tersebut. Karena perhitungan ini kompleks, Anda dapat menggunakan kode berikut untuk memperkirakan total konsumsi token video dengan memberikan path-nya:

# 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)
  • Daftar gambar:

    Saat video diberikan sebagai daftar gambar, artinya ekstraksi frame telah dilakukan. Gunakan kode berikut untuk menghitung konsumsi token dengan memberikan path dan jumlah gambar:

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

China Utara 2 (Beijing)

Qwen

Layanan model

Kode model

Harga

Qwen3.5-27B

qwen3.5-27b

$0,006876/1.000 token

Qwen3.5-9B

qwen3.5-9b

$0,00275/1.000 token

Qwen3-32B

qwen3-32b

$0,005501/1.000 token

Qwen3-30B-A3B-Instruct-2507

qwen3-30b-a3b-instruct-2507

$0,004126/1.000 token

Qwen3-14B

qwen3-14b

$0,004126/1.000 token

Qwen3-8B

qwen3-8b

$0,000825/1.000 token

Qwen3-4B-Instruct-2507

qwen3-4b-instruct-2507

$0,000825/1.000 token

Qwen3-1.7B

qwen3-1.7b

$0,000619/1.000 token

Qwen3-0.6B

qwen3-0.6b

$0,000413/1.000 token

Qwen2.5-72B-Instruct

qwen2.5-72b-instruct

$0,020628/1.000 token

Qwen2.5-32B-Instruct

qwen2.5-32b-instruct

$0,004126/1.000 token

Qwen2.5-14B-Instruct

qwen2.5-14b-instruct

$0,004126/1.000 token

Qwen2.5-7B-Instruct

qwen2.5-7b-instruct

$0,000825/1.000 token

Qwen-Plus-Character-2025-11-06

qwen-plus-character-2025-11-06

$0,020628/1.000 token

Qwen-VL

Layanan model

Kode model

Harga

Qwen3-VL-8B-Instruct

qwen3-vl-8b-instruct

$0,00165/1.000 token

Qwen3-VL-8B-Thinking

qwen3-vl-8b-thinking

$0,00165/1.000 token

Qwen3-VL-4B-Instruct

qwen3-vl-4b-instruct

$0,000825/1.000 token

Qwen2.5-VL-72B-Instruct

qwen2.5-vl-72b-instruct

$0,006876/1.000 token

Qwen2.5-VL-32B-Instruct

qwen2.5-vl-32b-instruct

$0,00275/1.000 token

Qwen2.5-VL-7B-Instruct

qwen2.5-vl-7b-instruct

$0,001375/1.000 token

Hitung token untuk gambar dan video

Gambar

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

  • h_bar, w_bar: Tinggi dan lebar gambar yang telah diskalakan. Sebelum memproses gambar, model melakukan pra-pemrosesan untuk mengecilkan ukurannya hingga batas piksel tertentu. Batas ini bergantung pada nilai parameter max_pixels dan vl_high_resolution_images. Untuk informasi lebih lanjut, lihat Process high-resolution images.

  • token_pixels: Nilai piksel yang sesuai dengan setiap token visual. Nilai ini bervariasi tergantung model:

    • qwen3.8-series, qwen3.7-series, qwen3.6-series, qwen3.5-series, Qwen3-VL, qwen-vl-max, dan qwen-vl-plus:Setiap token sesuai dengan 32x32 piksel.
    • QVQ dan model Qwen2.5-VL lainnya:Setiap token sesuai dengan 28x28 piksel.

Kode berikut menunjukkan logika penskalaan gambar perkiraan yang digunakan oleh model. Gunakan kode ini untuk memperkirakan jumlah token gambar. Untuk penagihan aktual, rujuk tanggapan 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}")

Video

  • File video:

    Saat memproses file video, model pertama-tama mengekstraksi frame lalu menghitung jumlah total token untuk semua frame video tersebut. Karena perhitungan ini kompleks, Anda dapat menggunakan kode berikut untuk memperkirakan total konsumsi token video dengan memberikan path-nya:

# 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)
  • Daftar gambar:

    Saat video diberikan sebagai daftar gambar, artinya ekstraksi frame telah dilakukan. Gunakan kode berikut untuk menghitung konsumsi token dengan memberikan path dan jumlah gambar:

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

Sebelum Anda melakukan fine-tuning model

  • Meskipun fine-tuning model generasi teks dapat menghasilkan kinerja luar biasa dalam skenario bisnis tertentu, pendekatan ini memiliki keterbatasan berikut:

    • Memakan waktu: Ini mencakup pembuatan set data CPT berskala besar (minimal 50 juta token), penyusunan set data SFT yang efektif (lebih dari 1.000 entri), pengumpulan cukup banyak kasus buruk (lebih dari 100) untuk membangun set data DPO yang efektif, serta kecepatan iterasi optimasi model yang lambat.
    • Biaya tinggi: Model yang telah melalui fine-tuning hanya dapat digunakan setelah diterapkan, dan penagihan penerapan model cukup tinggi.
  • Alibaba Cloud Model Studio merekomendasikan agar Anda terlebih dahulu mencoba menggunakan Prompt Engineering atau Function Calling untuk menyesuaikan aplikasi Anda. Fine-tuning model biasanya merupakan "pilihan terakhir" untuk meningkatkan kinerja model. Hal ini disebabkan oleh:

    1. Pada banyak tugas, model mungkin awalnya memberikan kinerja yang buruk, tetapi penerapan teknik prompt yang tepat dapat meningkatkan hasil tanpa perlu melakukan fine-tuning model.
    2. Optimasi prompt dan plugin secara iteratif lebih lincah dan hemat biaya dibandingkan iterasi fine-tuning model, karena fine-tuning mungkin memerlukan pengumpulan ulang, pembersihan, dan optimasi data, pengumpulan kasus buruk, serta survei pelanggan.
    3. Bahkan jika Anda akhirnya memutuskan untuk melakukan fine-tuning model, pekerjaan awal pada rekayasa prompt dan optimasi plugin tidak akan sia-sia. Pekerjaan awal ini dapat sepenuhnya digunakan kembali saat membangun set data fine-tuning.

Mulai

Fine-tune model menggunakan Konsol

Langkah-langkah fine-tuning

Tangkapan layar Konsol

Langkah 1: Di halaman Model Fine-tuning, klik Create Training Task.

Di halaman Create Training Task, lengkapi konfigurasi berikut:

  1. Atur jenis pelatihan ke SFT Fine-tuning Training.

  2. Pilih Qwen3-8B sebagai model.

  3. Atur metode pelatihan ke Efficient Training.

  4. Dalam konfigurasi hiperparameter, atur batch_size ke 16 (rentang: [8, 1024], langkah: 8).

  5. Di panel Training Task Summary di sebelah kanan, pastikan metode penagihan adalah penagihan berbasis token dan 10% dari set pelatihan secara otomatis dipisahkan sebagai set validasi, lalu klik Start Training.

Langkah 2: Konfigurasi pelatihan

  • Training Method: Supervised Fine-tuning (SFT)

  • Select Model: Qwen3-8B

  • Training Method: Efficient Training

  • Configure Parameters: Anda dapat mempertahankan pengaturan default karena Model Studio menyediakan konfigurasi yang direkomendasikan untuk hiperparameter fine-tuning.

Kombinasi ini memiliki waktu pelatihan singkat dan kebutuhan data rendah.

Langkah 3: Konfigurasi data

  • Training Set: Pilih set data fine-tuning yang telah diunggah untuk membangun model.

    Contoh data: SFT-ChatML_format_example.jsonl.

  • Mixed Training: Dinonaktifkan

  • Validation Set: Saat diatur ke Automatic Splitting, 10% data digunakan sebagai set validasi.

Langkah 4: Konfigurasi parameter penyimpanan snapshot parameter model (checkpoint)

  • Untuk Model Name, pertahankan nama default.

  • Maximum Export Count: Pertahankan nilai default.

  • Checkpoint save interval: Pertahankan nilai default.

Setelah fine-tuning model selesai, Anda dapat mengekspor snapshot parameter di platform Model Studio. Anda kemudian dapat menerapkan model di Model Studio berdasarkan snapshot parameter tersebut.

Snapshot parameter yang diekspor disimpan di Cloud Storage dan tidak dapat diakses atau diunduh.

Langkah 5: Klik "Start Training" dan tunggu hingga pelatihan model selesai.

Langkah 6: Gunakan fitur Deployments Alibaba Cloud Model Studio untuk menerapkan model kustom yang telah dilatih. Setelah penerapan, Anda dapat mengevaluasi model hasil fine-tuning. Untuk informasi lebih lanjut, lihat Model deployment.

Proses fine-tuning khas

Ketiga metode fine-tuning yang disediakan oleh Model Studio tidak saling eksklusif, melainkan progresif dan saling melengkapi.

CPT (opsional) → SFT → DPO (opsional)

  1. CPT (continual pre-training) – Melengkapi pengetahuan (Model umum memiliki pengetahuan luas tetapi dangkal, yang mungkin tidak memenuhi persyaratan kedalaman dan presisi di bidang profesional)

    • Model keuangan: Mempelajari Istilah Keuangan
    • Model medis: Mengingat patologi obat
    • Model hukum: Memahami artikel hukum dan yurisprudensi
  2. SFT (supervised fine-tuning) – Mempelajari cara melakukan task

    • Bot layanan pelanggan: Mempelajari prosedur layanan pelanggan
    • Asisten Kode: Mempelajari paradigma pemrograman
    • Pemanggilan alat (Agent): Learns to use MCP
  3. DPO (direct preference optimization) – Melakukan task dengan lebih baik

    • Keamanan dan tanggung jawab: Menolak saran berbahaya
    • Keringkasan dan efektivitas: Memberikan jawaban yang ringkas
    • Objektivitas dan netralitas: Mengevaluasi secara adil dan objektif

Format data fine-tuning

Set pelatihan SFT

Data pelatihan dalam format SFT ChatML (Chat Markup Language) mendukung percakapan multi-putaran dan berbagai pengaturan role.

Parameter name dan weight dari OpenAI tidak didukung. Semua output assistant akan dilatih.

# Satu baris data pelatihan (dalam format JSON) memiliki struktur khas berikut saat diperluas:
{"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"}
  ...
]}

Untuk informasi mengenai perbedaan antara system, user, dan assistant, lihat Ikhtisar. Contoh set data pelatihan: SFT-ChatML_format_example.jsonl, SFT-ChatML_format_example.xlsx. Format XLS dan XLSX hanya mendukung percakapan satu putaran.

Semua baris assistant dalam satu entri data pelatihan mendukung parameter "loss_weight", yang mengatur tingkat kepentingan relatif baris tersebut selama pelatihan. (Rentang: 0.0 hingga 1.0. Nilai yang lebih besar menunjukkan kepentingan yang lebih tinggi.)

Parameter ini tersedia untuk pratinjau undangan. Untuk menggunakannya, hubungi account manager Anda.

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

Tips pembuatan dataset

Persyaratan ukuran dataset

Untuk CPT, dataset memerlukan setidaknya 50 juta token data pre-training berkualitas tinggi. Untuk SFT, dataset memerlukan setidaknya 1.000 entri data fine-tuning berkualitas tinggi. Untuk DPO, dataset umumnya memerlukan ratusan entri data preferensi manusia. Jika hasil evaluasi model setelah fine-tuning data tidak memuaskan, cara paling sederhana untuk meningkatkannya adalah mengumpulkan lebih banyak data untuk pelatihan.

Jika Anda kekurangan data, kami menyarankan untuk membuat aplikasi agen dan menggunakan indeks basis pengetahuan untuk meningkatkan kemampuan model. Dalam banyak skenario bisnis kompleks, Anda juga dapat menggabungkan fine-tuning model dan pengambilan dari basis pengetahuan.

Misalnya, dalam skenario layanan pelanggan, Anda dapat menggunakan fine-tuning model untuk mengatasi masalah terkait nada bicara, gaya ekspresi, dan kesadaran diri agen layanan pelanggan. Pengetahuan profesional yang terkait dengan skenario tersebut dapat dimasukkan secara dinamis ke dalam konteks model melalui basis pengetahuan.

Alibaba Cloud Model Studio merekomendasikan agar Anda terlebih dahulu membangun dan menguji aplikasi Generasi yang Diperkaya dengan Pengambilan Data (RAG). Setelah mengumpulkan cukup data aplikasi, Anda kemudian dapat menggunakan fine-tuning model untuk lebih meningkatkan kinerja model.

Anda juga dapat menggunakan strategi berikut untuk memperluas dataset Anda:

  1. Gunakan model bahasa besar (LLM) untuk mensimulasikan pembuatan konten untuk skenario bisnis tertentu guna membantu Anda menghasilkan lebih banyak data untuk fine-tuning. (Kami menyarankan memilih model yang lebih besar dan berkinerja tinggi untuk proses generasi.)
  2. Dapatkan lebih banyak data melalui berbagai metode, seperti pengumpulan dari skenario aplikasi, web scraping, media sosial dan forum daring, dataset publik, mitra serta sumber daya industri, dan kontribusi pengguna.

Keragaman dan keseimbangan data

Persyaratan untuk fine-tuning model bervariasi tergantung skenario. Misalnya, profesionalisme sangat penting untuk skenario bisnis tertentu, sedangkan fleksibilitas lebih penting untuk skenario tanya jawab. Anda perlu merancang kasus penggunaan data berdasarkan modul bisnis atau skenario penggunaan yang menjadi tanggung jawab model. Oleh karena itu, efektivitas pelatihan bergantung bukan hanya pada volume data, tetapi juga pada profesionalisme dan keragaman data untuk skenario spesifik tersebut.

Misalnya, dalam skenario percakapan AI cerdas, dataset profesional dan beragam sebaiknya mencakup skenario bisnis berikut:

Bisnis spesifik

Skenario/bisnis beragam

E-dagang layanan pelanggan

Dorongan promosi, konsultasi pra-penjualan, panduan saat penjualan, layanan purna jual, tindak lanjut purna jual, penanganan keluhan, dll.

Layanan keuangan

Konsultasi pinjaman, saran investasi dan manajemen kekayaan, layanan kartu kredit, manajemen rekening bank, dll.

Layanan kesehatan daring

Konsultasi gejala, pendaftaran janji temu, petunjuk kunjungan, pertanyaan informasi obat, tips kesehatan, dll.

Sekretaris AI

Informasi IT, informasi administratif, informasi SDM, pertanyaan tunjangan karyawan, kueri kalender perusahaan, dll.

Asisten perjalanan

Perencanaan perjalanan, panduan masuk dan keluar, konsultasi asuransi perjalanan, pengenalan adat dan budaya destinasi, dll.

Penasihat hukum perusahaan

Tinjauan kontrak, perlindungan kekayaan intelektual, pemeriksaan kepatuhan, tanya jawab hukum ketenagakerjaan, konsultasi transaksi lintas batas, analisis hukum kasus individual, dll.

Perlu juga diperhatikan bahwa jumlah data untuk setiap skenario/bisnis harus relatif seimbang, dan proporsi datanya harus sesuai dengan proporsi skenario aktual. Hal ini mencegah terlalu banyak data dari satu jenis, yang dapat menyebabkan model cenderung mempelajari fitur-fitur tersebut dan mengganggu kemampuan generalisasinya.

Pemisahan set pelatihan dan set validasi

Anda dapat melakukan fine-tuning model di Konsol.

  • Secara otomatis membagi dataset pelatihan lengkap dan mengambil sampel acak sejumlah kecil data untuk membentuk set validasi.
  • Memilih untuk mengunggah dataset terpisah.

Konsol menampilkan loss set validasi dan akurasi token secara real time selama pelatihan.

Halaman Data Configuration juga mencakup toggle Mixed Training (nonaktif secara default). Saat Auto Split dipilih, 10% dari set pelatihan secara default dibagi secara acak sebagai set validasi.

FAQ

Apakah saya dapat melakukan fine-tuning model saya sendiri?

Model Studio tidak mendukung fine-tuning, mengunggah model Anda sendiri, atau mengekspor model yang telah diunduh.