API ל-REST: כוונון מודלים

לצפייה ב-ai.google.dev הפעלה ב-Google Colab הצגת המקור ב-GitHub

ב-notebook הזה תלמדו איך להתחיל להשתמש בשירות הכוונון של Gemini API באמצעות פקודות curl או באמצעות Python request API כדי לקרוא ל-Gemini API. כאן תלמדו איך לכוונן את מודל הטקסט שמאחורי שירות יצירת הטקסט של Gemini API.

הגדרה

אמת

Gemini API מאפשר להתאים מודלים לפי הנתונים שלך. מכיוון שאלו הנתונים שלכם והמודלים המכווננים שלכם, הם זקוקים לבקרות גישה מחמירות יותר מאלה שמפתחות API יכולים לספק.

לפני שתוכלו להריץ את המדריך הזה, תצטרכו להגדיר OAuth לפרויקט.

ב-Colab, הדרך הקלה ביותר להגדרה היא להעתיק את תוכן הקובץ client_secret.json אל 'מנהל הסודות' של 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).

קריאה ל-API ל-REST באמצעות CURL

הקטע הזה מספק הצהרות curl לדוגמה לקריאה ל-API ל-REST. נלמד איך ליצור עבודת כוונון, לבדוק את הסטטוס שלה, ואחרי שהיא תסתיים, לבצע שיחת הסקת מסקנות.

הגדרת משתנים

הגדרת משתנים לערכים חוזרים שישמשו עבור שאר הקריאות ל-API ל-REST. הקוד משתמש בספריית Python os כדי להגדיר משתני סביבה שאפשר לגשת אליהם בכל תאי הקוד.

הוא ספציפי לסביבת ה-notebook של 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 לאחר השלמתו.

בהמשך מופיע קטע של קוד python לניתוח שם המודל שנוצר מקובץ ה-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"
      }
    ]
  }
}

הפלט מהמודל עשוי להיות נכון או לא נכון. אם המודל המכוונן אינו פועל בהתאם לתקנים הנדרשים, אפשר לנסות להוסיף עוד דוגמאות באיכות גבוהה, לשנות את ההיפר-פרמטרים או להוסיף פתיח לדוגמאות. תוכלו אפילו ליצור מודל מכווננת נוסף על סמך המודל הראשון שיצרתם.

הנחיות נוספות לשיפור הביצועים זמינות במדריך הכוונון.

קריאה ל-API ל-REST עם בקשות ל-Python

אפשר לקרוא ל-API של השאר באמצעות כל ספרייה שמאפשרת לשלוח בקשות http. סדרת הדוגמאות הבאה משתמשת בספריית הבקשות של Python, ומדגימה כמה מהתכונות המתקדמות יותר.

הגדרת משתנים

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, אפשר לעיין במדריך למתחילים של כוונון עם Python. על מנת ללמוד איך להשתמש בשירותים אחרים ב-Gemini API, אפשר לעיין במדריך למתחילים של Python.