آموزش تنظیم دقیق

این آموزش به شما کمک می کند تا با استفاده از Python SDK یا REST API با استفاده از curl شروع به کار با سرویس تنظیم API Gemini کنید. مثال‌ها نحوه تنظیم مدل متنی در پشت سرویس تولید متن Gemini API را نشان می‌دهند.

مشاهده در ai.google.dev یک نوت بوک کولب را امتحان کنید مشاهده نوت بوک در GitHub

محدودیت ها

قبل از تنظیم یک مدل، باید از محدودیت های زیر آگاه باشید:

تنظیم دقیق مجموعه داده ها

مجموعه داده های تنظیم دقیق برای Gemini 1.5 Flash دارای محدودیت های زیر است:

  • حداکثر اندازه ورودی در هر نمونه 40000 کاراکتر است.
  • حداکثر اندازه خروجی در هر نمونه 5000 کاراکتر است.
  • فقط نمونه های جفت ورودی-خروجی پشتیبانی می شوند. مکالمات چند نوبتی به سبک چت پشتیبانی نمی شود.

مدل های تیون شده

مدل های تنظیم شده دارای محدودیت های زیر هستند:

  • محدودیت ورودی یک مدل فلش جمینی 1.5 تنظیم شده 40000 کاراکتر است.
  • حالت JSON با مدل های تنظیم شده پشتیبانی نمی شود.
  • فقط ورودی متن پشتیبانی می شود.

احراز هویت را تنظیم کنید

Gemini API به شما امکان می دهد مدل ها را بر اساس داده های خود تنظیم کنید. از آنجایی که داده‌های شما و مدل‌های تنظیم‌شده شما هستند، به کنترل‌های دسترسی دقیق‌تری نسبت به کلیدهای API نیاز دارد. قبل از اینکه بتوانید این آموزش را اجرا کنید، باید OAuth را برای پروژه خود راه اندازی کنید و سپس "OAuth Client ID" را به عنوان "client_secret.json" دانلود کنید. با این حال، برای استفاده از یک مدل تنظیم شده، به اعتبارنامه OAuth نیاز ندارید. بعد از اینکه یک مدل را با استفاده از OAuth تنظیم کردید، می توانید با استفاده از کلید API خود به آن دسترسی داشته باشید.

این دستور gcloud فایل client_secret.json را به اعتبارنامه هایی تبدیل می کند که می توان از آنها برای احراز هویت با سرویس استفاده کرد.

gcloud auth application-default login \
    --client-id-file client_secret.json \
    --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning'

متغیرها را تنظیم کنید

CURL

متغیرهایی را برای مقادیر تکرارشونده تنظیم کنید تا برای بقیه تماس‌های REST API استفاده کنید. کد از کتابخانه os پایتون برای تنظیم متغیرهای محیطی استفاده می کند که در تمام سلول های کد قابل دسترسی است.

این مخصوص محیط نوت بوک Colab است. کد موجود در سلول کد بعدی معادل اجرای دستورات زیر در ترمینال bash است.

export access_token=$(gcloud auth application-default print-access-token)
export project_id=my-project-id
export base_url=https://generativelanguage.googleapis.com
import os

access_token = !gcloud auth application-default print-access-token
access_token = '\n'.join(access_token)

os.environ['access_token'] = access_token
os.environ['project_id'] = "[Enter your project-id here]"
os.environ['base_url'] = "https://generativelanguage.googleapis.com"

پایتون

access_token = !gcloud auth application-default print-access-token
access_token = '\n'.join(access_token)

project = '[Enter your project-id here]'
base_url = "https://generativelanguage.googleapis.com"

کتابخانه requests را وارد کنید.

import requests
import json

مدل های تنظیم شده را لیست کنید

با فهرست کردن مدل‌های تنظیم‌شده موجود، تنظیمات احراز هویت خود را تأیید کنید.

CURL


curl -X GET ${base_url}/v1beta/tunedModels \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}"

