すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Model Studio:モデルファインチューニングの概要

最終更新日:Sep 09, 2026

プロンプトエンジニアリングやプラグイン呼び出しなどの最適化手法を試してもモデルの性能が期待に沿わない場合、Alibaba Cloud Model Studio のモデルファインチューニング機能を利用できます。モデルファインチューニングは、モデルの性能を向上させるための中心的な戦略であり、特定の業界やビジネスシナリオにおけるモデルの能力を大幅に強化し、その出力を人間の好みに合わせ、出力レイテンシーを削減することができます。モデルファインチューニングには、教師ありファインチューニング (SFT)、継続的事前学習 (CPT)、Direct Preference Optimization (DPO) の 3 つのトレーニング手法が含まれます。

モデルファインチューニングの概要

モデルファインチューニングは、モデルの性能を最適化するための重要な手法です。これにより、以下のことが可能になります:

  • 特定の業界やビジネスニーズにおけるモデルの性能向上
  • モデルの出力レイテンシーの削減
  • モデルのハルシネーションの抑制
  • モデルを人間の価値観や好みに合わせる
  • より大きなモデルをファインチューニングされた軽量モデルに置き換える

ファインチューニングの過程で、モデルはトレーニングデータから、特定の業界やシナリオに特化した知識、トーン、表現スタイル、自己認識などの特徴を学習します。トレーニング中に特定の業界やシナリオの多くの例をすでに学習しているため、トレーニング後のモデルのワンショットまたはゼロショットのプロンプト性能は、トレーニング前のフューショット性能よりも優れています。これにより、入力トークンが節約され、モデルの出力レイテンシーが削減されます。

モデルファインチューニングのプロセス

詳細については、以下をご参照ください:

サポート対象モデル

サポート対象モデル

シンガポール

テキスト生成

モデル名

モデルコード

SFT 全パラメーター訓練 (sft)

SFT 効率的な訓練 (efficient_sft)

Qwen3-14B

qwen3-14b

×

サポート済み

視覚理解 (Qwen-VL)

モデル名

モデルコード

SFT 全パラメーター訓練 (sft)

SFT 効率的な訓練 (efficient_sft)

-

-

-

-

中国北部 2 (北京)

テキスト生成

モデルサービス

モデルコード

CPT 全パラメーター訓練 (cpt)

SFT 全パラメーター訓練 (sft)

SFT 効率的な訓練 (efficient_sft)

DPO 全パラメーター訓練 (dpo_full)

DPO 効率的な訓練 (dpo_lora)

Qwen3.6-Flash-2026-04-16

qwen3.6-flash-2026-04-16

×

サポート済み

×

×

×

Qwen3.5-27B

qwen3.5-27b

×

サポート済み

サポート済み

×

×

Qwen3.5-9B

qwen3.5-9b

×

サポート済み

サポート済み

×

×

Qwen3.5-Flash-2026-02-23

qwen3.5-flash-2026-02-23

×

サポート済み

×

×

×

Qwen3-32B

qwen3-32b

サポート済み

サポート済み

サポート済み

サポート済み

サポート済み

Qwen3-30B-A3B-Instruct-2507

qwen3-30b-a3b-instruct-2507

サポート済み

サポート済み

サポート済み

×

×

Qwen3-14B

qwen3-14b

×

サポート済み

サポート済み

サポート済み

サポート済み

Qwen3-8B

qwen3-8b

×

サポート済み

サポート済み

サポート済み

サポート済み

Qwen3-4B-Instruct-2507

qwen3-4b-instruct-2507

サポート済み

サポート済み

サポート済み

サポート済み

サポート済み

Qwen3-1.7B

qwen3-1.7b

サポート済み

サポート済み

サポート済み

サポート済み

サポート済み

Qwen3-0.6B

qwen3-0.6b

サポート済み

サポート済み

サポート済み

サポート済み

サポート済み

Qwen2.5-72B-Instruct

qwen2.5-72b-instruct

サポート済み

サポート済み

サポート済み

サポート済み

サポート済み

Qwen2.5-32B-Instruct

qwen2.5-32b-instruct

サポート済み

サポート済み

サポート済み

サポート済み

サポート済み

Qwen2.5-14B-Instruct

qwen2.5-14b-instruct

サポート済み

サポート済み

サポート済み

サポート済み

サポート済み

Qwen2.5-7B-Instruct

qwen2.5-7b-instruct

サポート済み

サポート済み

サポート済み

サポート済み

サポート済み

Qwen-Plus-Character-2025-11-06

qwen-plus-character-2025-11-06

×

サポート済み

サポート済み

サポート済み

サポート済み

視覚理解 (Qwen-VL)

モデルサービス

モデルコード

CPT 全パラメーター訓練 (cpt)

SFT 全パラメーター訓練 (sft)

SFT 効率的な訓練 (efficient_sft)

DPO 全パラメーター訓練 (dpo_full)

DPO 効率的な訓練 (dpo_lora)

Qwen3-VL-8B-Instruct

qwen3-vl-8b-instruct

×

サポート済み

サポート済み

×

×

Qwen3-VL-8B-Thinking

qwen3-vl-8b-thinking

×

サポート済み

サポート済み

×

×

Qwen3-VL-4B-Instruct

qwen3-vl-4b-instruct

×

サポート済み

