使用 Gemini 模型持續調整功能

持續微調功能可讓您新增更多訓練週期或訓練範例,繼續微調已微調的模型或模型檢查點。使用已調整的模型或檢查點做為基礎模型,可更有效率地進行微調實驗。

持續調整功能可用於以下目的:

  • 如果現有微調模型欠擬合,可使用更多資料進行微調。
  • 提升成效,或使用新資料更新模型。
  • 進一步自訂現有微調模型。

下列 Gemini 模型支援持續微調:

如要進一步瞭解 Gemini 模型版本,請參閱「Google 模型」和「模型版本和生命週期」。

設定持續調整

建立持續微調工作時,請注意下列事項:

  • Google Gen AI SDK 支援持續微調。Python 適用的 Vertex AI SDK 不支援這項功能。
  • 必須提供模型資源名稱:

    • 在 Google Cloud 控制台中,模型資源名稱會顯示在「Vertex AI Tuning」頁面的「Tuning details > Model Name」欄位中。
    • 模型資源名稱的格式如下:
    projects/{project}/locations/{location}/models/{modelId}@{version_id}
    
    • {version_id} 為選用項目,可以是產生的版本 ID,也可以是使用者提供的版本別名。如果省略此屬性,系統會使用預設版本。
  • 如果您未指定模型版本,系統會使用預設版本。

  • 如果您使用檢查點做為基礎模型,但未指定檢查點 ID,系統會使用預設檢查點。詳情請參閱「在 Gemini 模型受監護微調作業中使用檢查點」。在 Google Cloud 控制台中,預設檢查點的位置如下:

    1. 前往「Model Registry」頁面。
    2. 點選模型的「模型名稱」
    3. 按一下「查看所有版本」
    4. 按一下所需版本,即可查看檢查點清單。預設檢查點的檢查點 ID 旁會顯示「預設」default
  • 根據預設,系統會在與預先調整模型相同的父項模型下,建立新的模型版本。如果您提供新的調整後模型顯示名稱,系統會建立新模型。

  • 只有在 2025 年 7 月 11 日當天或之後調整的監督式調整基礎模型,才能做為持續調整的基礎模型。

  • 如果您使用客戶自行管理的加密金鑰 (CMEK),持續微調作業必須使用與微調作業相同的 CMEK,才能微調預先微調的模型。

控制台

如要使用Google Cloud 控制台,為預先調整的模型設定持續調整功能,請按照下列步驟操作:

  1. 在 Google Cloud 控制台的 Vertex AI 專區中,前往「Vertex AI Studio」頁面。

    前往 Vertex AI Studio

  2. 按一下「Create tuned model」(建立調整後的模型)

  3. 在「Model details」(模型詳細資料) 下方,設定下列項目:

    1. 選擇「調整已預先調整的模型」
    2. 在「Pre-tuned model」(預先調整模型) 欄位中,選擇預先調整模型的名稱。
    3. 如果模型至少有一個檢查點,系統會顯示「檢查點」下拉式欄位。選擇所需的查核點。
  4. 按一下「繼續」

REST

如要設定持續微調,請使用 tuningJobs.create 方法傳送 POST 要求。部分參數不支援所有模型。請務必只加入要微調模型適用的參數。

使用任何要求資料之前,請先替換以下項目:

  • 持續調整的參數:
    • TUNED_MODEL_NAME:要使用的調整後模型名稱。
    • CHECKPOINT_ID選用:要使用的檢查點 ID。
  • 其餘參數與監督式微調偏好設定微調相同。

HTTP 方法和網址:

POST https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs

JSON 要求內文:

