Hướng dẫn tinh chỉnh

Hướng dẫn này sẽ giúp bạn bắt đầu điều chỉnh Gemini API dịch vụ bằng SDK Python hoặc REST API sử dụng curl. Các ví dụ cho thấy cách điều chỉnh mô hình văn bản dịch vụ tạo văn bản Gemini API.

Xem trên ai.google.dev Dùng thử sổ tay Colab Xem sổ tay trên GitHub

Thiết lập tính năng xác thực

Gemini API cho phép bạn điều chỉnh các mô hình bằng dữ liệu của riêng mình. Vì đó là dữ liệu của bạn và các mô hình được điều chỉnh của bạn sử dụng các kiểm soát truy cập nghiêm ngặt hơn so với các khoá API có thể cung cấp.

Trước khi chạy hướng dẫn này, bạn cần thiết lập OAuth cho dự án rồi tải xuống "Mã ứng dụng OAuth" ở dạng "client_secret.json".

Lệnh gcloud này chuyển tệp client_secret.json thành thông tin đăng nhập có thể được sử dụng để xác thực với dịch vụ.

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'

Đặt biến

URL C

Đặt biến cho các giá trị định kỳ để sử dụng cho phần còn lại của API REST cuộc gọi. Mã này sử dụng thư viện os Python để thiết lập môi trường các biến có thể truy cập được trong tất cả các ô chứa mã.

Chế độ này dành riêng cho môi trường sổ tay Colab. Mã trong phần tiếp theo ô chứa mã tương đương với việc chạy các lệnh sau trong bash thiết bị đầu cuối.

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"

Python

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"

Nhập thư viện requests.

import requests
import json

Liệt kê các mô hình được điều chỉnh

Xác minh chế độ xác thực của bạn bằng cách liệt kê các mô hình đã được điều chỉnh và hiện có.

URL C


curl -X GET ${base_url}/v1beta/tunedModels \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${access_token}" \
    -H "x-goog-user-project: ${project_id}"

Python

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()

Tạo mô hình được điều chỉnh

Để tạo một mô hình được điều chỉnh, bạn cần truyền tập dữ liệu vào mô hình trong Trường training_data.

Trong ví dụ này, bạn sẽ điều chỉnh một mô hình để tạo số tiếp theo trong trình tự. Ví dụ: nếu đầu vào là 1 thì mô hình sẽ xuất ra 2. Nếu đầu vào là one hundred, thì đầu ra phải là one hundred one.

URL C


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

Python

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'} }

Đặt biến có tên của mô hình được điều chỉnh để sử dụng cho phần còn lại của cuộc gọi.

name=operation.json()["metadata"]["tunedModel"]
name
'tunedModels/number-generator-wl1qr34x2py'

Các giá trị tối ưu cho số lượng thời gian bắt đầu của hệ thống, kích thước lô và tốc độ học là phụ thuộc trên tập dữ liệu và các hạn chế khác trong trường hợp sử dụng của bạn. Để tìm hiểu thêm về các giá trị này, xem Cài đặt chỉnh nâng caoSiêu tham số.

Nhận trạng thái mô hình được điều chỉnh

Trạng thái của mô hình này được đặt thành CREATING trong quá trình huấn luyện và sẽ thay đổi thành ACTIVE sau khi hoàn tất.

URL C

Dưới đây là một đoạn mã Python để phân tích cú pháp tên mô hình đã tạo từ JSON phản hồi. Nếu đang chạy lệnh này trong thiết bị đầu cuối, bạn có thể thử sử dụng bash Trình phân tích cú pháp JSON để phân tích cú pháp phản hồi.

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

Thực hiện một yêu cầu GET khác với tên mô hình để lấy siêu dữ liệu của mô hình bao gồm trường trạng thái.


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

Python

tuned_model = requests.get(
    url = f'{base_url}/v1beta/{name}',
    headers=headers,
)
tuned_model.json()

Đoạn mã bên dưới kiểm tra trường trạng thái 5 giây một lần cho đến khi trường đó không còn nữa ở trạng thái 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'}

Chạy dự đoán

Sau khi công việc điều chỉnh hoàn tất, bạn có thể sử dụng công việc đó để tạo văn bản có văn bản .

URL C

Thử nhập một chữ số La Mã, giả sử 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"
    }
  ]
}
}

Kết quả từ mô hình có thể có hoặc không chính xác. Nếu mô hình được điều chỉnh đang không hoạt động theo tiêu chuẩn bắt buộc, bạn có thể thử thêm các ví dụ về chất lượng, tinh chỉnh các siêu tham số hoặc thêm phần mở đầu vào ví dụ. Bạn thậm chí có thể tạo một mô hình được điều chỉnh khác dựa trên mô hình đầu tiên bạn đã tạo.

Xem hướng dẫn điều chỉnh để được hướng dẫn thêm về cách cải thiện hiệu suất.

Python

Thử nhập một chữ số tiếng Nhật, chẳng hạn như 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'}]} }

Kết quả từ mô hình có thể có hoặc không chính xác. Nếu mô hình được điều chỉnh đang không hoạt động theo tiêu chuẩn bắt buộc, bạn có thể thử thêm các ví dụ về chất lượng, tinh chỉnh các siêu tham số hoặc thêm phần mở đầu vào ví dụ.

Kết luận

Mặc dù dữ liệu huấn luyện không chứa bất kỳ tham chiếu nào đến tiếng La Mã hoặc tiếng Nhật chữ số, nên mô hình này có thể khái quát hoá tốt sau khi tinh chỉnh. Bằng cách này, bạn có thể tinh chỉnh các mô hình cho phù hợp với trường hợp sử dụng của mình.

Các bước tiếp theo

Để tìm hiểu cách sử dụng dịch vụ điều chỉnh với sự trợ giúp của SDK Python cho Gemini API, hãy xem phần bắt đầu nhanh điều chỉnh với Python. Để tìm hiểu cách làm để sử dụng các dịch vụ khác trong Gemini API, hãy truy cập vào trang hướng dẫn bắt đầu REST hướng dẫn.