REST API: การปรับแต่งโมเดล

ดูใน ai.google.dev เรียกใช้ใน Google Colab ดูซอร์สบน GitHub

ในสมุดบันทึกนี้ คุณจะได้เรียนรู้วิธีเริ่มต้นใช้งานบริการปรับแต่ง Gemini API โดยใช้คำสั่ง curl หรือ API คำขอ Python เพื่อเรียกใช้ Gemini API ในที่นี้ คุณจะได้ศึกษาวิธีปรับแต่งรูปแบบข้อความที่อยู่เบื้องหลังบริการสร้างข้อความของ Gemini API

ตั้งค่า

ตรวจสอบสิทธิ์

Gemini API ให้คุณปรับแต่งโมเดลจากข้อมูลของคุณเอง และเนื่องจากเป็นข้อมูลของคุณและโมเดลที่มีการปรับแต่ง สิ่งนี้จึงต้องการการควบคุมการเข้าถึงที่เข้มงวดกว่าที่คีย์ API สามารถทำได้

คุณจะต้องตั้งค่า OAuth สำหรับโปรเจ็กต์ก่อนจึงจะเรียกใช้บทแนะนำนี้ได้

การตั้งค่าที่ง่ายที่สุดใน Colab คือคัดลอกเนื้อหาของไฟล์ client_secret.json ลงใน "Secret Manager" ของ Colab (ใต้ไอคอนคีย์ในแผงด้านซ้าย) โดยใช้ชื่อข้อมูลลับ CLIENT_SECRET

คำสั่ง gcloud นี้จะเปลี่ยนไฟล์ client_secret.json เป็นข้อมูลเข้าสู่ระบบที่ใช้ตรวจสอบสิทธิ์กับบริการได้

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

การเรียกใช้ REST API ด้วย CURL

ส่วนนี้จะแสดงตัวอย่างคำสั่ง curl สำหรับการเรียก REST API คุณจะได้เรียนรู้วิธีสร้างงานการปรับแต่ง ตรวจสอบสถานะของงาน และเมื่อดำเนินการเสร็จสิ้น ให้โทรอนุมาน

ตั้งค่าตัวแปร

ตั้งค่าตัวแปรสำหรับค่าที่เกิดซ้ำเพื่อใช้สำหรับการเรียก REST API ที่เหลือ โค้ดกำลังใช้ไลบรารี Python os เพื่อตั้งค่าตัวแปรสภาพแวดล้อมซึ่งเข้าถึงได้ในเซลล์โค้ดทั้งหมด

ซึ่งใช้สำหรับสภาพแวดล้อม Colab Notebook เท่านั้น โค้ดในเซลล์โค้ดถัดไปเทียบเท่ากับการเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล 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"

แสดงรายการโมเดลที่ปรับแต่ง

ยืนยันการตั้งค่าการตรวจสอบสิทธิ์โดยแสดงรายการโมเดลที่มีการปรับแต่งที่พร้อมใช้งานในปัจจุบัน


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

สร้างโมเดลที่ปรับแต่ง

หากต้องการสร้างโมเดลที่มีการปรับแต่ง คุณต้องส่งชุดข้อมูลไปยังโมเดลในช่อง 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

รับสถานะโมเดลที่ปรับแต่ง

สถานะของโมเดลจะเป็น 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-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

เรียกใช้การอนุมาน

เมื่องานการปรับแต่งเสร็จสิ้นแล้ว คุณจะใช้บริการนี้เพื่อสร้างข้อความด้วยบริการข้อความได้ ลองใส่เลขโรมัน เช่น 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"
      }
    ]
  }
}

เอาต์พุตจากโมเดลของคุณอาจไม่ถูกต้องหรือไม่ถูกต้อง หากโมเดลที่ปรับแต่งมีประสิทธิภาพไม่ตรงตามมาตรฐานที่คุณต้องการ คุณอาจลองเพิ่มตัวอย่างที่มีคุณภาพสูงขึ้น ปรับไฮเปอร์พารามิเตอร์ หรือเพิ่มพรีแอมเบิลลงในตัวอย่างของคุณ คุณยังสร้างโมเดลที่มีการปรับแต่งอีกแบบหนึ่งโดยยึดตามรูปแบบแรกที่คุณสร้างขึ้นได้ด้วย

ดูคู่มือการปรับแต่งเพื่อดูคำแนะนำเพิ่มเติมเกี่ยวกับการปรับปรุงประสิทธิภาพ

เรียกใช้ REST API ด้วยคำขอ Python

คุณสามารถเรียก API ที่เหลือกับไลบรารีใดก็ได้ที่อนุญาตให้คุณส่งคำขอ HTTP ตัวอย่างชุดถัดไปใช้ไลบรารีคำขอ 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"

นำเข้าไลบรารี 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}/v1beta/tunedModels',
  headers = headers,
)
result.json()

สร้างโมเดลที่ปรับแต่ง

เช่นเดียวกับตัวอย่าง Curl คุณจะส่งในชุดข้อมูลผ่านช่อง 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'} }

ตั้งค่าตัวแปรด้วยชื่อของโมเดลที่ปรับแต่งเพื่อใช้สำหรับการเรียกที่เหลือ

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

รับสถานะโมเดลที่ปรับแต่ง

คุณตรวจสอบความคืบหน้าของงานการปรับแต่งได้โดยตรวจสอบช่องสถานะ CREATING หมายความว่างานการปรับแต่งยังคงดำเนินอยู่ และ ACTIVE หมายความว่ารถไฟเสร็จสมบูรณ์แล้ว และโมเดลที่ปรับแต่งพร้อมใช้งานแล้ว

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

เรียกใช้การอนุมาน

เมื่องานการปรับแต่งเสร็จสิ้นแล้ว คุณสามารถใช้บริการนี้เพื่อสร้างข้อความได้ในลักษณะเดียวกับที่คุณใช้โมเดลข้อความฐาน ลองป้อนตัวเลขญี่ปุ่น เช่น 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 สำหรับ Gemini API ให้ไปที่การเริ่มต้นปรับแต่งด้วย Python อย่างรวดเร็ว หากต้องการดูวิธีใช้บริการอื่นๆ ใน Gemini API ให้ไปที่การเริ่มต้นอย่างรวดเร็วสำหรับ Python