پایتون

headers={
  'Authorization': 'Bearer ' + access_token,
  'Content-Type': 'application/json',
  'x-goog-user-project': project
}

result = requests.get(
  url=f'{base_url}/v1beta/tunedModels',
  headers = headers,
)
result.json()

یک مدل تنظیم شده ایجاد کنید

برای ایجاد یک مدل تنظیم شده، باید مجموعه داده خود را به مدل در قسمت training_data ارسال کنید.

برای این مثال، شما یک مدل را برای تولید عدد بعدی در دنباله تنظیم می کنید. به عنوان مثال، اگر ورودی 1 باشد، مدل باید خروجی 2 داشته باشد. اگر ورودی one hundred باشد، خروجی باید one hundred one باشد.

CURL


curl -X POST $base_url/v1beta/tunedModels \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" \
    -d '
      {
        "display_name": "number generator model",
        "base_model": "models/gemini-1.0-pro-001",
        "tuning_task": {
          "hyperparameters": {
            "batch_size": 2,
            "learning_rate": 0.001,
            "epoch_count":5,
          },
          "training_data": {
            "examples": {
              "examples": [
                {
                    "text_input": "1",
                    "output": "2",
                },{
                    "text_input": "3",
                    "output": "4",
                },{
                    "text_input": "-3",
                    "output": "-2",
                },{
                    "text_input": "twenty two",
                    "output": "twenty three",
                },{
                    "text_input": "two hundred",
                    "output": "two hundred one",
                },{
                    "text_input": "ninety nine",
                    "output": "one hundred",
                },{
                    "text_input": "8",
                    "output": "9",
                },{
                    "text_input": "-98",
                    "output": "-97",
                },{
                    "text_input": "1,000",
                    "output": "1,001",
                },{
                    "text_input": "10,100,000",
                    "output": "10,100,001",
                },{
                    "text_input": "thirteen",
                    "output": "fourteen",
                },{
                    "text_input": "eighty",
                    "output": "eighty one",
                },{
                    "text_input": "one",
                    "output": "two",
                },{
                    "text_input": "three",
                    "output": "four",
                },{
                    "text_input": "seven",
                    "output": "eight",
                }
              ]
            }
          }
        }
      }' | tee tunemodel.json
{
"name": "tunedModels/number-generator-model-dzlmi0gswwqb/operations/bvl8dymw0fhw",
"metadata": {
  "@type": "type.googleapis.com/google.ai.generativelanguage.v1beta.CreateTunedModelMetadata",
  "totalSteps": 38,
  "tunedModel": "tunedModels/number-generator-model-dzlmi0gswwqb"
}
}
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                              Dload  Upload   Total   Spent    Left  Speed
100  2280    0   296  100  1984    611   4098 --:--:-- --:--:-- --:--:--  4720

پایتون

operation = requests.post(
    url = f'{base_url}/v1beta/tunedModels',
    headers=headers,
    json= {
        "display_name": "number generator",
        "base_model": "models/gemini-1.0-pro-001",
        "tuning_task": {
          "hyperparameters": {
            "batch_size": 4,
            "learning_rate": 0.001,
            "epoch_count":5,
          },
          "training_data": {
            "examples": {
              "examples": [
                {
                    'text_input': '1',
                    'output': '2',
                },{
                    'text_input': '3',
                    'output': '4',
                },{
                    'text_input': '-3',
                    'output': '-2',
                },{
                    'text_input': 'twenty two',
                    'output': 'twenty three',
                },{
                    'text_input': 'two hundred',
                    'output': 'two hundred one',
                },{
                    'text_input': 'ninety nine',
                    'output': 'one hundred',
                },{
                    'text_input': '8',
                    'output': '9',
                },{
                    'text_input': '-98',
                    'output': '-97',
                },{
                    'text_input': '1,000',
                    'output': '1,001',
                },{
                    'text_input': '10,100,000',
                    'output': '10,100,001',
                },{
                    'text_input': 'thirteen',
                    'output': 'fourteen',
                },{
                    'text_input': 'eighty',
                    'output': 'eighty one',
                },{
                    'text_input': 'one',
                    'output': 'two',
                },{
                    'text_input': 'three',
                    'output': 'four',
                },{
                    'text_input': 'seven',
                    'output': 'eight',
                }
              ]
            }
          }
        }
      }
)
operation
<Response [200]>
operation.json()
{'name': 'tunedModels/number-generator-wl1qr34x2py/operations/41vni3zk0a47',
'metadata': {'@type': 'type.googleapis.com/google.ai.generativelanguage.v1beta.CreateTunedModelMetadata',
  'totalSteps': 19,
  'tunedModel': 'tunedModels/number-generator-wl1qr34x2py'} }