サポート済み

×

×

Qwen2.5-VL-72B-Instruct

qwen2.5-vl-72b-instruct

×

サポート済み

サポート済み

×

×

Qwen2.5-VL-32B-Instruct

qwen2.5-vl-32b-instruct

×

サポート済み

サポート済み

×

×

Qwen2.5-VL-7B-Instruct

qwen2.5-vl-7b-instruct

×

サポート済み

サポート済み

×

×

チューニング手法の比較

特徴

CPT (継続的事前学習)

SFT (教師ありファインチューニング)

DPO (Direct Preference Optimization)

概要

知識を補完する(ドメイン知識を注入する)

タスクの実行方法を学習する(指示に従う)

タスクをより良く実行する(人間の好みに合わせる)

入力データ

1,000 万トークン以上

ラベルなしのドメインテキスト

1,000 件以上

高品質な「質問と回答」のペア

100 セット以上

同じ指示に対する「より良い応答」と「より悪い応答」のペア

中心的な目的

ドメイン適応。専門用語や事実を学習する。

モデルに会話形式やタスク実行能力を教える。

モデルの出力を人間の価値観や好みに、より適合させる。

学習方法

自己教師あり学習 (次の単語を予測する)

教師あり学習 (グラウンドトゥルースを模倣する)

直接的な嗜好学習 (良い応答の確率を高め、悪い応答の確率を低くする)

モデルの段階

通常は SFT の前

CPT の後、DPO の前

通常は SFT の後、アライメントの最終ステップとして。

トレーニングパターンの比較

全パラメーター訓練

効率的な訓練 (LoRA、推奨)

シナリオ

• モデルが新しい能力を獲得する必要がある場合

• 最適なグローバルパフォーマンスを達成する。

• 特定のシナリオに合わせてモデルのパフォーマンスを最適化する。

• コストと時間に敏感なシナリオ向け。

トレーニング時間

より長く、収束が遅い。

より短く、収束が速い。

課金

課金方法

トレーニングデータの量に基づく従量課金

課金計算式

モデルトレーニング料金 = (トレーニングデータの総トークン数 + 混合トレーニングデータの総トークン数) × エポック数 × トレーニング単価 (最小課金単位:1 トークン)

モデルファインチューニングコンソールの下部で推定トレーニング料金を確認し、課金詳細 をクリックして、トレーニングトークンの総数、エポック数、トレーニング単価を表示できます。

トレーニング単価

以下の表は、事前構築済みモデルのトレーニング単価を示しています。カスタムモデルのトレーニング単価は、対応する事前構築済みモデルと同じです。

シンガポール

Qwen

モデルサービス

モデルコード

価格

Qwen3-14B

qwen3-14b

$0.0016/1,000 トークン

Qwen-VL

モデルサービス

モデルコード

価格

-

-

-

画像と動画のトークン計算

画像

計算式: 画像トークン = h_bar * w_bar / token_pixels + 2

  • h_bar, w_bar:スケーリングされた画像の高さと幅。画像を処理する前に、モデルは前処理を行い、特定のピクセル制限まで画像を縮小します。この制限は、max_pixels および vl_high_resolution_images パラメーターの値に依存します。詳細については、「高解像度画像の処理」をご参照ください。

  • token_pixels:各視覚 token に対応するピクセル値。これはモデルによって異なります:

    • qwen3.8-seriesqwen3.7-seriesqwen3.6-seriesqwen3.5-seriesQwen3-VLqwen-vl-max、および qwen-vl-plustoken32x32 ピクセルに対応します。
    • QVQ およびその他の Qwen2.5-VL モデル各トークンは 28x28 ピクセルに対応します。

以下のコードは、モデルが使用するおおよその画像スケーリングロジックを示しています。これを使用して画像のトークンを推定してください。実際の課金については、API の応答をご参照ください。

import math
from PIL import Image  # pip install Pillow

def smart_resize(image_path, max_pixels, vl_high_resolution_images):
    """モデルパラメーターに基づいて画像のスケーリング後の寸法を計算し、画像トークンを推定します。"""
    image = Image.open(image_path)
    height, width = image.height, image.width

    # スケーリング係数は、Qwen3.6、Qwen3.5、Qwen3-VL などのモデルでは 32 です。その他のモデルでは 28 です。
    factor = 32
    h_bar = round(height / factor) * factor
    w_bar = round(width / factor) * factor

    # トークンの下限:4 トークン
    min_pixels = 4 * factor * factor

    # vl_high_resolution_images=True の場合、トークンの上限は 16384 に固定され、max_pixels は無視されます。
    if vl_high_resolution_images:
        max_pixels = 16384 * factor * factor

    # ピクセルの総数を [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__":
    # 注:max_pixels と vl_high_resolution_images の値は、モデル呼び出し時に渡すパラメーターと一致させる必要があります。
    h_bar, w_bar = smart_resize("xxx/test.jpg", max_pixels=2560 * 32 * 32, vl_high_resolution_images=False)
    print(f"スケーリング後の画像寸法:高さ {h_bar}, 幅 {w_bar}")

    # 各画像には、1 つの <vision_bos> と 1 つの <vision_eos> トークンが含まれます。
    token = int(h_bar * w_bar / (32 * 32)) + 2
    print(f"画像トークン数:{token}")

