Tutorial ini akan membantu Anda memulai penyesuaian Gemini API layanan web menggunakan Python SDK atau REST API menggunakan curl. Contoh tersebut menunjukkan cara men-tuning model teks di balik layanan pembuatan teks Gemini API.
Lihat di ai.google.dev | Coba notebook Colab | Lihat notebook di GitHub |
Menyiapkan autentikasi
Gemini API memungkinkan Anda menyesuaikan model menggunakan data Anda sendiri. Karena itu data Anda dan model yang telah disesuaikan, hal ini menggunakan kontrol akses yang lebih ketat daripada yang bisa disediakan oleh kunci API.
Sebelum dapat menjalankan tutorial ini, Anda harus menyiapkan OAuth untuk project, lalu download "Client ID OAuth" sebagai "client_secret.json".
Perintah gcloud ini mengubah file client_secret.json
menjadi kredensial yang
dapat digunakan untuk melakukan
otentikasi terhadap layanan.
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'
Menetapkan variabel
CURL
Menetapkan variabel untuk nilai berulang yang akan digunakan untuk REST API lainnya
panggilan telepon. Kode menggunakan library os
Python untuk menetapkan lingkungan
yang dapat diakses
di semua sel kode.
Setelan ini dikhususkan untuk lingkungan notebook Colab. Kode di proses berikutnya sel kode setara dengan menjalankan perintah berikut di {i>bash<i} terminal.
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"
Impor library requests
.
import requests
import json
Mencantumkan model yang telah disesuaikan
Verifikasi penyiapan autentikasi Anda dengan mencantumkan model yang telah disesuaikan yang tersedia.
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}"
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()
Membuat model yang di-tuning
Untuk membuat model yang di-tuning, Anda harus meneruskan set data ke model tersebut di bagian
Kolom training_data
.
Untuk contoh ini, Anda akan menyesuaikan model untuk menghasilkan angka berikutnya dalam
. Misalnya, jika inputnya adalah 1
, model akan menghasilkan 2
. Jika
inputnya adalah one hundred
, output-nya harus 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
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'} }
Tetapkan variabel dengan nama model yang telah Anda sesuaikan untuk digunakan pada model panggilan telepon.
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'
Nilai optimal untuk jumlah epoch, ukuran batch, dan kecepatan pemelajaran bergantung pada set data dan batasan lain dari kasus penggunaan Anda. Untuk mempelajari lebih lanjut tentang nilai-nilai ini, lihat Setelan penyesuaian lanjutan dan Hyperparameter.
Mendapatkan status model yang di-tuning
Status model disetel ke CREATING
selama pelatihan dan akan berubah menjadi
ACTIVE
setelah selesai.
CURL
Di bawah ini adalah sedikit kode Python untuk mengurai nama model yang dihasilkan dari JSON respons. Jika Anda menjalankan ini di terminal, Anda dapat mencoba menggunakan {i>bash<i} Parser JSON untuk mengurai respons.
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
Lakukan permintaan GET
lainnya dengan nama model untuk mendapatkan metadata model yang
menyertakan isian negara bagian.
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()
Kode di bawah memeriksa kolom status setiap 5 detik hingga tidak ada lagi
dalam status 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'}
Menjalankan inferensi
Setelah tugas tuning selesai, Anda dapat menggunakannya untuk membuat teks dengan teks layanan.
CURL
Coba masukkan angka Romawi, misalnya, 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" } ] } }
Output dari model mungkin benar atau mungkin tidak. Jika model yang di-tuning tidak memenuhi standar yang dibutuhkan, Anda dapat mencoba menambahkan contoh kualitas, menyesuaikan hyperparameter atau menambahkan field preamble ke contoh. Anda bahkan dapat membuat model lain yang disesuaikan berdasarkan model pertama yang dibuat.
Lihat panduan penyesuaian untuk mendapatkan panduan lebih lanjut tentang cara meningkatkan performa.
Python
Coba masukkan angka Jepang, misalnya, 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'}]} }
Output dari model mungkin benar atau mungkin tidak. Jika model yang di-tuning tidak memenuhi standar yang dibutuhkan, Anda dapat mencoba menambahkan contoh kualitas, menyesuaikan hyperparameter atau menambahkan field preamble ke contoh.
Kesimpulan
Meskipun data pelatihan itu tidak mengandung referensi ke bahasa Romawi atau Jepang angka, model ini mampu menggeneralisasi dengan baik setelah melakukan fine-tuning. Dengan cara ini, Anda dapat meningkatkan kualitas model agar sesuai dengan kasus penggunaan Anda.
Langkah berikutnya
Untuk mempelajari cara menggunakan layanan tuning dengan bantuan Python SDK untuk Gemini API, buka panduan memulai dengan Python yang baru. Untuk mempelajari cara untuk menggunakan layanan lain di Gemini API, buka REST memulai tutorial.