Questo tutorial ti aiuterà a iniziare a ottimizzare l'API Gemini utilizzando l'SDK Python o l'API REST utilizzando curl. Gli esempi mostrano come ottimizzare il modello di testo alla base il servizio di generazione di testo dell'API Gemini.
Visualizza su ai.google.dev | Prova un blocco note di Colab | Visualizza blocco note su GitHub |
Configura l'autenticazione
L'API Gemini ti consente di ottimizzare i modelli in base ai tuoi dati. Poiché si tratta dei tuoi dati i tuoi modelli ottimizzati utilizzano controlli di accesso più rigidi rispetto a quelli forniti dalle chiavi API.
Prima di poter eseguire questo tutorial, dovrai configurare OAuth per progetto, quindi scarica "ID client OAuth" come "client_secret.json".
Questo comando gcloud trasforma il file client_secret.json
in credenziali che
possono essere utilizzate per
l'autenticazione con il servizio.
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'
Imposta variabili
CURL
Imposta variabili per valori ricorrenti da utilizzare per il resto dell'API REST
chiamate. Il codice utilizza la libreria Python os
per impostare l'ambiente
accessibili in tutte le celle di codice.
È specifico per l'ambiente del blocco note di Colab. Il codice nel prossimo cella di codice equivale a eseguire i comandi seguenti in un file bash o nel terminale.
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"
Importa la libreria requests
.
import requests
import json
Elenco modelli ottimizzati
Verifica la configurazione dell'autenticazione elencando i modelli ottimizzati disponibili.
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()
Crea un modello ottimizzato
Per creare un modello ottimizzato, devi passare il set di dati al modello
campo training_data
.
Per questo esempio, ottimizzerai un modello per generare il numero successivo nella
sequenza. Ad esempio, se l'input è 1
, il modello dovrebbe restituire 2
. Se
l'input è one hundred
, l'output dovrebbe essere 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'} }
Imposta una variabile con il nome del modello ottimizzato da utilizzare per il resto del modello chiamate.
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'
I valori ottimali per il conteggio delle epoche, la dimensione del batch e il tasso di apprendimento dipendono del set di dati e di altri vincoli del tuo caso d'uso. Per scoprire di più su questi valori, vedi Impostazioni di ottimizzazione avanzate e Iperparametri.
Ottieni stato del modello ottimizzato
Lo stato del modello è impostato su CREATING
durante l'addestramento e cambierà in
ACTIVE
al termine dell'operazione.
CURL
Di seguito è riportato un codice Python per analizzare il nome del modello generato JSON della risposta. Se esegui questo comando in un terminale, puoi provare a usare un bash Parser JSON per analizzare la risposta.
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
Esegui un'altra richiesta GET
con il nome del modello per ottenere i metadati del modello,
include il campo dello stato.
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()
Il codice seguente controlla il campo dello stato ogni 5 secondi fino a quando
nello stato 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'}
Esegui inferenza
Una volta terminato il job di ottimizzazione, puoi utilizzarlo per generare testo con completamente gestito di Google Cloud.
CURL
Prova a inserire un numero romano, ad esempio 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" } ] } }
L'output del modello potrebbe essere corretto. Se il modello ottimizzato non soddisfa gli standard richiesti, puoi provare ad aggiungere altri di qualità, ritoccando gli iperparametri o aggiungendo un preambolo esempi. Puoi anche creare un altro modello ottimizzato in base al primo è stato creato.
Consulta la guida all'ottimizzazione per ulteriori indicazioni su come migliorare le prestazioni.
Python
Prova a inserire un numero giapponese, ad esempio 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'}]} }
L'output del modello potrebbe essere corretto. Se il modello ottimizzato non soddisfa gli standard richiesti, puoi provare ad aggiungere altri di qualità, ritoccando gli iperparametri o aggiungendo un preambolo esempi.
Conclusione
Anche se i dati di addestramento non contenevano riferimenti a lingue romane o giapponesi numerali, il modello è stato in grado di generalizzare bene dopo l'ottimizzazione. In questo modo può ottimizzare i modelli per adattarli ai tuoi casi d'uso.
Passaggi successivi
Per scoprire come utilizzare il servizio di ottimizzazione con l'aiuto dell'SDK Python per il deployment per l'API Gemini, visita la guida rapida all'ottimizzazione con Python. Per ulteriori informazioni per utilizzare altri servizi nell'API Gemini, visita la guida introduttiva al REST di Google Cloud.