動画

  • 動画ファイル:

    動画ファイルを処理する際、モデルはまずフレームを抽出し、次にすべてのビデオフレームの総トークン数を計算します。この計算は複雑なため、以下のコードを使用して、パスを指定することで動画の総トークン消費量を推定できます:

# 使用前にインストールしてください:pip install opencv-python
import math
import os
import logging
import cv2

logger = logging.getLogger(__name__)

FRAME_FACTOR = 2

# Qwen3.6、Qwen3.5、Qwen3-VL、qwen-vl-max-0813、qwen-vl-plus-0815、qwen-vl-plus-0710 などのモデルでは、画像のスケーリング係数は 32 です。
IMAGE_FACTOR = 32

# その他のモデルでは、画像のスケーリング係数は 28 です。
# IMAGE_FACTOR = 28

# ビデオフレームの最大アスペクト比
MAX_RATIO = 200
# ビデオフレームのピクセル下限
VIDEO_MIN_PIXELS = 4 * 32 * 32
# ビデオフレームのピクセル上限。Qwen3-VL-Plus モデルの場合、VIDEO_MAX_PIXELS は 640 * 32 * 32 です。その他のモデルでは 768 * 32 * 32 です。
VIDEO_MAX_PIXELS = 640 * 32 * 32

# ユーザーが FPS パラメーターを渡さない場合、fps にはデフォルト値が使用されます。
FPS = 2.0
# 抽出される最小フレーム数
FPS_MIN_FRAMES = 4
# 抽出される最大フレーム数 (選択したモデルに基づいて設定)
FPS_MAX_FRAMES = 2000

# ビデオ入力の最大ピクセル値。Qwen3-VL-Plus モデルの場合、VIDEO_TOTAL_PIXELS を 131072 * 32 * 32 に設定します。その他のモデルでは 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:
    """'number' に最も近く、'factor' で割り切れる整数を返します。"""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """'number' 以上で、'factor' で割り切れる最小の整数を返します。"""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """'number' 以下で、'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):
    """抽出されるビデオフレームの数を計算します。

    Args:
        ele (dict): ビデオ設定を含む辞書。
            - fps: モデル用に抽出される入力フレームの数を制御します。
        total_frames (int): ビデオの元の総フレーム数。
        video_fps (int | float): ビデオの元のフレームレート。

    Raises:
        nframes が [FRAME_FACTOR, total_frames] の範囲内にない場合、エラーが報告されます。

    Returns:
        モデル入力用のビデオフレーム数。
    """
    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):
    # ビデオ情報を取得
    cap = cv2.VideoCapture(video_path)

    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    # ビデオの高さを取得
    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):
    # ビデオの元の幅と高さを取得
    height, width, total_frames, video_fps = get_video(path)
    # ビデオフレームのトークン下限
    min_pixels = VIDEO_MIN_PIXELS
    total_pixels = VIDEO_TOTAL_PIXELS
    # 抽出されるビデオフレーム数
    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))

    # ビデオのアスペクト比は 200:1 または 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):
    # ビデオパスと fps フレーム抽出パラメーターを渡します。
    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"元のビデオ寸法:{height}*{width}, モデル入力寸法:{resized_height}*{resized_width}, ビデオ総フレーム数:{total_frames}, fps が {fps} の場合に抽出される総フレーム数:{num_frames}", end=", ")
    video_token = int(math.ceil(num_frames / 2) * resized_height / 32 * resized_width / 32)
    video_token += 2   # システムは自動的に <|vision_bos|> と <|vision_eos|> の視覚マーカー (各 1 トークン) を追加します。
    return video_token

video_token = token_calculate("xxx/test.mp4", 1)
print("ビデオトークン:", video_token)
  • 画像リスト:

    動画が画像リストとして渡される場合、それはフレーム抽出がすでに行われていることを意味します。以下のコードを使用して、パスと画像数を指定することでトークン消費量を計算します:

# 使用前にインストールしてください:pip install Pillow
import math
import os
import logging
from typing import Tuple
from PIL import Image

logger = logging.getLogger(__name__)

# ==================== 定数定義 ====================
FRAME_FACTOR = 2
# Qwen3-VL、qwen-vl-max-0813、qwen-vl-plus-0815、qwen-vl-plus-0710 などのモデルでは、スケーリング係数は 32 です。
IMAGE_FACTOR = 32

# その他のモデルでは、スケーリング係数は 28 です。
# IMAGE_FACTOR = 28

# トークン計算用の定数
TOKEN_DIVISOR = 32  # トークン計算の除数
VISION_SPECIAL_TOKENS = 2  # <|vision_bos|> および <|vision_eos|> マーカー

# ビデオフレームの最大アスペクト比
MAX_RATIO = 200
# ビデオフレームのピクセル下限
VIDEO_MIN_PIXELS = 4 * 32 * 32
# ビデオフレームのピクセル上限。Qwen3-VL-Plus モデルの場合、VIDEO_MAX_PIXELS は 640 * 32 * 32 です。その他のモデルでは 768 * 32 * 32 です。
VIDEO_MAX_PIXELS = 640 * 32 * 32

# ビデオ入力の最大ピクセル値。Qwen3-VL-Plus モデルの場合、VIDEO_TOTAL_PIXELS を 131072 * 32 * 32 に設定します。その他のモデルでは 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:
    """'number' に最も近く、'factor' で割り切れる整数を返します。"""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """'number' 以上で、'factor' で割り切れる最小の整数を返します。"""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """'number' 以下で、'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_path}")

    try:
        image = Image.open(image_path)
        height = image.height
        width = image.width
        image.close()  # ファイルを速やかに閉じます
        return height, width
    except Exception as e:
        raise ValueError(f"画像ファイル {image_path} を読み取れません:{str(e)}")

