سيساعدك هذا الدليل التعليمي في بدء ضبط واجهة Gemini API. باستخدام إما Python SDK أو REST API باستخدام curl. تعرض الأمثلة كيفية ضبط نموذج النص خلف خدمة إنشاء النصوص من Gemini API
العرض على ai.google.dev | تجربة ورقة ملاحظات Colab | الاطّلاع على ورقة الملاحظات على GitHub |
ضبط إعدادات المصادقة
تتيح لك Gemini API تعديل النماذج استنادًا إلى بياناتك. نظرًا لأنها بياناتك النماذج التي ضبطتها، يستخدم هذا عناصر تحكم أكثر صرامة في الوصول إلى تلك التي يمكن أن توفرها مفاتيح واجهة برمجة التطبيقات.
قبل تشغيل هذا البرنامج التعليمي، يجب إعداد OAuth لـ المشروع، ثم تنزيل "معرّف عميل OAuth" باسم "client_secret.json".
يحوّل أمر 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'
ضبط المتغيرات
مجموعة عناوين URL
اضبط المتغيّرات للقيم المتكرّرة لاستخدامها في بقية واجهة برمجة تطبيقات REST.
الاتصالات. يستخدم الرمز مكتبة Python 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"
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
إدراج النماذج التي تم ضبطها
تأكَّد من إعدادات المصادقة من خلال إدراج النماذج التي ضبطتها.
مجموعة عناوين URL
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
.
مجموعة عناوين URL
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
بعد اكتماله
مجموعة عناوين URL
يوجد أدناه جزء من رمز بايثون لتحليل اسم النموذج الذي تم إنشاؤه من استجابة 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
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'}
تنفيذ الاستنتاج
بعد انتهاء مهمة الضبط، يمكنك استخدامها لإنشاء نص يحتوي على خدمة ما.
مجموعة عناوين URL
حاول إدخال رقم روماني، على سبيل المثال، 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 (六):
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، يُرجى الاطّلاع على مقالة البدء السريع لضبطها Python للتعرّف على كيفية إجراء ذلك: لاستخدام خدمات أخرى في Gemini API، يُرجى الانتقال إلى صفحة بدء استخدام RST البرنامج التعليمي.