こしあん
2024-02-15

Vertex AIからGeminiのAPIを呼び出す


391{icon} {views}


Google Cloudのサービスアカウントがある場合に、Vertex AIからGeminiのAPIをサクッと動かす方法のメモ。とりあえず試したいときに。

前提

  • サービスアカウントのJSONがある
  • サービスアカウントに対して適切な権限が付与されている

OpenAIに比べて全然情報がなく困ったのでメモ

テキストのみ

import vertexai
from vertexai.preview.generative_models import GenerativeModel
from google.oauth2 import service_account

PROJECT_ID = "{your-project-id}"
LOCATION = "asia-northeast1"
RESOURCE_ID = "gemini-pro"

# サービスアカウントキーファイルのパス
SERVICE_ACCOUNT_FILE = '{your-service-account}.json'

# APIスコープの設定
SCOPES = ['https://www.googleapis.com/auth/cloud-platform']

def main(user_input):
    # 認証情報の取得
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    vertexai.init(project=PROJECT_ID, location=LOCATION, credentials=credentials)


    model = GenerativeModel(RESOURCE_ID)
    chat = model.start_chat()

    config = {"max_output_tokens": 1024, "temperature": 1.0, "top_p": 1}
    response = chat.send_message(user_input, generation_config=config)

    print(response)

if __name__ == "__main__":
    main(user_input="こんにちは")

結果

candidates {
  content {
    role: "model"
    parts {
      text: "こんにちは。何かお手伝いできることはありますか?"
    }
  }
  finish_reason: STOP
  safety_ratings {
    category: HARM_CATEGORY_HATE_SPEECH
    probability: NEGLIGIBLE
  }
  safety_ratings {
    category: HARM_CATEGORY_DANGEROUS_CONTENT
    probability: NEGLIGIBLE
  }
  safety_ratings {
    category: HARM_CATEGORY_HARASSMENT
    probability: NEGLIGIBLE
  }
  safety_ratings {
    category: HARM_CATEGORY_SEXUALLY_EXPLICIT
    probability: NEGLIGIBLE
  }
}
usage_metadata {
  prompt_token_count: 1
  candidates_token_count: 10
  total_token_count: 11
}

マルチモーダル

GPT-4の論文の図で出てきて一躍有名にになったあの図を試す。ダウンロードしておく。

import vertexai
from vertexai.preview.generative_models import GenerativeModel, Image, GenerationConfig
from google.oauth2 import service_account

PROJECT_ID = "{your-project-id}"
LOCATION = "asia-northeast1"
RESOURCE_ID = "gemini-pro-vision"

# サービスアカウントキーファイルのパス
SERVICE_ACCOUNT_FILE = '{your-service-account}.json'

# APIスコープの設定
SCOPES = ['https://www.googleapis.com/auth/cloud-platform']

def main(image_path, user_input):
    # 認証情報の取得
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    vertexai.init(project=PROJECT_ID, location=LOCATION, credentials=credentials)

    model = GenerativeModel(RESOURCE_ID)
    config = GenerationConfig(max_output_tokens=1024, temperature=1.0, top_p=1)
    response = model.generate_content([
        Image.load_from_file(image_path),
        user_input
    ], generation_config=config)

    print(response)

if __name__ == "__main__":
    main(image_path="03-Confusing-Pictures.jpg", user_input="この画像の奇妙な点は何?")

ImageはPillowのインスタンスではなく、vertexai.preview.generative_modelsに紐づくもの。

結果

candidates {
  content {
    role: "model"
    parts {
      text: " この写真には奇妙な点がいくつかあります。\n\n* 車のトランクの上にアイロン台とアイロンを持っている人が乗っている。\n* アイロンがけをしながら、車道を走っている。\n* 周りの車はみんな彼を無視している。"   
    }
  }
  finish_reason: STOP
  safety_ratings {
    category: HARM_CATEGORY_HATE_SPEECH
    probability: NEGLIGIBLE
  }
  safety_ratings {
    category: HARM_CATEGORY_DANGEROUS_CONTENT
    probability: NEGLIGIBLE
  }
  safety_ratings {
    category: HARM_CATEGORY_HARASSMENT
    probability: NEGLIGIBLE
  }
  safety_ratings {
    category: HARM_CATEGORY_SEXUALLY_EXPLICIT
    probability: NEGLIGIBLE
  }
}
usage_metadata {
  prompt_token_count: 266
  candidates_token_count: 52
  total_token_count: 318
}

プロジェクトIDなどを直書きするのは割とアンチパターンな書き方な気がするけど、とりあえず動けばいいってときに手軽に使えるコードが欲しかったのでそこらへんは一旦無視ということで。



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です