def smart_resize(height: int, width: int, nframes: int, factor: int = IMAGE_FACTOR) -> Tuple[int, int]:
    """
    画像のスケーリング後の寸法を計算します

    Args:
        height: 元の画像の高さ
        width: 元の画像の幅
        nframes: ビデオフレーム数
        factor: スケーリング係数、デフォルトは IMAGE_FACTOR

    Returns:
        (resized_height, resized_width) スケーリング後の高さと幅

    Raises:
        ValueError: アスペクト比が制限を超えた場合
    """
    # ビデオフレームのトークン下限
    min_pixels = VIDEO_MIN_PIXELS
    total_pixels = VIDEO_TOTAL_PIXELS
    # 抽出されるビデオフレーム数
    max_pixels = max(min(VIDEO_MAX_PIXELS, total_pixels / nframes * FRAME_FACTOR), int(min_pixels * 1.05))

    # ビデオのアスペクト比は 200:1 または 1:200 を超えてはなりません。
    aspect_ratio = max(height, width) / min(height, width)
    if aspect_ratio > MAX_RATIO:
        raise ValueError(
            f"画像のアスペクト比は {MAX_RATIO}:1 未満でなければなりませんが、現在は {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: ビデオフレームファイルへのパス
        nframes: ビデオフレーム数
        factor: スケーリング係数、デフォルトは IMAGE_FACTOR
        verbose: 詳細情報を表示するかどうか

    Returns:
        消費されるトークン数

    Raises:
        FileNotFoundError: ファイルが存在しない場合
        ValueError: ファイル形式が無効、またはアスペクト比が制限を超えている場合
    """
    # 元の画像寸法を取得 (一度だけ読み取り)
    height, width = get_image_size(image_path)

    # スケーリング後の寸法を計算
    resized_height, resized_width = smart_resize(height, width, nframes, factor)

    # トークン数を計算
    # 計算式: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)
    )
    # 視覚マーカートークン (<|vision_bos|> と <|vision_eos|>) を追加
    video_token += VISION_SPECIAL_TOKENS

    if verbose:
        print(f"元のビデオフレーム寸法:{height}x{width}, モデル入力寸法:{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_token}\n")
    except Exception as e:
        print(f"エラー:{str(e)}\n")

中国北部 2 (北京)

Qwen

モデルサービス

モデルコード

価格

Qwen3.5-27B

qwen3.5-27b

$0.006876/1,000 トークン

Qwen3.5-9B

qwen3.5-9b

$0.00275/1,000 トークン

Qwen3-32B

qwen3-32b

$0.005501/1,000 トークン

Qwen3-30B-A3B-Instruct-2507

qwen3-30b-a3b-instruct-2507

$0.004126/1,000 トークン

Qwen3-14B

qwen3-14b

$0.004126/1,000 トークン

Qwen3-8B

qwen3-8b

$0.000825/1,000 トークン

Qwen3-4B-Instruct-2507

qwen3-4b-instruct-2507

$0.000825/1,000 トークン

Qwen3-1.7B

qwen3-1.7b

$0.000619/1,000 トークン

Qwen3-0.6B

qwen3-0.6b

$0.000413/1,000 トークン

Qwen2.5-72B-Instruct

qwen2.5-72b-instruct

$0.020628/1,000 トークン

Qwen2.5-32B-Instruct

qwen2.5-32b-instruct

$0.004126/1,000 トークン

Qwen2.5-14B-Instruct

qwen2.5-14b-instruct

$0.004126/1,000 トークン

Qwen2.5-7B-Instruct

qwen2.5-7b-instruct

$0.000825/1,000 トークン

Qwen-Plus-Character-2025-11-06

qwen-plus-character-2025-11-06

$0.020628/1,000 トークン

Qwen-VL

モデルサービス

モデルコード

価格

Qwen3-VL-8B-Instruct

qwen3-vl-8b-instruct

$0.00165/1,000 トークン

Qwen3-VL-8B-Thinking

qwen3-vl-8b-thinking

$0.00165/1,000 トークン

Qwen3-VL-4B-Instruct

qwen3-vl-4b-instruct

$0.000825/1,000 トークン

Qwen2.5-VL-72B-Instruct

qwen2.5-vl-72b-instruct

$0.006876/1,000 トークン

Qwen2.5-VL-32B-Instruct

qwen2.5-vl-32b-instruct

$0.00275/1,000 トークン

Qwen2.5-VL-7B-Instruct

qwen2.5-vl-7b-instruct

$0.001375/1,000 トークン

画像と動画のトークン計算

画像

計算式: 画像トークン = h_bar * w_bar / token_pixels + 2

  • h_bar, w_bar:スケーリングされた画像の高さと幅。画像を処理する前に、モデルは前処理を行い、特定のピクセル制限まで画像を縮小します。この制限は、max_pixels および vl_high_resolution_images パラメーターの値に依存します。詳細については、「高解像度画像の処理」をご参照ください。

  • token_pixels:各視覚 token に対応するピクセル値。これはモデルによって異なります:

    • qwen3.8-seriesqwen3.7-seriesqwen3.6-seriesqwen3.5-seriesQwen3-VLqwen-vl-max、および qwen-vl-plustoken32x32 ピクセルに対応します。
    • QVQ およびその他の Qwen2.5-VL モデル各トークンは 28x28 ピクセルに対応します。

以下のコードは、モデルが使用するおおよその画像スケーリングロジックを示しています。これを使用して画像のトークンを推定してください。実際の課金については、API の応答をご参照ください。

import math
from PIL import Image  # pip install Pillow

def smart_resize(image_path, max_pixels, vl_high_resolution_images):
    """モデルパラメーターに基づいて画像のスケーリング後の寸法を計算し、画像トークンを推定します。"""
    image = Image.open(image_path)
    height, width = image.height, image.width

    # スケーリング係数は、Qwen3.6、Qwen3.5、Qwen3-VL などのモデルでは 32 です。その他のモデルでは 28 です。
    factor = 32
    h_bar = round(height / factor) * factor
    w_bar = round(width / factor) * factor

    # トークンの下限:4 トークン
    min_pixels = 4 * factor * factor

    # vl_high_resolution_images=True の場合、トークンの上限は 16384 に固定され、max_pixels は無視されます。
    if vl_high_resolution_images:
        max_pixels = 16384 * factor * factor

    # ピクセルの総数を [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__":
    # 注:max_pixels と vl_high_resolution_images の値は、モデル呼び出し時に渡すパラメーターと一致させる必要があります。
    h_bar, w_bar = smart_resize("xxx/test.jpg", max_pixels=2560 * 32 * 32, vl_high_resolution_images=False)
    print(f"スケーリング後の画像寸法:高さ {h_bar}, 幅 {w_bar}")

    # 各画像には、1 つの <vision_bos> と 1 つの <vision_eos> トークンが含まれます。
    token = int(h_bar * w_bar / (32 * 32)) + 2
    print(f"画像トークン数:{token}")

動画

  • 動画ファイル:

    動画ファイルを処理する際、モデルはまずフレームを抽出し、次にすべてのビデオフレームの総トークン数を計算します。この計算は複雑なため、以下のコードを使用して、パスを指定することで動画の総トークン消費量を推定できます:

# 使用前にインストールしてください:pip install opencv-python
import math
import os
import logging
import cv2

logger = logging.getLogger(__name__)

FRAME_FACTOR = 2

# Qwen3.6、Qwen3.5、Qwen3-VL、qwen-vl-max-0813、qwen-vl-plus-0815、qwen-vl-plus-0710 などのモデルでは、画像のスケーリング係数は 32 です。
IMAGE_FACTOR = 32

# その他のモデルでは、画像のスケーリング係数は 28 です。
# IMAGE_FACTOR = 28

# ビデオフレームの最大アスペクト比
MAX_RATIO = 200
# ビデオフレームのピクセル下限
VIDEO_MIN_PIXELS = 4 * 32 * 32
# ビデオフレームのピクセル上限。Qwen3-VL-Plus モデルの場合、VIDEO_MAX_PIXELS は 640 * 32 * 32 です。その他のモデルでは 768 * 32 * 32 です。
VIDEO_MAX_PIXELS = 640 * 32 * 32

# ユーザーが FPS パラメーターを渡さない場合、fps にはデフォルト値が使用されます。
FPS = 2.0
# 抽出される最小フレーム数
FPS_MIN_FRAMES = 4
# 抽出される最大フレーム数 (選択したモデルに基づいて設定)
FPS_MAX_FRAMES = 2000

# ビデオ入力の最大ピクセル値。Qwen3-VL-Plus モデルの場合、VIDEO_TOTAL_PIXELS を 131072 * 32 * 32 に設定します。その他のモデルでは 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:
    """'number' に最も近く、'factor' で割り切れる整数を返します。"""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """'number' 以上で、'factor' で割り切れる最小の整数を返します。"""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """'number' 以下で、'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):
    """抽出されるビデオフレームの数を計算します。

    Args:
        ele (dict): ビデオ設定を含む辞書。
            - fps: モデル用に抽出される入力フレームの数を制御します。
        total_frames (int): ビデオの元の総フレーム数。
        video_fps (int | float): ビデオの元のフレームレート。

    Raises:
        nframes が [FRAME_FACTOR, total_frames] の範囲内にない場合、エラーが報告されます。

    Returns:
        モデル入力用のビデオフレーム数。
    """
    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):
    # ビデオ情報を取得
    cap = cv2.VideoCapture(video_path)

    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    # ビデオの高さを取得
    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):
    # ビデオの元の幅と高さを取得
    height, width, total_frames, video_fps = get_video(path)
    # ビデオフレームのトークン下限
    min_pixels = VIDEO_MIN_PIXELS
    total_pixels = VIDEO_TOTAL_PIXELS
    # 抽出されるビデオフレーム数
    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))

    # ビデオのアスペクト比は 200:1 または 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):
    # ビデオパスと fps フレーム抽出パラメーターを渡します。
    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"元のビデオ寸法:{height}*{width}, モデル入力寸法:{resized_height}*{resized_width}, ビデオ総フレーム数:{total_frames}, fps が {fps} の場合に抽出される総フレーム数:{num_frames}", end=", ")
    video_token = int(math.ceil(num_frames / 2) * resized_height / 32 * resized_width / 32)
    video_token += 2   # システムは自動的に <|vision_bos|> と <|vision_eos|> の視覚マーカー (各 1 トークン) を追加します。
    return video_token

