این آموزش به شما کمک می کند تا با استفاده از 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 دیدن کنید.