Это руководство поможет вам начать работу со службой настройки Gemini API с помощью Python SDK или REST API с помощью Curl . В примерах показано, как настроить текстовую модель службы генерации текста Gemini API.
Посмотреть на ai.google.dev | Попробуйте блокнот Colab | Посмотреть блокнот на GitHub |
Ограничения
Перед настройкой модели следует знать о следующих ограничениях:
Точная настройка наборов данных
Наборы данных тонкой настройки для Gemini 1.5 Flash имеют следующие ограничения:
- Максимальный размер ввода для каждого примера — 40 000 символов.
- Максимальный размер вывода для каждого примера — 5000 символов.
- Поддерживаются только примеры пар ввода-вывода. Многоходовые разговоры в стиле чата не поддерживаются.
Тюнингованные модели
Тюнингованные модели имеют следующие ограничения:
- Ограничение ввода настроенной модели Gemini 1.5 Flash составляет 40 000 символов.
- Режим JSON не поддерживается настроенными моделями.
- Поддерживается только ввод текста.
Настройка аутентификации
API Gemini позволяет настраивать модели на основе ваших собственных данных. Поскольку это ваши данные и ваши настроенные модели, требуется более строгий контроль доступа, чем могут обеспечить ключи API. Прежде чем вы сможете запустить это руководство, вам необходимо настроить OAuth для своего проекта , а затем загрузить «Идентификатор клиента OAuth» как «client_secret.json». Однако для использования настроенной модели вам не нужны учетные данные OAuth. После настройки модели с помощью OAuth вы можете получить к ней доступ с помощью ключа API.
Эта команда gcloud превращает файл client_secret.json
в учетные данные, которые можно использовать для аутентификации в службе.
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'
Установить переменные
КУЛОН
Установите переменные для повторяющихся значений, которые будут использоваться для остальных вызовов REST API. Код использует библиотеку os
Python для установки переменных среды, которые доступны во всех ячейках кода.
Это характерно для среды ноутбуков Colab. Код в следующей ячейке кода эквивалентен выполнению следующих команд в терминале 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"
Питон
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"
Импортируйте библиотеку requests
.
import requests
import json
Список настроенных моделей
Проверьте настройку аутентификации, перечислив доступные настроенные модели.
КУЛОН
curl -X GET ${base_url}/v1beta/tunedModels \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${access_token}" \
-H "x-goog-user-project: ${project_id}"
Питон
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()
Создайте настроенную модель
Чтобы создать настроенную модель, вам необходимо передать свой набор данных в модель в поле training_data
.
В этом примере вы настроите модель для генерации следующего числа в последовательности. Например, если входное значение равно 1
, модель должна вывести 2
. Если на входе one hundred
, на выходе должно быть 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
Питон
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'} }
Установите переменную с именем вашей настроенной модели, которая будет использоваться для остальных вызовов.
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'
Оптимальные значения количества эпох, размера пакета и скорости обучения зависят от вашего набора данных и других ограничений вашего варианта использования. Дополнительные сведения об этих значениях см. в разделе Расширенные настройки настройки и гиперпараметры .
Получить настроенное состояние модели
Состояние модели устанавливается на CREATING
во время обучения и изменится на ACTIVE
после его завершения.
КУЛОН
Ниже приведен фрагмент кода Python для анализа сгенерированного имени модели из ответа JSON. Если вы запускаете это в терминале, вы можете попробовать использовать анализатор 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
Выполните еще один запрос GET
с именем модели, чтобы получить метаданные модели, включая поле состояния.
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
Питон
tuned_model = requests.get(
url = f'{base_url}/v1beta/{name}',
headers=headers,
)
tuned_model.json()
Код ниже проверяет поле состояния каждые 5 секунд, пока оно не перестанет находиться в состоянии 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'}
Выполнить вывод
После завершения задания по настройке вы можете использовать его для создания текста с помощью текстового сервиса.
КУЛОН
Попробуйте ввести римскую цифру, скажем, 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" } ] } }
Выходные данные модели могут быть правильными или неверными. Если настроенная модель не соответствует требуемым стандартам, вы можете попробовать добавить больше примеров высокого качества, настроить гиперпараметры или добавить преамбулу к вашим примерам. Вы даже можете создать еще одну настроенную модель на основе первой, которую вы создали.
Дополнительные рекомендации по повышению производительности см. в руководстве по настройке .
Питон
Попробуйте ввести японскую цифру, скажем, 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'}]} }
Выходные данные модели могут быть правильными или неверными. Если настроенная модель не соответствует требуемым стандартам, вы можете попробовать добавить больше примеров высокого качества, настроить гиперпараметры или добавить преамбулу к вашим примерам.
Заключение
Несмотря на то, что данные обучения не содержали никаких ссылок на римские или японские цифры, модель смогла хорошо обобщить после точной настройки. Таким образом, вы можете точно настроить модели в соответствии с вашими сценариями использования.
Следующие шаги
Чтобы узнать, как использовать службу настройки с помощью Python SDK для API Gemini, посетите краткое руководство по настройке Python . Чтобы узнать, как использовать другие службы в Gemini API, посетите руководство по началу работы с REST .