Interfejs API REST: dostrajanie modeli

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.