Zobacz na ai.google.dev | Uruchom w Google Colab | Wyświetl źródło na GitHubie |
Z tego notatnika dowiesz się, jak zacząć korzystać z usługi dostrajania interfejsu Gemini API za pomocą poleceń curl lub interfejsu API żądania w Pythonie do wywoływania interfejsu Gemini API. W tym artykule dowiesz się, jak dostroić model tekstowy odpowiedzialny za usługę generowania tekstu przez interfejs Gemini API.
Konfiguracja
Uwierzytelnij
Interfejs Gemini API umożliwia dostrajanie modeli na podstawie Twoich własnych danych. To Twoje dane i dostrojone modele, wymagają więc bardziej rygorystycznej kontroli dostępu niż klucz API.
Zanim uruchomisz ten samouczek, musisz skonfigurować OAuth w swoim projekcie.
W Colab najłatwiej skopiować zawartość pliku client_secret.json
do „Menedżera obiektów tajnych” w Colab (pod ikoną klucza w panelu po lewej stronie) o nazwie CLIENT_SECRET
.
To polecenie gcloud przekształca plik client_secret.json
w dane logowania, których można używać do uwierzytelniania w usłudze.
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).
Wywoływanie interfejsu API REST w CURL
W tej sekcji znajdziesz przykładowe instrukcje curl służące do wywoływania interfejsu API REST. Dowiesz się, jak utworzyć zadanie dostrajania, sprawdzić jego stan, a po jego zakończeniu wykonać wywołanie wnioskowania.
Ustaw zmienne
Ustaw zmienne dla wartości cyklicznych do wykorzystania w pozostałych wywołaniach interfejsu API REST. Kod korzysta z biblioteki os
w języku Python, aby ustawiać zmienne środowiskowe, które są dostępne we wszystkich komórkach kodu.
Dotyczy to tylko środowiska notatników Colab. Kod w następnej komórce kodu jest odpowiednikiem uruchomienia poniższych poleceń w terminalu 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"
Wyświetlenie listy dostrojonych modeli
Sprawdź konfigurację uwierzytelniania, wyświetlając listę obecnie dostępnych dostrojonych modeli.
curl -X GET ${base_url}/v1beta/tunedModels \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${access_token}" \
-H "x-goog-user-project: ${project_id}"
Utwórz model dostrojony
Aby utworzyć model dostrojony, musisz przekazać mu zbiór danych w polu training_data
.
W tym przykładzie dostrojesz model tak, aby wygenerował kolejną liczbę w sekwencji. Jeśli np. dane wejściowe to 1
, model powinien zwrócić wynik 2
. Jeśli dane wejściowe to one hundred
, dane wyjściowe powinny mieć postać 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
Pobieranie stanu dostrojonego modelu
Podczas trenowania stan modelu jest ustawiony na CREATING
i zmieni się na ACTIVE
po zakończeniu tego procesu.
Poniżej znajduje się fragment kodu Pythona, który pozwala przeanalizować wygenerowaną nazwę modelu z pliku JSON odpowiedzi. Jeśli uruchamiasz go w terminalu, możesz spróbować przeanalizować odpowiedź za pomocą parsera JSON bash.
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
Wykonaj kolejne żądanie GET
z nazwą modelu, aby uzyskać metadane modelu zawierające pole stanu.
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
Uruchom wnioskowanie
Po zakończeniu zadania dostrajania możesz go użyć do wygenerowania tekstu za pomocą usługi tekstowej. Spróbuj wpisać liczbę rzymską, na przykład 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" } ] } }
Dane wyjściowe Twojego modelu mogą być poprawne, ale nie muszą. Jeśli model dostrojony nie spełnia Twoich wymagań, możesz spróbować dodać więcej przykładów wysokiej jakości, zmodyfikować hiperparametry lub dodać do nich wprowadzenie. Możesz nawet utworzyć kolejny dostrojony model na podstawie pierwszego.
Więcej informacji o zwiększaniu skuteczności znajdziesz w przewodniku po dostrajaniu.
Wywoływanie interfejsu API REST za pomocą żądań w Pythonie
Interfejs API reszty możesz wywołać za pomocą dowolnej biblioteki, która umożliwia wysyłanie żądań HTTP. Następny zestaw przykładów ilustruje użycie biblioteki żądań w Pythonie i przedstawia bardziej zaawansowane funkcje.
Ustaw zmienne
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"
Zaimportuj bibliotekę requests
.
import requests
import json
Wyświetlenie listy dostrojonych modeli
Sprawdź konfigurację uwierzytelniania, wyświetlając listę obecnie dostępnych dostrojonych modeli.
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()
Utwórz model dostrojony
Tak samo jak w przykładzie Curl, przekazujesz zbiór danych przez pole 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'} }
Ustaw zmienną z nazwą dostrojonego modelu, aby używać jej w pozostałych wywołaniach.
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'
Pobieranie stanu dostrojonego modelu
Postęp zadania dostrajania możesz sprawdzić w polu stanu. CREATING
oznacza, że zadanie dostrajania nadal trwa, a ACTIVE
oznacza, że trenowanie zostało zakończone, a dostrojony model jest gotowy do użycia.
tuned_model = requests.get(
url = f'{base_url}/v1beta/{name}',
headers=headers,
)
tuned_model.json()
Poniższy kod sprawdza pole stanu co 5 sekund, aż zniknie ze stanu 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'}
Uruchom wnioskowanie
Po zakończeniu zadania dostrajania możesz go użyć do wygenerowania tekstu w taki sam sposób, w jaki używasz podstawowego modelu tekstu. Spróbuj wpisać cyfrę japońską, np. 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'}]} }
Dane wyjściowe Twojego modelu mogą być poprawne, ale nie muszą. Jeśli model dostrojony nie spełnia Twoich wymagań, możesz spróbować dodać więcej przykładów wysokiej jakości, zmodyfikować hiperparametry lub dodać do nich wprowadzenie.
Podsumowanie
Mimo że dane treningowe nie zawierały żadnych odniesień do cyfr rzymskich ani japońskich, po dostrojeniu model był w stanie uogólnić wyniki. Dzięki temu możesz dostosowywać modele do swoich potrzeb.
Dalsze kroki
Aby dowiedzieć się, jak korzystać z usługi dostrajania za pomocą pakietu SDK Pythona na potrzeby interfejsu Gemini API, zapoznaj się z krótkim wprowadzeniem do Pythona. Aby dowiedzieć się, jak korzystać z innych usług w interfejsie Gemini API, zapoznaj się z krótkim wprowadzeniem do Pythona.