video_token = token_calculate("xxx/test.mp4", 1)
print("ビデオトークン:", video_token)
  • 画像リスト:

    動画が画像リストとして渡される場合、それはフレーム抽出がすでに行われていることを意味します。以下のコードを使用して、パスと画像数を指定することでトークン消費量を計算します:

# 使用前にインストールしてください:pip install Pillow
import math
import os
import logging
from typing import Tuple
from PIL import Image

logger = logging.getLogger(__name__)

# ==================== 定数定義 ====================
FRAME_FACTOR = 2
# Qwen3-VL、qwen-vl-max-0813、qwen-vl-plus-0815、qwen-vl-plus-0710 などのモデルでは、スケーリング係数は 32 です。
IMAGE_FACTOR = 32

# その他のモデルでは、スケーリング係数は 28 です。
# IMAGE_FACTOR = 28

# トークン計算用の定数
TOKEN_DIVISOR = 32  # トークン計算の除数
VISION_SPECIAL_TOKENS = 2  # <|vision_bos|> および <|vision_eos|> マーカー

# ビデオフレームの最大アスペクト比
MAX_RATIO = 200
# ビデオフレームのピクセル下限
VIDEO_MIN_PIXELS = 4 * 32 * 32
# ビデオフレームのピクセル上限。Qwen3-VL-Plus モデルの場合、VIDEO_MAX_PIXELS は 640 * 32 * 32 です。その他のモデルでは 768 * 32 * 32 です。
VIDEO_MAX_PIXELS = 640 * 32 * 32

