REST API: تنظیم مدل

مشاهده در ai.google.dev در Google Colab اجرا شود مشاهده منبع در GitHub

در این نوت بوک، نحوه شروع به کار با سرویس تنظیم API Gemini با استفاده از دستورات curl یا API درخواست Python برای فراخوانی Gemini API را خواهید آموخت. در اینجا، نحوه تنظیم مدل متن پشت سرویس تولید متن Gemini API را یاد خواهید گرفت.

برپایی

تصدیق کردن

Gemini API به شما امکان می دهد مدل ها را بر اساس داده های خود تنظیم کنید. از آنجایی که داده‌های شما و مدل‌های تنظیم‌شده شما هستند، به کنترل‌های دسترسی دقیق‌تری نسبت به API-Keys نیاز دارد.

قبل از اینکه بتوانید این آموزش را اجرا کنید، باید OAuth را برای پروژه خود راه اندازی کنید .

در Colab ساده‌ترین راه برای راه‌اندازی این است که محتویات فایل client_secret.json خود را در "Secrets manager" Colab (زیر نماد کلید در پانل سمت چپ) با نام مخفی CLIENT_SECRET کپی کنید.

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

try:
  from google.colab import userdata
  import pathlib
  pathlib.Path('client_secret.json').write_text(userdata.get('CLIENT_SECRET'))

  # Use `--no-browser` in colab
  !gcloud auth application-default login --no-browser --client-id-file client_secret.json --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/generative-language.tuning'
except ImportError:
  !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'
You are authorizing client libraries without access to a web browser. Please run the following command on a machine with a web browser and copy its output back here. Make sure the installed gcloud version is 372.0.0 or newer.

gcloud auth application-default login --remote-bootstrap="https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=87071151422-n1a3cb6c7fvkfg4gmhdtmn5ulol2l4be.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgenerative-language.tuning&state=QIyNibWSaTIsozjmvZEkVBo6EcoW0G&access_type=offline&code_challenge=76c1ZiGvKN8cvlYfj3BmbCwE4e7tvrlwaX3REUX25gY&code_challenge_method=S256&token_usage=remote"


Enter the output of the above command: https://localhost:8085/?state=QIyNibWSaTIsozjmvZEkVBo6EcoW0G&code=4/0AeaYSHBKrY911S466QjKQIFODoOPXlO1mWyTYYdrbELIDV6Hw2DKRAyro62BugroSvIWsA&scope=https://www.googleapis.com/auth/cloud-platform%20https://www.googleapis.com/auth/generative-language.tuning

Credentials saved to file: [/content/.config/application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC).

فراخوانی REST API با CURL

این بخش به عنوان مثال دستورات curl را برای فراخوانی REST API ارائه می دهد. شما یاد خواهید گرفت که چگونه یک کار تنظیم ایجاد کنید، وضعیت آن را بررسی کنید و پس از تکمیل، یک تماس استنتاج برقرار کنید.

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

متغیرهایی را برای مقادیر تکرارشونده تنظیم کنید تا برای بقیه تماس‌های 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"

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

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


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

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

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

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


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

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

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

در زیر کمی کد پایتون برای تجزیه نام مدل تولید شده از پاسخ 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

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

پس از اتمام کار تنظیم، می توانید از آن برای تولید متن با سرویس متن استفاده کنید. سعی کنید یک عدد رومی مثلاً 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"
      }
    ]
  }
}

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

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

REST API را با درخواست های پایتون فراخوانی کنید

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

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

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

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

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

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()

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

همانطور که برای مثال Curl، مجموعه داده را از طریق قسمت training_data ارسال می کنید.

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'

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

می توانید با بررسی فیلد حالت، پیشرفت کار تنظیم خود را بررسی کنید. CREATING به این معنی است که کار تنظیم هنوز ادامه دارد و ACTIVE به این معنی است که قطارها کامل شده و مدل تنظیم شده آماده استفاده است.

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'}

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

هنگامی که کار تنظیم به پایان رسید، می توانید از آن برای تولید متن به همان روشی که از مدل متن پایه استفاده می کنید استفاده کنید. سعی کنید یک عدد ژاپنی مثلاً 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، از Python Quickstart دیدن کنید.