Visualizza su ai.google.dev | Esegui in Google Colab | Visualizza il codice sorgente su GitHub |
In questo blocco note, imparerai a iniziare a utilizzare il servizio di ottimizzazione dell'API Gemini utilizzando i comandi curl o l'API di richiesta Python per chiamare l'API Gemini. Qui imparerai a ottimizzare il modello di testo alla base del servizio di generazione di testi dell'API Gemini.
Configurazione
Autentica
L'API Gemini ti consente di ottimizzare i modelli sulla base dei tuoi dati. Poiché si tratta dei tuoi dati e dei tuoi modelli ottimizzati, sono necessari controlli dell'accesso più rigidi di quelli offerti dalle chiavi API.
Prima di poter eseguire questo tutorial, dovrai configurare OAuth per il tuo progetto.
In Colab, il modo più semplice per configurare è copiare i contenuti del tuo file client_secret.json
nel "Secret manager " di Colab (sotto l'icona della chiave nel riquadro a sinistra) con il nome secret CLIENT_SECRET
.
Questo comando gcloud trasforma il file client_secret.json
in credenziali che possono essere utilizzate per l'autenticazione con il servizio.
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).
Chiamata all'API REST con CURL
Questa sezione fornisce istruzioni curl di esempio per chiamare l'API REST. Imparerai a creare un job di ottimizzazione, verificarne lo stato e, al termine, eseguire una chiamata di inferenza.
Imposta variabili
Imposta le variabili per i valori ricorrenti da utilizzare per le altre chiamate API REST. Il codice utilizza la libreria Python os
per impostare le variabili di ambiente accessibili in tutte le celle di codice.
Questa operazione è specifica per l'ambiente dei blocchi note di Colab. Il codice nella cella di codice successiva equivale a eseguire i seguenti comandi in un terminale 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"
Elenca modelli ottimizzati
Verifica la configurazione dell'autenticazione elencando i modelli ottimizzati attualmente disponibili.
curl -X GET ${base_url}/v1beta/tunedModels \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${access_token}" \
-H "x-goog-user-project: ${project_id}"
Crea modello ottimizzato
Per creare un modello ottimizzato, devi passare il tuo set di dati al modello nel 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 deve essere one hundred one
.
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
Ottieni stato ottimizzato del modello
Lo stato del modello è impostato su CREATING
durante l'addestramento e cambierà in ACTIVE
una volta completato.
Di seguito è riportato un piccolo codice Python per analizzare il nome del modello generato dal codice JSON della risposta. Se la esegui in un terminale, puoi provare a utilizzare un parser JSON bash 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, che includono 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
Esegui inferenza
Una volta completato il job di ottimizzazione, puoi utilizzarlo per generare testo con il servizio di testo. 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 non essere corretto. Se il modello ottimizzato non rispetta gli standard richiesti, puoi provare ad aggiungere altri esempi di alta qualità, modificare gli iperparametri o aggiungere un preambolo agli esempi. Puoi anche creare un altro modello ottimizzato in base al primo modello che hai creato.
Consulta la guida all'ottimizzazione per ulteriori indicazioni su come migliorare le prestazioni.
Chiamare l'API REST con richieste Python
Puoi chiamare l'API REST con qualsiasi libreria che ti consenta di inviare richieste http. Il prossimo insieme di esempi utilizza la libreria delle richieste Python e illustra alcune delle funzionalità più avanzate.
Imposta variabili
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
Elenca modelli ottimizzati
Verifica la configurazione dell'autenticazione elencando i modelli ottimizzati attualmente disponibili.
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 modello ottimizzato
Come per l'esempio Curl, passi nel set di dati attraverso il campo training_data
.
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 le altre chiamate.
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'
Ottieni stato ottimizzato del modello
Puoi verificare l'avanzamento del job di ottimizzazione controllando il campo dello stato. CREATING
significa che il job di ottimizzazione è ancora in corso, mentre ACTIVE
significa che le sessioni di addestramento sono state completate e il modello ottimizzato è pronto per l'uso.
tuned_model = requests.get(
url = f'{base_url}/v1beta/{name}',
headers=headers,
)
tuned_model.json()
Il codice seguente verifica il campo dello stato ogni 5 secondi finché non si trova più 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 completato il job di ottimizzazione, puoi utilizzarlo per generare il testo nello stesso modo in cui useresti il modello di testo di base. 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 non essere corretto. Se il modello ottimizzato non rispetta gli standard richiesti, puoi provare ad aggiungere altri esempi di alta qualità, modificare gli iperparametri o aggiungere un preambolo agli esempi.
Conclusione
Anche se i dati di addestramento non contenevano alcun riferimento a numeri romani o giapponesi, il modello è stato in grado di generalizzare bene dopo l'ottimizzazione. In questo modo, puoi perfezionare i modelli per soddisfare i tuoi casi d'uso.
Passaggi successivi
Per scoprire come utilizzare il servizio di ottimizzazione con l'aiuto dell'SDK Python per l'API Gemini, consulta la guida rapida dell'ottimizzazione con Python. Per scoprire come utilizzare altri servizi dell'API Gemini, visita la guida rapida di Python.