在 ai.google.dev 上查看 | 試用 Colab 筆記本 | 在 GitHub 中查看筆記本 | 下載筆記本 |
在這個 Notebook 中,您將瞭解如何開始使用 PaLM API 調整服務,使用 curl 指令或 Python 要求 API 呼叫 PaLM REST API。以下說明如何調整 PaLM API 文字生成服務的文字模型。
設定
驗證
PaLM API 可讓您使用自有資料調整模型。由於這是您的資料和經過調整的模型,因此需要比 API 金鑰更嚴格的存取權控管機制。
您必須先為專案設定 OAuth,才能執行本教學課程。
如果想在 Colab 中執行這個筆記本,請先使用「File」>「Upload」選項上傳 client_secret*.json
檔案。
cp client_secret*.json client_secret.json
ls
client_secret.json
這個 gcloud 指令會將 client_secret.json
檔案轉換為可用於驗證服務的憑證。
import os
if 'COLAB_RELEASE_TAG' in os.environ:
# 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'
else:
!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'
使用 CURL 呼叫 REST API
本節提供呼叫 REST API 的範例 curl 陳述式。您將瞭解如何建立調整工作、檢查其狀態,以及在完成後發出推論呼叫。
設定變數
設定變數,用於在其餘的 REST API 呼叫中使用重複的值。程式碼會使用 Python os
程式庫設定環境變數,這些變數可在所有程式碼單元中存取。
這項功能僅適用於 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'] = "project-id"
os.environ['base_url'] = "https://generativelanguage.googleapis.com"
列出調整後的模型
列出目前可用的經過調整的模型,驗證驗證設定。
curl -X GET ${base_url}/v1beta3/tunedModels \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ${access_token}" \
-H "x-goog-user-project: ${project_id}" | grep name
"name": "tunedModels/testnumbergenerator-fvitocr834l6", "name": "tunedModels/my-display-name-81-9wpmc1m920vq", "displayName": "my display name 81", "name": "tunedModels/number-generator-model-kctlevca1g3q", "name": "tunedModels/my-display-name-81-r9wcuda14lyy", "displayName": "my display name 81", "name": "tunedModels/number-generator-model-w1eabln5adwp", % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 17583 0 17583 0 0 51600 0 --:--:-- --:--:-- --:--:-- 51563
建立經過調整的模型
如要建立經過調整的模型,您必須在 training_data
欄位中將資料集傳遞至模型。
在這個範例中,您將調整模型,以便產生序列中的下一個數字。舉例來說,如果輸入內容是 1
,模型應輸出 2
。如果輸入值為 one hundred
,輸出值應為 one hundred one
。
curl -X POST ${base_url}/v1beta3/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/text-bison-001",
"tuning_task": {
"hyperparameters": {
"batch_size": 2,
"learning_rate": 0.001,
"epoch_count":3,
},
"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-q2d0uism5ivd/operations/xvyx09sjxlmh", "metadata": { "@type": "type.googleapis.com/google.ai.generativelanguage.v1beta3.CreateTunedModelMetadata", "totalSteps": 23, "tunedModel": "tunedModels/number-generator-model-q2d0uism5ivd" } } % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2277 0 297 100 1980 146 975 0:00:02 0:00:02 --:--:-- 1121
取得經過調整的模型狀態
模型的狀態在訓練期間會設為 CREATING
,完成訓練後會變更為 ACTIVE
。
以下是一些 Python 程式碼,可從 JSON 回應中剖析產生的模型名稱。如果您是在終端機中執行這項操作,可以嘗試使用 bash JSON 剖析器來剖析回應。
import json
first_page = json.load(open('tunemodel.json'))
os.environ['modelname'] = first_page['metadata']['tunedModel']
print(os.environ['modelname'])
tunedModels/number-generator-model-q2d0uism5ivd
使用模型名稱執行另一個 GET
要求,取得包含狀態欄位的模型中繼資料。
curl -X GET ${base_url}/v1beta3/${modelname} \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ${access_token}" \
-H "x-goog-user-project: ${project_id}" \ | grep state
"state": "CREATING", % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 494 0 494 0 0 760 0 --:--:-- --:--:-- --:--:-- 760 curl: (3) URL using bad/illegal format or missing URL
執行推論
調整工作完成後,即可用文字服務生成文字。
curl -X POST ${base_url}/v1beta3/${modelname}:generateText \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ${access_token}" \
-H "x-goog-user-project: ${project_id}" \
-d '{
"prompt": {
"text": "4"
},
"temperature": 1.0,
"candidate_count": 2}' | grep output
"output": "3 2 1", "output": "3 2", % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1569 0 1447 100 122 183 15 0:00:08 0:00:07 0:00:01 310
模型的輸出內容可能正確,也可能不正確。如果經過調整的模型無法達到您要求的標準,您可以嘗試新增更多高品質的範例、調整超參數,或在範例中加入前言。您甚至可以根據先前建立的模型建立另一個經過調整的模型。
如要進一步瞭解如何改善效能,請參閱調整指南。
使用 Python 要求呼叫 REST API
您可以使用任何可傳送 HTTP 要求的程式庫呼叫 REST API。接下來的範例會使用 Python 要求程式庫,並示範一些進階功能。
設定變數
access_token = !gcloud auth application-default print-access-token
access_token = '\n'.join(access_token)
project = 'project-id'
base_url = "https://generativelanguage.googleapis.com"
匯入 requests
程式庫。
import requests
import json
列出調整後的模型
列出目前可用的經過調整的模型,驗證驗證設定。
headers={
'Authorization': 'Bearer ' + access_token,
'Content-Type': 'application/json',
'x-goog-user-project': project
}
result = requests.get(
url=f'{base_url}/v1beta3/tunedModels',
headers = headers,
)
result.json()
{'tunedModels': [{'name': 'tunedModels/testnumbergenerator-fvitocr834l6', 'baseModel': 'models/text-bison-001', 'displayName': 'test_number_generator', 'description': '{"description":"generates the next number in the sequence given the input text","exampleInput":"input: 1","exampleOutput":"output: 2","datasourceUrl":"https://drive.google.com/open?id=11Pdm6GNom4vlBMUHwO6yFjGQT3t1yi44WVShXMFnkVA&authuser=0&resourcekey=0-2d17tccbdBoThXMkNDvtag","showedTuningComplete":false}', 'state': 'ACTIVE', 'createTime': '2023-09-18T11:06:39.092786Z', 'updateTime': '2023-09-18T11:07:24.198359Z', 'tuningTask': {'startTime': '2023-09-18T11:06:39.461814784Z', 'completeTime': '2023-09-18T11:07:24.198359Z', 'snapshots': [{'step': 1, 'meanLoss': 16.613504, 'computeTime': '2023-09-18T11:06:44.532937624Z'}, {'step': 2, 'epoch': 1, 'meanLoss': 20.299532, 'computeTime': '2023-09-18T11:06:47.825134421Z'}, {'step': 3, 'epoch': 1, 'meanLoss': 8.169708, 'computeTime': '2023-09-18T11:06:50.580344344Z'}, {'step': 4, 'epoch': 2, 'meanLoss': 3.7588992, 'computeTime': '2023-09-18T11:06:53.219133748Z'}, {'step': 5, 'epoch': 3, 'meanLoss': 2.0643115, 'computeTime': '2023-09-18T11:06:55.828458606Z'}, {'step': 6, 'epoch': 3, 'meanLoss': 1.9765375, 'computeTime': '2023-09-18T11:06:58.426053772Z'}, {'step': 7, 'epoch': 4, 'meanLoss': 0.9276156, 'computeTime': '2023-09-18T11:07:01.231832398Z'}, {'step': 8, 'epoch': 5, 'meanLoss': 1.8424839, 'computeTime': '2023-09-18T11:07:03.822710074Z'}, {'step': 9, 'epoch': 5, 'meanLoss': 1.1747926, 'computeTime': '2023-09-18T11:07:06.441685551Z'}, {'step': 10, 'epoch': 6, 'meanLoss': 0.3079359, 'computeTime': '2023-09-18T11:07:08.793491157Z'}, {'step': 11, 'epoch': 7, 'meanLoss': 0.543368, 'computeTime': '2023-09-18T11:07:11.393264892Z'}, {'step': 12, 'epoch': 7, 'meanLoss': 0.35068464, 'computeTime': '2023-09-18T11:07:13.808021238Z'}, {'step': 13, 'epoch': 8, 'meanLoss': 0.026032856, 'computeTime': '2023-09-18T11:07:16.295972078Z'}, {'step': 14, 'epoch': 8, 'meanLoss': 0.108341046, 'computeTime': '2023-09-18T11:07:18.941247488Z'}, {'step': 15, 'epoch': 9, 'meanLoss': 0.016470395, 'computeTime': '2023-09-18T11:07:21.607654306Z'}, {'step': 16, 'epoch': 10, 'meanLoss': 0.063049875, 'computeTime': '2023-09-18T11:07:24.077271307Z'}], 'hyperparameters': {'epochCount': 10, 'batchSize': 16, 'learningRate': 0.02} }, 'temperature': 0.7, 'topP': 0.95, 'topK': 40}, {'name': 'tunedModels/my-display-name-81-9wpmc1m920vq', 'baseModel': 'models/text-bison-tuning-test', 'displayName': 'my display name 81', 'state': 'ACTIVE', 'createTime': '2023-09-18T22:02:08.690991Z', 'updateTime': '2023-09-18T22:02:28.806318Z', 'tuningTask': {'startTime': '2023-09-18T22:02:09.161100369Z', 'completeTime': '2023-09-18T22:02:28.806318Z', 'snapshots': [{'step': 1, 'meanLoss': 7.2774773, 'computeTime': '2023-09-18T22:02:12.453056368Z'}, {'step': 2, 'meanLoss': 6.1902447, 'computeTime': '2023-09-18T22:02:13.789508217Z'}, {'step': 3, 'meanLoss': 5.5545835, 'computeTime': '2023-09-18T22:02:15.136220505Z'}, {'step': 4, 'epoch': 1, 'meanLoss': 7.9237704, 'computeTime': '2023-09-18T22:02:16.474358517Z'}, {'step': 5, 'epoch': 1, 'meanLoss': 7.6770706, 'computeTime': '2023-09-18T22:02:17.758261108Z'}, {'step': 6, 'epoch': 1, 'meanLoss': 7.378622, 'computeTime': '2023-09-18T22:02:19.114072224Z'}, {'step': 7, 'epoch': 1, 'meanLoss': 4.485537, 'computeTime': '2023-09-18T22:02:20.927434115Z'}, {'step': 8, 'epoch': 2, 'meanLoss': 6.815181, 'computeTime': '2023-09-18T22:02:22.267906011Z'}, {'step': 9, 'epoch': 2, 'meanLoss': 6.411363, 'computeTime': '2023-09-18T22:02:24.078114085Z'}, {'step': 10, 'epoch': 2, 'meanLoss': 8.585093, 'computeTime': '2023-09-18T22:02:25.441598938Z'}, {'step': 11, 'epoch': 2, 'meanLoss': 4.901249, 'computeTime': '2023-09-18T22:02:27.108985392Z'}, {'step': 12, 'epoch': 3, 'meanLoss': 7.073003, 'computeTime': '2023-09-18T22:02:28.441662034Z'}], 'hyperparameters': {'epochCount': 3, 'batchSize': 4, 'learningRate': 0.001} }, 'temperature': 0.7, 'topP': 0.95, 'topK': 40}, {'name': 'tunedModels/number-generator-model-kctlevca1g3q', 'baseModel': 'models/text-bison-tuning-test', 'displayName': 'number generator model', 'state': 'ACTIVE', 'createTime': '2023-09-18T23:43:21.461545Z', 'updateTime': '2023-09-18T23:43:49.205493Z', 'tuningTask': {'startTime': '2023-09-18T23:43:21.542403958Z', 'completeTime': '2023-09-18T23:43:49.205493Z', 'snapshots': [{'step': 1, 'meanLoss': 7.342065, 'computeTime': '2023-09-18T23:43:23.356271969Z'}, {'step': 2, 'meanLoss': 7.255807, 'computeTime': '2023-09-18T23:43:24.620248223Z'}, {'step': 3, 'meanLoss': 5.4591417, 'computeTime': '2023-09-18T23:43:25.854505395Z'}, {'step': 4, 'meanLoss': 6.968665, 'computeTime': '2023-09-18T23:43:27.138260198Z'}, {'step': 5, 'meanLoss': 4.578809, 'computeTime': '2023-09-18T23:43:28.404943274Z'}, {'step': 6, 'meanLoss': 6.4862137, 'computeTime': '2023-09-18T23:43:29.631624883Z'}, {'step': 7, 'meanLoss': 9.781939, 'computeTime': '2023-09-18T23:43:30.801341449Z'}, {'step': 8, 'epoch': 1, 'meanLoss': 5.990006, 'computeTime': '2023-09-18T23:43:31.854703315Z'}, {'step': 9, 'epoch': 1, 'meanLoss': 8.846312, 'computeTime': '2023-09-18T23:43:33.075785103Z'}, {'step': 10, 'epoch': 1, 'meanLoss': 6.1585655, 'computeTime': '2023-09-18T23:43:34.310432174Z'}, {'step': 11, 'epoch': 1, 'meanLoss': 4.7877502, 'computeTime': '2023-09-18T23:43:35.381582526Z'}, {'step': 12, 'epoch': 1, 'meanLoss': 9.660514, 'computeTime': '2023-09-18T23:43:36.445446408Z'}, {'step': 13, 'epoch': 1, 'meanLoss': 5.6482882, 'computeTime': '2023-09-18T23:43:37.603237821Z'}, {'step': 14, 'epoch': 1, 'meanLoss': 3.162092, 'computeTime': '2023-09-18T23:43:38.671463397Z'}, {'step': 15, 'epoch': 2, 'meanLoss': 6.322996, 'computeTime': '2023-09-18T23:43:39.769742201Z'}, {'step': 16, 'epoch': 2, 'meanLoss': 6.781, 'computeTime': '2023-09-18T23:43:40.985967994Z'}, {'step': 17, 'epoch': 2, 'meanLoss': 5.136773, 'computeTime': '2023-09-18T23:43:42.235469710Z'}, {'step': 18, 'epoch': 2, 'meanLoss': 7.2091155, 'computeTime': '2023-09-18T23:43:43.415178581Z'}, {'step': 19, 'epoch': 2, 'meanLoss': 7.7508755, 'computeTime': '2023-09-18T23:43:44.775221774Z'}, {'step': 20, 'epoch': 2, 'meanLoss': 8.144815, 'computeTime': '2023-09-18T23:43:45.788824334Z'}, {'step': 21, 'epoch': 2, 'meanLoss': 5.485137, 'computeTime': '2023-09-18T23:43:46.812663998Z'}, {'step': 22, 'epoch': 2, 'meanLoss': 3.709197, 'computeTime': '2023-09-18T23:43:47.971764087Z'}, {'step': 23, 'epoch': 3, 'meanLoss': 6.0069466, 'computeTime': '2023-09-18T23:43:49.004191079Z'}], 'hyperparameters': {'epochCount': 3, 'batchSize': 2, 'learningRate': 0.001} }, 'temperature': 0.7, 'topP': 0.95, 'topK': 40}, {'name': 'tunedModels/my-display-name-81-r9wcuda14lyy', 'baseModel': 'models/text-bison-tuning-test', 'displayName': 'my display name 81', 'state': 'ACTIVE', 'createTime': '2023-09-18T23:52:06.980185Z', 'updateTime': '2023-09-18T23:52:26.679601Z', 'tuningTask': {'startTime': '2023-09-18T23:52:07.616953503Z', 'completeTime': '2023-09-18T23:52:26.679601Z', 'snapshots': [{'step': 1, 'meanLoss': 7.2774773, 'computeTime': '2023-09-18T23:52:10.278936662Z'}, {'step': 2, 'meanLoss': 6.2793097, 'computeTime': '2023-09-18T23:52:11.630844790Z'}, {'step': 3, 'meanLoss': 5.540499, 'computeTime': '2023-09-18T23:52:13.027840389Z'}, {'step': 4, 'epoch': 1, 'meanLoss': 7.977523, 'computeTime': '2023-09-18T23:52:14.368199020Z'}, {'step': 5, 'epoch': 1, 'meanLoss': 7.6197805, 'computeTime': '2023-09-18T23:52:15.872428752Z'}, {'step': 6, 'epoch': 1, 'meanLoss': 7.3851357, 'computeTime': '2023-09-18T23:52:17.213094182Z'}, {'step': 7, 'epoch': 1, 'meanLoss': 4.5342345, 'computeTime': '2023-09-18T23:52:19.090698421Z'}, {'step': 8, 'epoch': 2, 'meanLoss': 6.8603754, 'computeTime': '2023-09-18T23:52:20.494844731Z'}, {'step': 9, 'epoch': 2, 'meanLoss': 6.418575, 'computeTime': '2023-09-18T23:52:21.815997555Z'}, {'step': 10, 'epoch': 2, 'meanLoss': 8.659064, 'computeTime': '2023-09-18T23:52:23.524287192Z'}, {'step': 11, 'epoch': 2, 'meanLoss': 4.856765, 'computeTime': '2023-09-18T23:52:24.864661291Z'}, {'step': 12, 'epoch': 3, 'meanLoss': 7.1078596, 'computeTime': '2023-09-18T23:52:26.225055381Z'}], 'hyperparameters': {'epochCount': 3, 'batchSize': 4, 'learningRate': 0.001} }, 'temperature': 0.7, 'topP': 0.95, 'topK': 40}, {'name': 'tunedModels/number-generator-model-w1eabln5adwp', 'baseModel': 'models/text-bison-tuning-test', 'displayName': 'number generator model', 'state': 'ACTIVE', 'createTime': '2023-09-19T19:29:08.622497Z', 'updateTime': '2023-09-19T19:29:46.063853Z', 'tuningTask': {'startTime': '2023-09-19T19:29:08.806930486Z', 'completeTime': '2023-09-19T19:29:46.063853Z', 'snapshots': [{'step': 1, 'meanLoss': 7.342065, 'computeTime': '2023-09-19T19:29:13.023811994Z'}, {'step': 2, 'meanLoss': 7.1960244, 'computeTime': '2023-09-19T19:29:14.844046282Z'}, {'step': 3, 'meanLoss': 5.480289, 'computeTime': '2023-09-19T19:29:16.596884354Z'}, {'step': 4, 'meanLoss': 6.851822, 'computeTime': '2023-09-19T19:29:17.741735378Z'}, {'step': 5, 'meanLoss': 4.5535283, 'computeTime': '2023-09-19T19:29:18.914760812Z'}, {'step': 6, 'meanLoss': 6.449012, 'computeTime': '2023-09-19T19:29:20.053316042Z'}, {'step': 7, 'meanLoss': 9.842458, 'computeTime': '2023-09-19T19:29:21.371286675Z'}, {'step': 8, 'epoch': 1, 'meanLoss': 5.9831877, 'computeTime': '2023-09-19T19:29:22.915277044Z'}, {'step': 9, 'epoch': 1, 'meanLoss': 8.936815, 'computeTime': '2023-09-19T19:29:24.666461680Z'}, {'step': 10, 'epoch': 1, 'meanLoss': 6.14651, 'computeTime': '2023-09-19T19:29:26.793310451Z'}, {'step': 11, 'epoch': 1, 'meanLoss': 4.853589, 'computeTime': '2023-09-19T19:29:28.328297535Z'}, {'step': 12, 'epoch': 1, 'meanLoss': 9.6831045, 'computeTime': '2023-09-19T19:29:29.501236840Z'}, {'step': 13, 'epoch': 1, 'meanLoss': 5.706586, 'computeTime': '2023-09-19T19:29:30.612807978Z'}, {'step': 14, 'epoch': 1, 'meanLoss': 3.276942, 'computeTime': '2023-09-19T19:29:31.928747103Z'}, {'step': 15, 'epoch': 2, 'meanLoss': 6.1736736, 'computeTime': '2023-09-19T19:29:33.588699180Z'}, {'step': 16, 'epoch': 2, 'meanLoss': 6.857398, 'computeTime': '2023-09-19T19:29:35.239083809Z'}, {'step': 17, 'epoch': 2, 'meanLoss': 5.098094, 'computeTime': '2023-09-19T19:29:37.000705047Z'}, {'step': 18, 'epoch': 2, 'meanLoss': 7.27724, 'computeTime': '2023-09-19T19:29:38.532313231Z'}, {'step': 19, 'epoch': 2, 'meanLoss': 7.6310735, 'computeTime': '2023-09-19T19:29:39.696034301Z'}, {'step': 20, 'epoch': 2, 'meanLoss': 8.152623, 'computeTime': '2023-09-19T19:29:40.803342042Z'}, {'step': 21, 'epoch': 2, 'meanLoss': 5.451577, 'computeTime': '2023-09-19T19:29:42.445788199Z'}, {'step': 22, 'epoch': 2, 'meanLoss': 3.7990716, 'computeTime': '2023-09-19T19:29:43.866737307Z'}, {'step': 23, 'epoch': 3, 'meanLoss': 6.120624, 'computeTime': '2023-09-19T19:29:45.599248553Z'}], 'hyperparameters': {'epochCount': 3, 'batchSize': 2, 'learningRate': 0.001} }, 'temperature': 0.7, 'topP': 0.95, 'topK': 40}]}
建立經過調整的模型
與 Curl 範例相同,您可以透過 training_data
欄位傳入資料集。
operation = requests.post(
url = f'{base_url}/v1beta3/tunedModels',
headers=headers,
json= {
"display_name": "number generator",
"base_model": "models/text-bison-001",
"tuning_task": {
"hyperparameters": {
"batch_size": 4,
"learning_rate": 0.001,
"epoch_count":3,
},
"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-ncqqnysl74dt/operations/qqlbwzfyzn0k', 'metadata': {'@type': 'type.googleapis.com/google.ai.generativelanguage.v1beta3.CreateTunedModelMetadata', 'totalSteps': 12, 'tunedModel': 'tunedModels/number-generator-ncqqnysl74dt'} }
設定變數,並使用經過調整的模型名稱,以便在後續呼叫中使用。
name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-ncqqnysl74dt'
取得經過調整的模型狀態
您可以查看狀態欄位,瞭解調整作業的進度。CREATING
表示調整工作仍在進行中,ACTIVE
則表示訓練已完成,且調整後的模型可供使用。
tuned_model = requests.get(
url = f'{base_url}/v1beta3/{name}',
headers=headers,
)
tuned_model.json()
{'name': 'tunedModels/number-generator-ncqqnysl74dt', 'baseModel': 'models/text-bison-001', 'displayName': 'number generator', 'state': 'CREATING', 'createTime': '2023-09-19T19:56:25.999303Z', 'updateTime': '2023-09-19T19:56:25.999303Z', 'tuningTask': {'startTime': '2023-09-19T19:56:26.297862545Z', 'hyperparameters': {'epochCount': 3, 'batchSize': 4, 'learningRate': 0.001} }, 'temperature': 0.7, 'topP': 0.95, 'topK': 40}
以下程式碼每 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(31)
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)
21.28% - {'step': 40, 'epoch': 10, 'meanLoss': 2.4871845, 'computeTime': '2023-09-20T00:23:55.255785843Z'} 21.28% - {'step': 40, 'epoch': 10, 'meanLoss': 2.4871845, 'computeTime': '2023-09-20T00:23:55.255785843Z'} 43.09% - {'step': 81, 'epoch': 21, 'meanLoss': 0.032220088, 'computeTime': '2023-09-20T00:24:56.302837803Z'} 43.09% - {'step': 81, 'epoch': 21, 'meanLoss': 0.032220088, 'computeTime': '2023-09-20T00:24:56.302837803Z'} 63.83% - {'step': 120, 'epoch': 32, 'meanLoss': 0.0030430648, 'computeTime': '2023-09-20T00:25:57.228615435Z'} 63.83% - {'step': 120, 'epoch': 32, 'meanLoss': 0.0030430648, 'computeTime': '2023-09-20T00:25:57.228615435Z'} 85.11% - {'step': 160, 'epoch': 42, 'meanLoss': -1.1145603e-06, 'computeTime': '2023-09-20T00:26:57.819011896Z'} 100.00% - {'step': 188, 'epoch': 50, 'meanLoss': 0.00040101097, 'computeTime': '2023-09-20T00:27:40.024132813Z'}
執行推論
微調作業完成後,您可以使用該模型產生文字,方法與使用基本文字模型相同。
import time
m = requests.post(
url = f'{base_url}/v1beta3/{name}:generateText',
headers=headers,
json= {
"prompt": {
"text": "9"
},
})
import pprint
print(m.json()['candidates'][0]['output'])
9
模型輸出內容不一定正確。如果經過調整的模型無法達到您要求的標準,您可以嘗試新增更多高品質的範例、調整超參數,或在範例中加入前言。
後續步驟
- 請參閱使用 Python 進行調整的快速入門指南,開始使用調整服務編寫程式碼。
- 如要進一步瞭解如何針對用途最佳化模型,請參閱調整指南。