# ビデオ入力の最大ピクセル値。Qwen3-VL-Plus モデルの場合、VIDEO_TOTAL_PIXELS を 131072 * 32 * 32 に設定します。その他のモデルでは 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:
    """'number' に最も近く、'factor' で割り切れる整数を返します。"""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """'number' 以上で、'factor' で割り切れる最小の整数を返します。"""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """'number' 以下で、'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_path}")

    try:
        image = Image.open(image_path)
        height = image.height
        width = image.width
        image.close()  # ファイルを速やかに閉じます
        return height, width
    except Exception as e:
        raise ValueError(f"画像ファイル {image_path} を読み取れません:{str(e)}")

def smart_resize(height: int, width: int, nframes: int, factor: int = IMAGE_FACTOR) -> Tuple[int, int]:
    """
    画像のスケーリング後の寸法を計算します

    Args:
        height: 元の画像の高さ
        width: 元の画像の幅
        nframes: ビデオフレーム数
        factor: スケーリング係数、デフォルトは IMAGE_FACTOR

    Returns:
        (resized_height, resized_width) スケーリング後の高さと幅

    Raises:
        ValueError: アスペクト比が制限を超えた場合
    """
    # ビデオフレームのトークン下限
    min_pixels = VIDEO_MIN_PIXELS
    total_pixels = VIDEO_TOTAL_PIXELS
    # 抽出されるビデオフレーム数
    max_pixels = max(min(VIDEO_MAX_PIXELS, total_pixels / nframes * FRAME_FACTOR), int(min_pixels * 1.05))

    # ビデオのアスペクト比は 200:1 または 1:200 を超えてはなりません。
    aspect_ratio = max(height, width) / min(height, width)
    if aspect_ratio > MAX_RATIO:
        raise ValueError(
            f"画像のアスペクト比は {MAX_RATIO}:1 未満でなければなりませんが、現在は {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: ビデオフレームファイルへのパス
        nframes: ビデオフレーム数
        factor: スケーリング係数、デフォルトは IMAGE_FACTOR
        verbose: 詳細情報を表示するかどうか

    Returns:
        消費されるトークン数

    Raises:
        FileNotFoundError: ファイルが存在しない場合
        ValueError: ファイル形式が無効、またはアスペクト比が制限を超えている場合
    """
    # 元の画像寸法を取得 (一度だけ読み取り)
    height, width = get_image_size(image_path)

    # スケーリング後の寸法を計算
    resized_height, resized_width = smart_resize(height, width, nframes, factor)

    # トークン数を計算
    # 計算式:ceil(nframes/2) * (height/TOKEN_DIVISOR) * (width/TOKEN_DIVISOR) + VISION_SPECIAL_TOKENS
    video_token = int(
        math.ceil(nframes / 2) *
        (resized_height / TOKEN_DIV# 視覚マーカートークン (<|vision_bos|> と <|vision_eos|>) を追加
    video_token += VISION_SPECIAL_TOKENS

    if verbose:
        print(f"元のビデオフレーム寸法:{height}x{width}, モデル入力寸法:{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_token}\n")
    except Exception as e:
        print(f"エラー:{str(e)}\n")

モデルのファインチューニングを行う前の注意事項

  • テキスト生成モデルのファインチューニングは、特定のビジネスシナリオで優れた効果を発揮しますが、以下の制限事項があります:

    • 時間がかかる:大規模な CPT データセット (少なくとも 5,000 万トークン) の作成、効果的な SFT データセット (1,000 件以上) の構築、効果的な DPO データセットを構築するための十分な不正解例 (100 件以上) の収集、そしてモデルの最適化の反復速度が遅いことなどが含まれます。
    • 高コスト:ファインチューニング済みモデルはデプロイメント後にのみ使用でき、モデルデプロイメントの課金は高額です。
  • Alibaba Cloud Model Studio では、まず プロンプトエンジニアリング または Function Calling を使用してアプリケーションをカスタマイズすることを推奨します。モデルのファインチューニングは、通常、モデルのパフォーマンスを向上させるための「最終手段」です。その理由は次のとおりです:

    1. 多くのタスクにおいて、モデルは初期段階ではパフォーマンスが低い場合がありますが、適切なプロンプト技術を適用することで、モデルのファインチューニングを行わなくても結果を改善できます。
    2. プロンプトとプラグインを反復的に最適化する方が、モデルのファインチューニングの反復よりもアジャイルでコスト効率が高いです。なぜなら、ファインチューニングでは、データの再収集、クリーニング、最適化、不正解例の収集、顧客調査が必要になる場合があるためです。
    3. 最終的にモデルのファインチューニングを行うことを決定した場合でも、プロンプトエンジニアリングとプラグインの最適化に関する初期作業は無駄にはなりません。この事前作業は、ファインチューニングデータセットを構築する際に完全に再利用できます。

クイックスタート

コンソールを使用したモデルのファインチューニング

ファインチューニングの手順

コンソールのスクリーンショット

ステップ 1モデルのファインチューニング ページで、トレーニングタスクを作成する をクリックします。

[トレーニングタスクの作成] ページで、次の設定を完了します。

  1. トレーニングタイプを [SFT ファインチューニングトレーニング] に設定します。

  2. モデルとして [Qwen3-8B] を選択します。

  3. トレーニング方法を [効率的なトレーニング] に設定します。

  4. ハイパーパラメーター設定で、batch_size16 に設定します (範囲: [8, 1024]、ステップ: 8)。

  5. 右側の [トレーニングタスクの概要] パネルで、課金方法がトークンベースの課金であること、およびトレーニングセットの 10% が検証データセットとして自動的に分割されることを確認し、[トレーニングの開始] をクリックします。

ステップ 2: トレーニングの設定

  • 学習方式Supervised Fine-tuning (SFT)

  • Select Model: Qwen3-8B

  • 学習方式Efficient Training

  • パラメータ設定: Model Studio はファインチューニングのハイパーパラメーターに推奨設定を提供するため、デフォルト設定のままでかまいません。

この組み合わせは、トレーニング時間が短く、データ要件も低く抑えられます。

ステップ 3: データの設定

  • 訓練データセット: アップロードしたファインチューニングデータセットを選択してモデルを構築します。

    データサンプル: SFT-ChatML_format_example.jsonl

  • ミックストレーニング: 無効

  • 検証セット自動分割 に設定すると、データの 10% が検証データセットとして使用されます。

ステップ 4: モデルパラメーターのスナップショット (チェックポイント) の保存パラメーターの設定

  • モデル名 は、デフォルト名のままにします。

  • [最大エクスポート数]: デフォルト値を保持します。

  • Checkpoint保存間隔: デフォルト値のままにします。

モデルのファインチューニングが完了した後、Model Studio プラットフォームでパラメータースナップショットをエクスポートできます。その後、このパラメータースナップショットに基づいて Model Studio 上でモデルをデプロイできます。

エクスポートされたパラメータースナップショットはクラウドストレージに保存され、アクセスやダウンロードはできません。

ステップ 5: [トレーニングの開始] をクリックし、モデルトレーニングが完了するのを待ちます。

ステップ 6: Alibaba Cloud Model Studio の デプロイメント 機能を使用して、トレーニング済みのカスタムモデルをデプロイします。デプロイ後、ファインチューニングされたモデルを評価できます。詳細については、「モデルのデプロイメント」をご参照ください。

一般的なファインチューニングプロセス

Model Studio が提供する 3 つのファインチューニング方法は、相互排他的なものではなく、段階的かつ補完的な関係にあります。

CPT (オプション) → SFT → DPO (オプション)

  1. CPT (継続的事前学習) - 知識の補完 (汎用モデルは知識が広く浅いため、専門分野で求められる深さと精度を満たせない場合があります)

    • 金融モデル: 金融用語の学習
    • 医療モデル: 薬剤病理の記憶
    • 法律モデル: 法条文と判例の理解
  2. SFT (教師ありファインチューニング) - タスク実行方法の学習

    • カスタマーサービスボット: カスタマーサービス手順の学習
    • コードアシスタント: プログラミングパラダイムの学習
    • ツール呼び出し (エージェント): MCP の使用方法の学習
  3. DPO (Direct Preference Optimization) - タスク実行能力の向上

    • 安全性と責任: 有害な提案の拒否
    • 簡潔さと有効性: 簡潔な回答の提供
    • 客観性と中立性: 公正かつ客観的な評価

ファインチューニングのデータ形式

SFT トレーニングセット

SFT ChatML (Chat Markup Language) 形式のトレーニングデータは、マルチターン対話とさまざまなロール設定をサポートします。

OpenAI の name および weight パラメーターはサポートされていません。すべての assistant の出力がトレーニングされます。

# 1行のトレーニングデータ (JSON 形式) を展開すると、通常、次のような構造になります。
{"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"}
  ...
]}