یک متغیر با نام مدل تنظیم شده خود تنظیم کنید تا برای بقیه تماس ها استفاده کنید.

name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'

مقادیر بهینه برای تعداد دوره، اندازه دسته و نرخ یادگیری به مجموعه داده شما و سایر محدودیت‌های مورد استفاده شما بستگی دارد. برای کسب اطلاعات بیشتر در مورد این مقادیر، تنظیمات تنظیم پیشرفته و Hyperparameters را ببینید.

وضعیت مدل تنظیم شده را دریافت کنید

حالت مدل در حین آموزش روی CREATING تنظیم شده است و پس از تکمیل به ACTIVE تغییر می کند.

CURL

در زیر کمی از کد پایتون برای تجزیه نام مدل تولید شده از پاسخ JSON آمده است. اگر این را در ترمینال اجرا می کنید، می توانید از تجزیه کننده bash JSON برای تجزیه پاسخ استفاده کنید.

import json

first_page = json.load(open('tunemodel.json'))
os.environ['modelname'] = first_page['metadata']['tunedModel']

print(os.environ['modelname'])
tunedModels/number-generator-model-dzlmi0gswwqb

درخواست GET دیگری را با نام مدل انجام دهید تا فراداده مدل را که شامل فیلد حالت است، دریافت کنید.


curl -X GET ${base_url}/v1beta/${modelname} \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" | grep state
"state": "ACTIVE",
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                              Dload  Upload   Total   Spent    Left  Speed
100  5921    0  5921    0     0  13164      0 --:--:-- --:--:-- --:--:-- 13157

پایتون

tuned_model = requests.get(
    url = f'{base_url}/v1beta/{name}',
    headers=headers,
)
tuned_model.json()

کد زیر هر 5 ثانیه فیلد حالت را بررسی می کند تا زمانی که دیگر در حالت CREATING نباشد.

import time
import pprint

op_json = operation.json()
response = op_json.get('response')
error = op_json.get('error')

while response is None and error is None:
    time.sleep(5)

    operation = requests.get(
        url = f'{base_url}/v1/{op_json["name"]}',
        headers=headers,
    )

    op_json = operation.json()
    response = op_json.get('response')
    error = op_json.get('error')

    percent = op_json['metadata'].get('completedPercent')
    if percent is not None:
      print(f"{percent:.2f}% - {op_json['metadata']['snapshots'][-1]}")
      print()

if error is not None:
    raise Exception(error)
100.00% - {'step': 19, 'epoch': 5, 'meanLoss': 1.402067, 'computeTime': '2024-03-14T15:11:23.766989274Z'}

استنتاج را اجرا کنید

پس از اتمام کار تنظیم، می توانید از آن برای تولید متن با سرویس متن استفاده کنید.

CURL

سعی کنید یک عدد رومی مثلاً 63 (LXIII) وارد کنید:


