Vertex AIからGeminiのAPIを呼び出す
Posted On 2024-02-15
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の中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー