برنامج تعليمي حول التوليف الدقيق

العرض على ai.google.dev التنفيذ في Google Colab عرض المصدر على GitHub

في هذا الدفتر، ستتعرّف على كيفية بدء استخدام خدمة الضبط لواجهة Gemini API باستخدام أوامر CURL أو واجهة برمجة التطبيقات لطلب Python لاستدعاء Gemini API. ستتعلّم هنا كيفية تحسين النموذج النصي المستخدَم في خدمة إنشاء النصوص في 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).

ضبط المتغيرات

مجموعة عناوين 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

في ما يلي جزء من رمز 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 آخر باستخدام اسم النموذج للحصول على البيانات الوصفية للنموذج التي تتضمّن حقل الحالة.


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 API، يمكنك زيارة مقالة البدء السريع لعملية الضبط باستخدام Python. للاطّلاع على كيفية استخدام خدمات أخرى في Gemini API، يُرجى الانتقال إلى Python quickstart.