{
  "preTunedModel": {
      "tunedModelName": "TUNED_MODEL_NAME",
      "checkpointId": "CHECKPOINT_ID",
  },
  "supervisedTuningSpec" : {
      "trainingDatasetUri": "TRAINING_DATASET_URI",
      "validationDatasetUri": "VALIDATION_DATASET_URI",
      "hyperParameters": {
          "epochCount": EPOCH_COUNT,
          "adapterSize": "ADAPTER_SIZE",
          "learningRateMultiplier": "LEARNING_RATE_MULTIPLIER"
      },
      "exportLastCheckpointOnly": EXPORT_LAST_CHECKPOINT_ONLY,
      "evaluationConfig": {
          "metrics": [
              {
                  "aggregation_metrics": ["AVERAGE", "STANDARD_DEVIATION"],
                  "METRIC_SPEC": {
                      "METRIC_SPEC_FIELD_NAME":
                          METRIC_SPEC_FIELD_CONTENT
                  }
              },
          ],
          "outputConfig": {
              "gcs_destination": {
                  "output_uri_prefix": "CLOUD_STORAGE_BUCKET"
              }
          },
      },
  },
  "tunedModelDisplayName": "TUNED_MODEL_DISPLAYNAME",
  "encryptionSpec": {
    "kmsKeyName": "KMS_KEY_NAME"
  },
  "serviceAccount": "SERVICE_ACCOUNT"
}

如要傳送要求,請選擇以下其中一個選項:

curl

將要求內文儲存在名為 request.json 的檔案中,然後執行下列指令:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs"

PowerShell

將要求主體儲存在名為 request.json 的檔案中,然後執行下列指令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://TUNING_JOB_REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/TUNING_JOB_REGION/tuningJobs" | Select-Object -Expand Content

您應該會收到類似如下的 JSON 回應。

cURL 指令範例

PROJECT_ID=myproject
LOCATION=global
curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
"https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/tuningJobs" \
-d \
$'{
   "preTunedModel": "gemini-2.5-flash",
   "supervisedTuningSpec" : {
      "trainingDatasetUri": "gs://cloud-samples-data/ai-platform/generative_ai/gemini/text/sft_train_data.jsonl",
      "validationDatasetUri": "gs://cloud-samples-data/ai-platform/generative_ai/gemini/text/sft_validation_data.jsonl"
   },
   "tunedModelDisplayName": "tuned_gemini"
}'

Google Gen AI SDK

以下範例說明如何使用 Google Gen AI SDK 設定持續微調。

import time

from google import genai
from google.genai.types import HttpOptions, TuningDataset, CreateTuningJobConfig

# TODO(developer): Update and un-comment below line
# tuned_model_name = "projects/123456789012/locations/us-central1/models/1234567890@1"
# checkpoint_id = "1"

client = genai.Client(http_options=HttpOptions(api_version="v1beta1"))

training_dataset = TuningDataset(
    gcs_uri="gs://cloud-samples-data/ai-platform/generative_ai/gemini/text/sft_train_data.jsonl",
)
validation_dataset = TuningDataset(
    gcs_uri="gs://cloud-samples-data/ai-platform/generative_ai/gemini/text/sft_validation_data.jsonl",
)

tuning_job = client.tunings.tune(
    base_model=tuned_model_name,  # Note: Using a Tuned Model
    training_dataset=training_dataset,
    config=CreateTuningJobConfig(
        tuned_model_display_name="Example tuning job",
        validation_dataset=validation_dataset,
        pre_tuned_model_checkpoint_id=checkpoint_id,
    ),
)

running_states = set([
    "JOB_STATE_PENDING",
    "JOB_STATE_RUNNING",
])

while tuning_job.state in running_states:
    print(tuning_job.state)
    tuning_job = client.tunings.get(name=tuning_job.name)
    time.sleep(60)

print(tuning_job.tuned_model.model)
print(tuning_job.tuned_model.endpoint)
print(tuning_job.experiment)
# Example response:
# projects/123456789012/locations/us-central1/models/1234567890@2
# projects/123456789012/locations/us-central1/endpoints/123456789012345
# projects/123456789012/locations/us-central1/metadataStores/default/contexts/tuning-experiment-2025010112345678

if tuning_job.tuned_model.checkpoints:
    for i, checkpoint in enumerate(tuning_job.tuned_model.checkpoints):
        print(f"Checkpoint {i + 1}: ", checkpoint)
    # Example response:
    # Checkpoint 1:  checkpoint_id='1' epoch=1 step=10 endpoint='projects/123456789012/locations/us-central1/endpoints/123456789000000'
    # Checkpoint 2:  checkpoint_id='2' epoch=2 step=20 endpoint='projects/123456789012/locations/us-central1/endpoints/123456789012345'