<ph type="x-smartling-placeholder">
Ce tutoriel vous aidera à vous lancer dans le réglage de l'API Gemini à l'aide du SDK Python ou de l'API REST curl Les exemples montrent comment régler le modèle de texte le service de génération de texte de l'API Gemini.
Afficher sur ai.google.dev | Essayer un notebook Colab | Afficher le notebook sur GitHub |
Configurer l'authentification
L'API Gemini vous permet de régler des modèles à partir de vos propres données. Puisqu'il s'agit de vos données et vos modèles réglés utilisent des contrôles d'accès plus stricts que ceux fournis par les clés API.
Avant de pouvoir exécuter ce didacticiel, vous devez configurer OAuth pour votre project, puis téléchargez "ID client OAuth" sous la forme "client_secret.json".
Cette commande gcloud convertit le fichier client_secret.json
en identifiants qui
peuvent être utilisées pour
s'authentifier auprès du service.
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'
Définir des variables
CURL
Définir des variables pour les valeurs récurrentes à utiliser pour le reste de l'API REST
appels. Le code utilise la bibliothèque Python os
pour définir l'environnement
accessibles dans toutes les cellules de code.
Cette option est spécifique à l'environnement de notebook Colab. Le code de l'atelier suivant revient à exécuter les commandes suivantes dans une session du 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"
Importez la bibliothèque requests
.
import requests
import json
Répertorier les modèles réglés
Vérifiez votre configuration d'authentification en répertoriant les modèles réglés disponibles.
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()
Créer un modèle réglé
Pour créer un modèle réglé, vous devez lui transmettre l'ensemble de données
training_data
.
Dans cet exemple, vous allez régler un modèle afin de générer le nombre suivant dans la
séquence. Par exemple, si l'entrée est 1
, le modèle doit générer 2
. Si le
l'entrée est one hundred
, la sortie doit être 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'} }
Définissez une variable avec le nom du modèle réglé à utiliser pour le reste du appels.
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'
Les valeurs optimales pour le nombre d'époques, la taille de lot et le taux d'apprentissage dépendent sur votre ensemble de données et d'autres contraintes de votre cas d'utilisation. Pour en savoir plus sur ces valeurs, consultez Paramètres de réglage avancés et Hyperparamètres :
Obtenir l'état du modèle réglé
L'état du modèle est défini sur CREATING
pendant l'entraînement et passe à
ACTIVE
une fois l'opération terminée.
CURL
Vous trouverez ci-dessous un extrait de code Python permettant d'analyser le nom du modèle généré à partir du JSON de réponse. Si vous l'exécutez dans un terminal, vous pouvez essayer d'utiliser un bash Analyseur JSON pour analyser la réponse.
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
Effectuez une autre requête GET
avec le nom du modèle pour obtenir les métadonnées du modèle,
inclut le champ state.
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()
Le code ci-dessous vérifie le champ "State" toutes les 5 secondes jusqu'à ce qu'il ne soit plus
dont l'état est 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'}
Exécuter une inférence
Une fois votre job de réglage terminé, vous pouvez l'utiliser pour générer du texte avec le texte Google Cloud.
CURL
Essayez de saisir un chiffre romain, par exemple 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" } ] } }
La sortie du modèle peut être incorrecte ou non. Si le modèle réglé n'est pas à la hauteur, vous pouvez essayer d'ajouter des exemples de qualité, l'ajustement des hyperparamètres ou l'ajout d'un préambule à votre exemples. Vous pouvez même créer un autre modèle réglé basé sur le premier modèle créé.
Consultez le guide de réglage pour obtenir plus de conseils sur l'amélioration des performances.
Python
Essayez de saisir un chiffre japonais, par exemple 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'}]} }
Le résultat du modèle peut être correct ou non. Si le modèle réglé n'est pas à la hauteur, vous pouvez essayer d'ajouter des exemples de qualité, l'ajustement des hyperparamètres ou l'ajout d'un préambule à votre exemples.
Conclusion
Même si les données d'entraînement ne contiennent aucune référence au romain ni au japonais numériques, le modèle a pu se généraliser bien après l'affinage. De cette façon, vous vous pouvez affiner les modèles pour les adapter à vos cas d'utilisation.
Étapes suivantes
Pour apprendre à utiliser le service de réglage à l'aide du SDK Python pour l'API Gemini, consultez le guide de démarrage rapide pour le réglage Python. Pour savoir comment Pour utiliser d'autres services de l'API Gemini, consultez la page Premiers pas avec REST tutoriel.