مشاهده در 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 استفاده کنید. کد از کتابخانه 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 -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 -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'
وضعیت مدل تنظیم شده را دریافت کنید
حالت مدل در حین آموزش روی 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
پایتون
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'}
استنتاج را اجرا کنید
پس از اتمام کار تنظیم، می توانید از آن برای تولید متن با سرویس متن استفاده کنید.
حلقه
سعی کنید یک عدد رومی مثلاً 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، از Python Quickstart دیدن کنید.