REST API: Model ayarlama

ai.google.dev'de görüntüleyin Google Colab'de çalıştır Kaynağı GitHub'da görüntüleyin

Bu not defterinde, Gemini API'yi çağırmak için curl komutlarını veya Python request API'yi kullanarak Gemini API ayarlama hizmetini nasıl kullanmaya başlayacağınızı öğreneceksiniz. Burada, Gemini API'nin metin oluşturma hizmetinin temelindeki metin modelini nasıl ayarlayabileceğinizi öğreneceksiniz.

Kurulum

Kimliği doğrula

Gemini API, modelleri kendi verilerinize göre ayarlamanıza olanak tanır. Söz konusu olan sizin verileriniz ve hassaslaştırılmış modelleriniz olduğu için bu, API Anahtarlarının sağlayabileceğinden daha sıkı erişim denetimleri gerektirir.

Bu eğiticiyi çalıştırmadan önce projeniz için OAuth'u kurmanız gerekir.

Colab'de kurulumun en kolay yolu, client_secret.json dosyanızın içeriğini CLIENT_SECRET gizli adıyla Colab'ın "Secrets Manager"ına (sol paneldeki anahtar simgesinin altında) kopyalamaktır.

Bu gcloud komutu, client_secret.json dosyasını hizmetle kimlik doğrulamak amacıyla kullanılabilecek kimlik bilgilerine dönüştürür.

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).

CURL ile REST API çağırma

Bu bölümde, REST API'yi çağırmak için örnek curl ifadeleri verilmiştir. İnce ayar işi oluşturmayı, işin durumunu kontrol etmeyi ve tamamlandığında çıkarım çağrısı yapmayı öğreneceksiniz.

Değişkenleri ayarla

Geri kalan REST API çağrılarında kullanmak üzere yinelenen değerler için değişkenler ayarlayın. Bu kod, tüm kod hücrelerinden erişilebilen ortam değişkenlerini ayarlamak için Python os kitaplığını kullanır.

Bu durum Colab not defteri ortamına özeldir. Sonraki kod hücresinde yer alan kod, aşağıdaki komutları bir bash terminalinde çalıştırmaya eşdeğerdir.

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"

Hassaslaştırılmış modelleri listeleme

Mevcut hassaslaştırılmış modelleri listeleyerek kimlik doğrulama ayarlarınızı doğrulayın.


curl -X GET ${base_url}/v1beta/tunedModels \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}"

Hassaslaştırılmış model oluşturun

Hassaslaştırılmış model oluşturmak için veri kümenizi training_data alanında modele iletmeniz gerekir.

Bu örnekte, dizideki bir sonraki sayıyı oluşturmak için bir modeli ayarlayacaksınız. Örneğin, giriş 1 ise modelin çıkışı 2 olmalıdır. Giriş one hundred ise çıkış one hundred one olmalıdır.


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

Hassas model durumunu alma

Modelin durumu, eğitim sırasında CREATING olarak ayarlanır ve tamamlandığında ACTIVE olarak değişir.

Oluşturulan model adını yanıt JSON dosyasından ayırmak için bir Python kodu aşağıda verilmiştir. Bunu bir terminalde çalıştırıyorsanız yanıtı ayrıştırmak için bir bash JSON ayrıştırıcı kullanmayı deneyebilirsiniz.

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

Durum alanını içeren model meta verilerini almak için model adıyla başka bir GET isteği yapın.


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

Çıkarımı çalıştır

İnce ayar işiniz bittikten sonra, metin hizmetiyle metin oluşturmak için bu işi kullanabilirsiniz. Bir Roma rakamı girin, örneğin 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"
      }
    ]
  }
}

Modelinizden elde edilen çıkış doğru olabilir veya olmayabilir. Hassaslaştırılmış model, gerekli standartlarınızı karşılamıyorsa daha fazla yüksek kaliteli örnek eklemeyi, hiperparametrelerde ince ayar yapmayı veya örneklerinize önsöz eklemeyi deneyebilirsiniz. Hatta oluşturduğunuz ilk modeli temel alarak başka bir hassaslaştırılmış model de oluşturabilirsiniz.

Performansı artırma konusunda daha fazla bilgi için ayarlama kılavuzuna bakın.

Python istekleriyle REST API'yi çağırma

Rest API'sini, http istekleri göndermenize olanak tanıyan herhangi bir kitaplıkla çağırabilirsiniz. Sonraki örnek grubunda Python istek kitaplığı kullanılır ve daha gelişmiş özelliklerden bazıları gösterilmektedir.

Değişkenleri ayarla

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 kitaplığını içe aktarın.

import requests
import json

Hassaslaştırılmış modelleri listeleme

Mevcut hassaslaştırılmış modelleri listeleyerek kimlik doğrulama ayarlarınızı doğrulayın.

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()

Hassaslaştırılmış model oluşturun

Curl örneğinde olduğu gibi, veri kümesini training_data alanı üzerinden geçirirsiniz.

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'} }

Diğer çağrılarda kullanmak üzere, hassaslaştırılmış modelinizin adını taşıyan bir değişken ayarlayın.

name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'

Hassas model durumunu alma

Durum alanını kontrol ederek ayarlama işinizin ilerleme durumunu kontrol edebilirsiniz. CREATING ayarlama işinin devam ettiği, ACTIVE ise trenlerin tamamlandığı ve hassaslaştırılmış modelin kullanıma hazır olduğu anlamına gelir.

tuned_model = requests.get(
    url = f'{base_url}/v1beta/{name}',
    headers=headers,
)
tuned_model.json()

Aşağıdaki kod, durum alanını CREATING durumundan çıkana kadar her 5 saniyede bir kontrol eder.

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'}

Çıkarımı çalıştır

İnce ayar işi bittikten sonra, temel metin modelini kullandığınız şekilde metin oluşturmak için bu işi kullanabilirsiniz. Japonca bir rakam girmeyi deneyin; örneğin, 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'}]} }

Modelinizden elde edilen çıkış doğru olabilir veya olmayabilir. Hassaslaştırılmış model, gerekli standartlarınızı karşılamıyorsa daha fazla yüksek kaliteli örnek eklemeyi, hiperparametrelerde ince ayar yapmayı veya örneklerinize önsöz eklemeyi deneyebilirsiniz.

Sonuç

Eğitim verileri Romen veya Japon rakamlarına herhangi bir referans içermese de model, ince ayar yapıldıktan sonra iyi bir genelleme yapabildi. Böylece, modellerde ince ayar yaparak kullanım alanlarınıza uygun hale getirebilirsiniz.

Sonraki adımlar

Gemini API için Python SDK yardımıyla ayar hizmetinin nasıl kullanılacağını öğrenmek isterseniz Python ile ince ayar hızlı başlangıç kılavuzunu ziyaret edin. Gemini API'deki diğer hizmetleri nasıl kullanacağınızı öğrenmek için Python hızlı başlangıç kılavuzunu ziyaret edin.