curl -X POST $base_url/v1beta/$modelname:generateContent \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}" \
    -d '{
        "contents": [{
        "parts": [{
          "text": "LXIII"
          }]
        }]
        }' 2> /dev/null
{
"candidates": [
  {
    "content": {
      "parts": [
        {
          "text": "LXIV"
        }
      ],
      "role": "model"
    },
    "finishReason": "STOP",
    "index": 0,
    "safetyRatings": [
      {
        "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_HATE_SPEECH",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_HARASSMENT",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
        "probability": "NEGLIGIBLE"
      }
    ]
  }
],
"promptFeedback": {
  "safetyRatings": [
    {
      "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
      "probability": "NEGLIGIBLE"
    },
    {
      "category": "HARM_CATEGORY_HATE_SPEECH",
      "probability": "NEGLIGIBLE"
    },
    {
      "category": "HARM_CATEGORY_HARASSMENT",
      "probability": "NEGLIGIBLE"
    },
    {
      "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
      "probability": "NEGLIGIBLE"
    }
  ]
}
}

خروجی مدل ممکن است درست باشد یا نباشد. اگر مدل تنظیم‌شده مطابق با استانداردهای مورد نیاز شما عمل نمی‌کند، می‌توانید نمونه‌های باکیفیت بیشتری اضافه کنید، ابرپارامترها را تغییر دهید یا مقدمه‌ای به نمونه‌های خود اضافه کنید. حتی می توانید مدل تنظیم شده دیگری را بر اساس اولین مدلی که ایجاد کردید ایجاد کنید.

برای راهنمایی بیشتر در مورد بهبود عملکرد، راهنمای تنظیم را ببینید.

پایتون

سعی کنید یک عدد ژاپنی مثلاً 6 (六) وارد کنید:

import time

m = requests.post(
    url = f'{base_url}/v1beta/{name}:generateContent',
    headers=headers,
    json= {
        "contents": [{
            "parts": [{
                "text": "六"
            }]
          }]
    })
import pprint
pprint.pprint(m.json())
{'candidates': [{'content': {'parts': [{'text': '七'}], 'role': 'model'},
                'finishReason': 'STOP',
                'index': 0,
                'safetyRatings': [{'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
                                    'probability': 'NEGLIGIBLE'},
                                  {'category': 'HARM_CATEGORY_HATE_SPEECH',
                                    'probability': 'NEGLIGIBLE'},
                                  {'category': 'HARM_CATEGORY_HARASSMENT',
                                    'probability': 'LOW'},
                                  {'category': 'HARM_CATEGORY_DANGEROUS_CONTENT',
                                    'probability': 'NEGLIGIBLE'}]}],
'promptFeedback': {'safetyRatings': [{'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
                                      'probability': 'NEGLIGIBLE'},
                                      {'category': 'HARM_CATEGORY_HATE_SPEECH',
                                      'probability': 'NEGLIGIBLE'},
                                      {'category': 'HARM_CATEGORY_HARASSMENT',
                                      'probability': 'NEGLIGIBLE'},
                                      {'category': 'HARM_CATEGORY_DANGEROUS_CONTENT',
                                      'probability': 'NEGLIGIBLE'}]} }

خروجی مدل ممکن است درست باشد یا نباشد. اگر مدل تنظیم‌شده مطابق با استانداردهای مورد نیاز شما عمل نمی‌کند، می‌توانید نمونه‌های باکیفیت بیشتری اضافه کنید، ابرپارامترها را تغییر دهید یا مقدمه‌ای به نمونه‌های خود اضافه کنید.

نتیجه گیری

حتی اگر داده‌های آموزشی حاوی هیچ ارجاعی به اعداد رومی یا ژاپنی نبود، این مدل پس از تنظیم دقیق توانست به خوبی تعمیم یابد. به این ترتیب، می‌توانید مدل‌ها را به‌خوبی تنظیم کنید تا به موارد استفاده خود پاسخ دهید.

مراحل بعدی

برای یادگیری نحوه استفاده از سرویس تنظیم با کمک Python SDK برای Gemini API، از شروع سریع تنظیم با پایتون دیدن کنید. برای آشنایی با نحوه استفاده از سرویس‌های دیگر در Gemini API، از آموزش شروع REST دیدن کنید.