บทแนะนำการปรับแต่ง

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

ดูใน ai.google.dev ลองใช้ Colab Notebook ดูสมุดบันทึกใน GitHub

ตั้งค่าการตรวจสอบสิทธิ์

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

ก่อนที่คุณจะสามารถเรียกใช้บทแนะนำนี้ได้ คุณจะต้องตั้งค่า OAuth สำหรับ โปรเจ็กต์ จากนั้นดาวน์โหลด "รหัสไคลเอ็นต์ OAuth" เป็น "client_secret.json"

คำสั่ง 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'

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

CURL

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

ระบบนี้ใช้เฉพาะกับสภาพแวดล้อมสมุดบันทึก Colab เท่านั้น โค้ดในอีก เซลล์โค้ดเทียบเท่ากับการเรียกใช้คำสั่งต่อไปนี้ในแบช เครื่องปลายทาง

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"

นำเข้าไลบรารี requests

import requests
import json

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

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

CURL


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

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

หากต้องการสร้างโมเดลที่ปรับแต่ง คุณต้องส่งชุดข้อมูลไปยังโมเดลใน training_data

สำหรับตัวอย่างนี้ คุณจะปรับแต่งโมเดลเพื่อสร้างตัวเลขถัดไปใน ตามลำดับ ตัวอย่างเช่น หากอินพุตคือ 1 โมเดลควรแสดงผลเป็น 2 หาก อินพุตคือ one hundred เอาต์พุตควรเป็น one hundred one

CURL


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

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

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

ค่าที่เหมาะสมที่สุดสำหรับจำนวน Epoch ขนาดกลุ่ม และอัตราการเรียนรู้จะขึ้นอยู่กับ ในชุดข้อมูลและข้อจำกัดอื่นๆ ของ Use Case หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ ค่าเหล่านี้ โปรดดู การตั้งค่าการปรับแต่งขั้นสูงและ ไฮเปอร์พารามิเตอร์

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

สถานะของโมเดลตั้งค่าเป็น CREATING ระหว่างการฝึกและจะเปลี่ยนเป็น ACTIVEเมื่อดำเนินการเสร็จแล้ว

CURL

ด้านล่างนี้เป็นโค้ด 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

Python

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

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

เมื่องานการปรับแต่งเสร็จสิ้น คุณจะสามารถใช้งานดังกล่าวเพื่อสร้างข้อความพร้อมข้อความ service.

CURL

ลองป้อนเลขโรมัน เช่น 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"
    }
  ]
}
}

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

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

Python

ลองป้อนตัวเลขภาษาญี่ปุ่น เช่น 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 โปรดไปที่การเริ่มต้นใช้งาน REST บทแนะนำ