<ph type="x-smartling-placeholder">
Dieses Tutorial hilft Ihnen beim Einstieg in die Gemini API-Abstimmung mit dem Python SDK oder der REST API unter Verwendung von curl Die Beispiele zeigen, wie das Textmodell dahinter den Textgenerierungsdienst der Gemini API.
Auf ai.google.dev ansehen | Colab-Notebook testen | Notebook auf GitHub ansehen |
Authentifizierung einrichten
Mit der Gemini API können Sie Modelle anhand Ihrer eigenen Daten abstimmen. Da es sich um Ihre Daten und für Ihre abgestimmten Modelle gelten strengere Zugriffssteuerungen als API-Schlüssel.
Bevor Sie diese Anleitung ausführen können, müssen Sie OAuth für Ihr Projekt und laden Sie dann die Datei „OAuth-Client-ID“ als „client_secret.json“.
Dieser gcloud-Befehl wandelt die Datei client_secret.json
in Anmeldedaten um, die
kann zur Authentifizierung beim Dienst verwendet werden.
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'
Variablen festlegen
CURL
Variablen für wiederkehrende Werte zur Verwendung für den Rest der REST API festlegen
Anrufe. Der Code verwendet die Python-Bibliothek os
, um die Umgebung festzulegen
Variablen, auf die in allen Codezellen zugegriffen werden kann.
Dies gilt speziell für die Colab-Notebookumgebung. Der Code in der nächsten der Codezelle entspricht dem Ausführen der folgenden Befehle in einer 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"
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"
Importieren Sie die requests
-Bibliothek.
import requests
import json
Abgestimmte Modelle auflisten
Überprüfen Sie Ihre Authentifizierungseinrichtung, indem Sie die verfügbaren abgestimmten Modelle auflisten.
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()
Abgestimmtes Modell erstellen
Um ein abgestimmtes Modell zu erstellen, müssen Sie Ihr Dataset an das Modell in der
training_data
.
In diesem Beispiel stimmen Sie ein Modell ab, um die nächste Zahl in der
Sequenz hinzufügen. Wenn die Eingabe beispielsweise 1
ist, sollte das Modell 2
ausgeben. Wenn die
Eingabe one hundred
ist, sollte die Ausgabe one hundred one
sein.
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'} }
Legen Sie eine Variable mit dem Namen Ihres abgestimmten Modells fest, die für den Rest des Anrufe.
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'
Die optimalen Werte für Epochenanzahl, Batchgröße und Lernrate für Ihr Dataset und andere Einschränkungen für Ihren Anwendungsfall. Weitere Informationen über finden Sie unter Erweiterte Abstimmungseinstellungen und Hyperparameter:
Abgestimmten Modellstatus abrufen
Der Status des Modells wird während des Trainings auf CREATING
gesetzt und ändert sich in
ACTIVE
.
CURL
Unten sehen Sie Python-Code zum Parsen des generierten Modellnamens aus der JSON-Antwort. Wenn du dies in einem Terminal ausführst, kannst du es mit einer Bash versuchen JSON-Parser zum Parsen der Antwort.
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
Führen Sie eine weitere GET
-Anfrage mit dem Modellnamen aus, um die Modellmetadaten abzurufen,
enthält das Feld für den Bundesstaat.
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()
Der folgende Code prüft das Statusfeld alle 5 Sekunden, bis es nicht mehr angezeigt wird
hat den 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'}
Inferenz ausführen
Sobald der Abstimmungsjob abgeschlossen ist, können Sie ihn verwenden, um Text mit dem Text zu generieren Service.
CURL
Versuchen Sie, eine römische Zahl einzugeben, z. B. 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" } ] } }
Die Ausgabe des Modells kann korrekt sein oder nicht. Wenn das abgestimmte Modell nicht den erforderlichen Standards entspricht, können Sie Qualitätsbeispiele, das Anpassen der Hyperparameter oder das Hinzufügen einer Präambel zu Ihrem Beispiele. Sie können sogar ein weiteres abgestimmtes Modell erstellen, das auf dem ersten Modell basiert, erstellt.
Weitere Informationen finden Sie im Leitfaden zur Abstimmung. .
Python
Versuchen Sie, eine japanische Zahl einzugeben, z. B. 6 (UDP):
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'}]} }
Die Ausgabe des Modells kann korrekt sein oder nicht. Wenn das abgestimmte Modell nicht den erforderlichen Standards entspricht, können Sie Qualitätsbeispiele, das Anpassen der Hyperparameter oder das Hinzufügen einer Präambel zu Ihrem Beispiele.
Fazit
Obwohl die Trainingsdaten keine Verweise auf römische oder japanische Sprache enthielten, Zahlen, konnte das Modell nach der Feinabstimmung lange verallgemeinern. Auf diese Weise können Sie Modelle an Ihre Anwendungsfälle anpassen.
Nächste Schritte
Informationen zum Verwenden des Abstimmungsdienstes mithilfe des Python SDK für den Gemini API erhalten Sie in der Kurzanleitung zur Feinabstimmung mit Python. Weitere Informationen Informationen zur Verwendung anderer Dienste in der Gemini API finden Sie unter REST – Erste Schritte )