Ver em ai.google.dev | Executar no Google Colab | Consulte o código-fonte no GitHub |
Neste notebook, você vai aprender a usar o serviço de ajuste da API Gemini usando comandos curl ou a API de solicitação em Python para chamar a API Gemini. Aqui você aprenderá a ajustar o modelo de texto por trás do serviço de geração de texto da API Gemini.
Configuração
Autenticar
A API Gemini permite ajustar modelos com base nos seus próprios dados. Como são seus dados e modelos ajustados, é necessário ter controles de acesso mais rigorosos do que as chaves de API podem fornecer.
Antes de executar este tutorial, é preciso configurar o OAuth para seu projeto.
No Colab, a maneira mais fácil de configurar é copiar o conteúdo do arquivo client_secret.json
para o "Gerenciador de secrets" (no ícone de chave no painel esquerdo) com o nome de secret CLIENT_SECRET
.
Esse comando gcloud transforma o arquivo client_secret.json
em credenciais que podem ser usadas para autenticação com o serviço.
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).
Chamar a API REST com CURL
Nesta seção, mostramos exemplos de instruções curl para chamar a API REST. Você vai aprender a criar um job de ajuste, verificar o status dele e, quando concluído, fazer uma chamada de inferência.
Definir variáveis
Defina variáveis para valores recorrentes a serem usadas no restante das chamadas da API REST. O código está usando a biblioteca os
do Python para definir variáveis de ambiente que podem ser acessadas em todas as células de código.
Isso é específico do ambiente de notebooks do Colab. O código na próxima célula é equivalente à execução dos seguintes comandos em um terminal 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"
Listar modelos ajustados
Verifique sua configuração de autenticação listando os modelos ajustados atualmente disponíveis.
curl -X GET ${base_url}/v1beta/tunedModels \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${access_token}" \
-H "x-goog-user-project: ${project_id}"
Criar modelo ajustado
Para criar um modelo ajustado, é necessário transmitir seu conjunto de dados para o modelo no campo training_data
.
Neste exemplo, você vai ajustar um modelo para gerar o próximo número na sequência. Por exemplo, se a entrada for 1
, o modelo vai gerar 2
como saída. Se a entrada for one hundred
, a saída precisará ser 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
Conferir o estado do modelo ajustado
O estado do modelo é definido como CREATING
durante o treinamento e mudará para ACTIVE
quando ele for concluído.
Confira abaixo um trecho de código Python para analisar o nome do modelo gerado com base no JSON de resposta. Se estiver executando em um terminal, tente usar um analisador JSON bash para analisar a resposta.
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
Faça outra solicitação GET
com o nome do modelo para receber os metadados do modelo que incluem o campo do estado.
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
Executar inferência
Depois que o job de ajuste for concluído, será possível usá-lo para gerar texto com o serviço de texto. Tente inserir um algarismo romano, por exemplo, 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" } ] } }
A saída do modelo pode ou não estar correta. Se o desempenho do modelo ajustado não estiver de acordo com os padrões exigidos, tente adicionar mais exemplos de alta qualidade, ajustar os hiperparâmetros ou adicionar um preâmbulo aos exemplos. É possível até criar outro modelo ajustado com base no primeiro que você criou.
Consulte o guia de ajuste para mais orientações sobre como melhorar o desempenho.
Chamar a API REST com solicitações Python
É possível chamar a API REST com qualquer biblioteca que permita enviar solicitações HTTP. O próximo conjunto de exemplos usa a biblioteca de solicitações Python e demonstra alguns dos recursos mais avançados.
Definir variáveis
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"
Importe a biblioteca requests
.
import requests
import json
Listar modelos ajustados
Verifique sua configuração de autenticação listando os modelos ajustados atualmente disponíveis.
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()
Criar modelo ajustado
Assim como no exemplo de curl, você transmite o conjunto de dados pelo 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'} }
Defina uma variável com o nome do modelo ajustado para usar no restante das chamadas.
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'
Conferir o estado do modelo ajustado
É possível verificar o progresso do job de ajuste verificando o campo de estado. CREATING
significa que o job de ajuste ainda está em andamento e ACTIVE
significa que os trainins foram concluídos e que o modelo ajustado está pronto para uso.
tuned_model = requests.get(
url = f'{base_url}/v1beta/{name}',
headers=headers,
)
tuned_model.json()
O código abaixo verifica o campo de estado a cada cinco segundos até que ele não esteja mais no estado 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'}
Executar inferência
Depois que o job de ajuste for concluído, será possível usá-lo para gerar texto da mesma maneira que você usaria o modelo de texto base. Tente inserir um numeral japonês, por exemplo, 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'}]} }
A saída do modelo pode ou não estar correta. Se o desempenho do modelo ajustado não estiver de acordo com os padrões exigidos, tente adicionar mais exemplos de alta qualidade, ajustar os hiperparâmetros ou adicionar um preâmbulo aos exemplos.
Conclusão
Mesmo que os dados de treinamento não tivessem nenhuma referência a numerais romanos ou japoneses, o modelo conseguiu generalizar bem após ajustes. Assim, é possível ajustar os modelos de acordo com seus casos de uso.
Próximas etapas
Para aprender a usar o serviço de ajuste com a ajuda do SDK do Python para a API Gemini, acesse o guia de início rápido de ajuste com Python. Para saber como usar outros serviços na API Gemini, acesse o guia de início rápido do Python.