system、user、assistant の違いについては、「概要」をご参照ください。トレーニングデータセットのサンプル:SFT-ChatML_format_example.jsonlSFT-ChatML_format_example.xlsx。XLS および XLSX 形式は、単一ターンの対話のみをサポートします。

1つのトレーニングデータ入力におけるすべての assistant の行は、トレーニング中にその行の相対的な重要度を設定する "loss_weight" パラメーターをサポートします。(有効値:0.01.0。値が大きいほど重要度が高くなります。)

このパラメーターは招待プレビューで利用できます。使用するには、アカウントマネージャーにご連絡ください。

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

データセット構築のヒント

データセットサイズの要件

CPT の場合、データセットには少なくとも 5,000 万トークンの高品質な事前学習データが必要です。SFT の場合、データセットには少なくとも 1,000 件の高品質なファインチューニングデータが必要です。DPO の場合、データセットには通常、数百件の人間の嗜好データが必要です。データのファインチューニング後のモデル評価結果が満足のいくものでない場合、最も簡単な改善方法は、トレーニングのためにより多くのデータを収集することです。

データが不足している場合は、エージェントアプリケーションを構築し、ナレッジベースインデックスを使用してモデルの能力を強化することを推奨します。多くの複雑なビジネスシナリオでは、モデルファインチューニングとナレッジベース検索を組み合わせて使用することもできます。

