العرض على ai.google.dev | التشغيل في Google Colab | الاطّلاع على المصدر على GitHub |
ستتعرّف في هذا الدفتر على كيفية بدء خدمة الضبط في واجهة برمجة تطبيقات Gemini باستخدام أوامر curl أو واجهة برمجة تطبيقات طلبات Python لاستدعاء واجهة برمجة تطبيقات Gemini. ستتعرّف هنا على كيفية ضبط النموذج النصي من خلال خدمة إنشاء النصوص في Gemini API.
ضبط إعدادات الجهاز
مصادقة
تتيح لك واجهة Gemini 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).
استدعاء واجهة برمجة تطبيقات REST باستخدام CURL
يعرض هذا القسم أمثلة على عبارات curl لاستدعاء واجهة برمجة التطبيقات REST. ستتعلم كيفية إنشاء مهمة توليف والتحقّق من حالتها، وبعد اكتمالها، يمكنك طلب استنتاج.
ضبط المتغيّرات
يمكنك ضبط المتغيّرات للقيم المتكرّرة من أجل استخدامها لبقية طلبات البيانات من واجهة برمجة التطبيقات REST. يستخدم الرمز مكتبة os
في Python لضبط متغيرات البيئة التي يمكن الوصول إليها في جميع خلايا الرمز.
هذا خاص ببيئة Colab notebook. يكافئ الرمز في خلية الرمز التالية تشغيل الأوامر التالية في الوحدة الطرفية 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 مع طلبات Python
يمكنك استدعاء واجهة برمجة التطبيقات المتبقية باستخدام أي مكتبة تسمح لك بإرسال طلبات http. تستخدم المجموعة التالية من الأمثلة مكتبة طلبات بايثون، وتوضح بعض الميزات الأكثر تقدمًا.
ضبط المتغيّرات
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 quickstart (البدء السريع) في Python.