המדריך הזה יעזור לך להתחיל בכוונון של Gemini API שירות שעושה שימוש ב-Python SDK או ב-API ל-REST בעזרת curl. הדוגמאות מראות איך לכוונן את מודל הטקסט שירות Gemini API ליצירת טקסט.
![]() |
![]() |
![]() |
מגדירים אימות
עם Gemini API אפשר לכוונן את המודלים לפי הנתונים שלך. כי מדובר בנתונים שלכם, למודלים המכווננים שלך נדרשים בקרת גישה מחמירה יותר ממפתחות API יכולים לספק.
לפני הפעלת המדריך הזה, צריך להגדיר OAuth עבור project.
ב-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).
הגדרת משתנים
CURL
מגדירים משתנים לערכים חוזרים שישמשו לשאר ה-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"
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
הצגת רשימה של מודלים מכווננים
כדי לאמת את הגדרת האימות, מציגים את המודלים המכווננים הזמינים.
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}"
Python
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
Python
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
.
CURL
בהמשך מופיע קטע קצר של קוד 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
עם שם המודל כדי לקבל את המטא-נתונים של המודל.
כוללת את השדה State (מדינה).
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
Python
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" } ] } }
יכול להיות שהפלט מהמודל שלך נכון או שגוי. אם המודל המכוונן לא עומד בסטנדרטים הנדרשים, אפשר לנסות להוסיף דוגמאות לשיפור האיכות, שינוי ההיפר-פרמטרים או הוספת קידומת דוגמאות. אפשר אפילו ליצור מודל מכוונן נוסף שמבוסס על המודל הראשון נוצר.
ניתן לעיין במדריך הכוונון לקבלת הדרכה נוספת על שיפור הביצועים.
Python
מנסים להזין ספרה יפנית, למשל 6 (gcloud):
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, אפשר לעיין במאמר תחילת העבודה ב-REST המדריך.