たとえば、カスタマーサービスのシナリオでは、モデルファインチューニングを使用して、カスタマーサービスエージェントの口調、表現スタイル、自己認識に関する問題に対処できます。シナリオに関連する専門知識は、ナレッジベースを使用してモデルのコンテキストに動的に導入できます。

Alibaba Cloud Model Studio では、まず検索拡張生成 (RAG) アプリケーションを構築してテストすることを推奨します。十分なアプリケーションデータを収集した後、モデルファインチューニングを使用してモデルのパフォーマンスをさらに向上させることができます。

また、以下の戦略を使用してデータセットを拡張することもできます:

  1. 大規模言語モデル (LLM) を使用して、特定のビジネスシナリオのコンテンツ生成をシミュレートし、ファインチューニング用のデータをより多く生成します。(生成には、より大規模で高性能なモデルを選択することを推奨します。)
  2. アプリケーションシナリオからの収集、Web スクレイピング、ソーシャルメディアやオンラインフォーラム、パブリックデータセット、パートナーや業界リソース、ユーザーからの提供など、さまざまな方法でより多くのデータを取得します。

データの多様性とバランス

モデルファインチューニングの要件はシナリオによって異なります。たとえば、特定のビジネスシナリオでは専門性が重要ですが、Q&A シナリオでは汎用性がより重要になります。モデルが担当するビジネスモジュールや利用シーンに基づいて、データユースケースを設計する必要があります。したがって、トレーニング効果はデータ量だけでなく、特定のシナリオに対するデータの専門性と多様性にも依存します。

たとえば、インテリジェント AI 対話シナリオでは、専門的で多様なデータセットには、以下のビジネスシナリオが含まれるべきです:

特定のビジネス

多様なシナリオ/ビジネス

E コマースカスタマーサービス

プロモーションのプッシュ、販売前コンサルティング、販売中ガイダンス、アフターサービス、アフターフォロー、苦情処理など。

金融サービス

ローン相談、投資・資産運用アドバイス、クレジットカードサービス、銀行口座管理など。

オンラインヘルスケア

症状相談、予約登録、受診案内、薬剤情報照会、健康に関するヒントなど。

AI 秘書

IT 情報、管理情報、人事情報、福利厚生照会、会社カレンダー照会など。

旅行アシスタント

旅行計画、出入国ガイド、旅行保険相談、目的地の習慣・文化紹介など。

企業法務

契約レビュー、知的財産保護、コンプライアンスチェック、労働法 Q&A、国際取引コンサルティング、個別ケースの法的分析など。

また、各シナリオ/ビジネスのデータ量は比較的バランスが取れており、データの割合が実際のシナリオの割合と一致している必要があることにも注意が必要です。これにより、あるタイプのデータが多すぎてモデルがそれらの特徴の学習に偏り、汎化能力に影響を与えるのを防ぎます。

トレーニングセットと検証データセットの分割

コンソールでモデルファインチューニングを実行できます。

  • 完全なトレーニングデータセットを自動的に分割し、少量のデータをランダムにサンプリングして検証データセットを形成します。
  • 別のデータセットをアップロードすることを選択します。

コンソールには、トレーニング中に検証データセットの損失とトークン精度がリアルタイムで表示されます。

[データ設定] ページには、ミックストレーニング の切り替えスイッチ (デフォルトでは無効) も含まれています。[自動分割] が選択されている場合、デフォルトでトレーニングセットの 10% がランダムに検証データセットとして分割されます。

よくある質問

独自のモデルをファインチューニングできますか?

Model Studio では、ファインチューニング、独自モデルのアップロード、ダウンロード済みモデルのエクスポートはサポートされていません。