|
2023年12月6日に、Googleは、テキスト、画像、オーディオを越えて機能する新しい大規模なマルチモーダルモデル(LMM)であるGeminiを発表しました。Geminiのテキスト機能は、同じ日にBARDに導入され、BARDからGeminiを利用することができるようになりました。その後、BARD は Gemini に統合されました。Gemini は、Google Gemini のサイトにアクセスすると利用可能です。また、Google Colaboratory からも利用可能です。
Googleは2024年2月、マルチモーダルAIのGeminiよりも軽量であり、オープンソースで商用利用も可能な大規模言語モデル「Gemma」をリリースしました。そして5月にはGemmaの強化版である「Gemma 2」も発表しました。さらに、2024年10月3日に、東京で開催された Gemma Developer Day で、日本語版 Gemma 2 2B を公開しました。webデモがこのHugging Face のサイトにあるので、誰でも利用可能です。
Google DeepMind が開発した「 Imagen 」シリーズはテキストプロンプトから高品質な画像を生成する画像生成モデルです。この画像生成モデル「imagen」を使用し、プロンプトから画像を生成できるプラットフォーム「ImageFX」が Google からリリースされています。既存の生成AI作成ツール「VideoFX」、「MusicFX」と「TextFX」もリニューアルされています。DeepMind が開発した画像生成AI「Imagen」の最新バージョンは「Imagen 3」です。ImageFXの公式サイトはこちらです。Google Gemini のサイトからも利用できます。Googleアカウントがあれば試すことができます。ただし、利用できるモデルと使用回数に制限があります。
なお、Google の Compute Engine API 、Vertex AI API などの Generative AI を利用するためには、従量課金制のサービスアカウントを必要とします。OpenAI API 、Anthropic API などの利用と同様に、有料となっています。
Last updated: 2024.12.1
Google VertexAI API の利用 |
VertexAI API を利用するための必要なアカウントは課金制になります。そのため、 Google Cloud のサービスアカウントを作成する必要があります。従量課金制ですが、使用しない時にも課金されるような状態が続き、予想外の料金となることがあります。Google Cloud の支払画面「予算とアラート」という項目に上限金額を設定するか、API を実行しないときはサービスアカウントは閉じた方がいいです。
通常の Google アカウントはユーザーに紐づくもので、ユーザーがこのアカウントの情報を用いてGoogleの各種サービスを利用します。一方で、サービスアカウントは、Google Cloud のプロジェクトに紐づくものです。各種アプリケーションはサービスアカウントを使用して、 API 呼び出しを行います。アプリケーションをサービスアカウントで認証する最も一般的な方法は、アプリケーションを実行しているリソースにサービスアカウントを関連付けることです。
Google Cloud のサービスアカウントの作り方にある説明は Google Cloud Console、gcloud コマンドライン ツールを使用してサービス アカウントを作成する方法になっているので、初心者にとっては理解が難しいです。ここでは簡単に説明します。
まずは Google Cloud コンソール画面にアクセスします。この画面の検索窓に「サービスアカウント」を入力すれば、「サービスアカウント」作成のページに行けます。「サービスアカウントの作成」をクリックします。「サービスアカウント名」「サービスアカウントID」に自身に固有の名称などを記述し、「サービスアカウントの説明」に識別可能な説明を記述します。サービス アカウントを作成するときは、my-service-account などのように英数字で ID を指定する必要があります。ID は 6~30 文字で、小文字の英数字とダッシュを使用できます。作成したサービス アカウントの名前は変更できません。
サービス アカウントの名前は、作成時にプロビジョニングされたメールアドレスにSERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com の形式で表示されます。サービスアカウント名は自身が見分けをつけるための表示名です。一方でサービスアカウント ID は1つしか存在しない ID です。今後はこの ID によってサービスアカウントを指定していきます。
「サービス アカウントにプロジェクトへのアクセスを許可する」 「ユーザーにこのサービス アカウントへのアクセスを許可」 は省略可能です。
サービスアカウントの一覧画面で、作成したアカウントの詳細を確認してください。
サービス アカウントを作成したら、そのサービス アカウントに 1 つ以上のロールを付与し、自分の代わりに実行できるようにします。プリンシパルに 1 つのロールを付与する方法は次のとおりです。Google Cloud コンソールの [IAM] ページに移動します。プロジェクトを選択し、ロールを付与するプリンシパル(通常、オーナー)を選択します。
最後に、このサービスアカウントに対応する認証するためのサービス アカウント キーをダウンロードします。サービス アカウント キーを作成するに説明が掲載されています。以下のとおりです。
{ "type": "service_account", "project_id": "PROJECT_ID", "private_key_id": "KEY_ID", "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY\n-----END PRIVATE KEY-----\n", "client_email": "SERVICE_ACCOUNT_EMAIL", "client_id": "CLIENT_ID", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL" }
サービス アカウントが他のプロジェクトのリソースにアクセスする必要がある場合は、サービス アカウントを作成したプロジェクトで「Vertex AI API」を有効にする必要があります。有効になっていないときは、サービスアカウントの左側のナビゲーションメニューから「APIとサービス」→「ライブラリ」を選択します。「ライブラリ」ページで、「Vertex AI API」を検索して、「Vertex AI API」をクリックして詳細ページを開くます。「有効にする」ボタンをクリックします。
以上の準備を前提にして、VertexAI API の利用の方法について説明します。以下では Jupyter Notebok を使います。仮想環境で次のコマンドを実行して、 google-cloud-aiplatform パッケージをインストールします。この中には、Vertex AI SDK for Python と Vertex AI Python クライアント ライブラリの両方が含まれています。
!pip install --upgrade google-cloud-aiplatform
Vertex AI を Python 環境下で利用するには、最初に以下の環境変数の設定をする必要があります。path/to/service_account.json に、上でダウンロードしたサービス アカウント キーの json ファイルへのパスを記述します。
import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "path/to/service_account.json"
最初に、文章生成を実行してみます。プロンプト・リクエストを送信するには、Python コードを作成し、PROJECT_ID の値を Google Cloud プロジェクトの ID に設定します。"my-project-id" にサービスアカウントの project ID を記入して下さい。このコードを実行すると、以下のような返信が表示されます。利用したモデルは、gemini-1.5-flash-001 です。locatioin を変更するとき、例えば、東京にしたいときは、locatioin=asia-northeast1 とします。
import vertexai from vertexai.generative_models import GenerativeModel # TODO(developer): Set the following variables and un-comment the lines below PROJECT_ID = "my-project-id" MODEL_ID = "gemini-1.5-flash-001" vertexai.init(project=PROJECT_ID, location="us-central1") model = GenerativeModel(MODEL_ID) responses = model.generate_content( "浦島太郎と乙姫との出会いの小説を書いて下さい。", stream=True ) for response in responses: print(response.text) --- response ## 深海の光 漁を終え、夕暮れの海を漂う小さな舟。そこにいたのは、浦島太郎、まだ若く、漁師としては経験が浅い青年だった。 「今日は何も獲れなかったなぁ…」 太郎はため息をつき、空を見上げた。茜色に染まる空は美しく、心が少し安らぐ。しかし、その美しさは、今日の不漁をより一層際立たせるようにも思えた。 「あれは何だ?」 太郎は、海面を漂う奇妙な光に気がついた。光は、まるで海の底から湧き上がるように、ゆらゆらと揺れていた。好奇心と、日中の疲れからくる軽い高揚感が、太郎をその光へと駆り立てた。 彼は、躊躇なく海に飛び込んだ。 冷たい海水に包まれた瞬間、光はより鮮明になった。そして、光が指し示す方向に、太郎は目を疑うような光景を目にした。それは、巨大な真珠貝だった。 「こんな大きな貝は見たことがない…」 太郎は、息を呑んだ。貝は、まるで生きているかのようにゆっくりと開き、そこから現れたのは、想像 を絶する美しさの女性だった。 彼女の長い髪は、真珠のように光り輝き、その目は、深海の青さを思わせるような澄み切った青色をしていた。 「あなたは…?」 太郎は、言葉を失った。 「私は乙姫と申します。あなたは何者?」 乙姫は、優しい声で尋ねた。 「浦島太郎と申します。漁師です。」 太郎は、自分の名前を告げ、乙姫の美しさに圧倒されながら、言葉を続けた。 「あなたは…どこから?」 「私は、この海の底に住んでいます。あなたを、この貝の中に招きたくて、光を放ったのです。」 乙姫は、微笑んだ。その微笑みは、太陽の光のように温かく、太郎の心を和ませた。 「この貝の中は…?」 「そこは、私の住む龍宮城です。 美しい景色と、美味しい食べ物、そして、楽しい時間がいっぱい待っています。」 乙姫は、そう言って、太郎を貝の中へと招いた。 太郎は、迷わず貝の中に入った。 そこには、想像をはるかに超える世界が広がっていた。 キラキラと光る珊瑚礁、色とりどりの魚が群れをなして泳ぐ海、そして、美しい龍宮城。太郎は、目を見張った。 乙姫は、太郎を龍宮城に案内し、様々なものを紹介してくれた。 「これは、海竜の宝玉です。光を放ち、願いを叶えてくれると言われています。」 「これは、海女が採ってきた真珠です。あなたのために、特別に作りました。」 乙姫は、楽しそうに説明し、太郎は、乙姫の優しさに心から感謝した。 日中は、乙姫と龍宮城を散策したり、楽しい遊びをしたり、夜は、乙姫と一緒に美しい星空を眺めたり。太郎は、乙姫と過ごす時間は、まるで夢のようだった。 しかし、太郎は、いつまでもここにいるわけにはいかない。 「乙姫様、そろそろ故郷に戻らなければなりません。」 太郎は、乙姫にそう告げると、乙姫は悲しそうな顔をした。 「そんなに早く…?」 「はい。家族も心配しているでしょうし、漁に出なければなりません。」 太郎は、乙姫の寂しそうな顔を見て、申し訳ない気持ちになった。 「でも、また必ずあなたに会いに来ます。」 太郎は、そう約束し、乙姫に別れを告げた。 乙姫は、太郎に、小さな箱を手渡した。 「これは、あなたへの贈り物です。この箱を開けたら、すぐに私に会えるでしょう。」 太郎は、乙姫から箱を受け取り、乙姫に深々と頭を下げた。 「乙姫様、本当にありがとうございました。あなたとの出会いは、私の宝物です。」 太郎は、乙姫に別れを告げ、貝の中を出て、海に戻った。 再び、夕暮れの海に浮かぶ小さな舟。 太郎は、乙姫との出会いを思い出しながら、故郷へと向かった。 彼の心には、乙姫の美しい姿と、龍宮城の煌びやかな景色、そして、二人の過ごした楽しい時間が、鮮やかに焼き付いていた。 「必ず、また会いに来る。」 太郎は、そう決意し、故郷への航海を続けた。
日本人にお馴染みの昔話が生成されています。
この例では、stream=True と指定されているので、ストリーミング テキスト レスポンスが実行されました。 ストリーミング レスポンスでは、プロンプトが生成されたときにそれに対するレスポンスの受信を伴います。つまり、モデルが出力トークンを生成するとすぐに出力トークンが送信されます。反対に、非ストリーミング レスポンスではテキスト入力から非ストリーミング モデルのレスポンスを生成します。非ストリーミング レスポンスは、すべての出力トークンが生成された後にのみ送信されます。非ストリーミング レスポンスの場合は、パラメータを削除するか、パラメータを False に設定します。
プロンプトと画像を Vertex AI Gemini API に送信する例を取り上げます。説明は Vertex AI: docs/start/quickstrats を参照ください。マルチモーダルのモデルを使用するので、gemini-1.5-flash-002 を使用します。テキストや画像などのマルチモーダル入力から非ストリーミング モデル レスポンスを生成します。 次のコードを使用して、テキストと画像を含むプロンプトを Vertex AI Gemini API に送信します。この例は、提供された画像 (Java サンプルの画像) の説明を返します。
import vertexai from vertexai.generative_models import GenerativeModel, Part # TODO(developer): Update and un-comment below line PROJECT_ID = "my-project-id" vertexai.init(project=PROJECT_ID, location="us-central1") model = GenerativeModel("gemini-1.5-flash-002") response = model.generate_content( [ Part.from_uri( "gs://cloud-samples-data/generative-ai/image/scones.jpg", mime_type="image/jpeg", ), "この画像に写っているものは何ですか?", ] ) print(response.text) --- response これは、ブルーベリーマフィン、コーヒー、ペオニーの花が置かれたテーブルの上の写真です。背景は暗く、絵画的な雰囲気になっています。マフィンは美しく、コーヒーは温かく、花は華やかです。全体として、写真の雰囲気は落ち着いていて、美しく、温かみがあります。
次に、プロンプトとビデオを Vertex AI Gemini API に送信する例を説明します。次のコードは、テキスト、オーディオ、ビデオを含むプロンプトを Vertex AI Gemini API に送信する例です。この例は、オーディオ トラックの重要な情報を含む、提供されたビデオの説明を返します。
import vertexai from vertexai.generative_models import GenerativeModel, Part # TODO(developer): Update and un-comment below line PROJECT_ID = "my-project-id" vertexai.init(project=PROJECT_ID, location="us-central1") model = GenerativeModel("gemini-1.5-flash-002") prompt = """ 動画の説明を記述してください。 説明には、動画内で人々が言っている重要な内容も含める必要があります。 """ video_file = Part.from_uri( uri="gs://cloud-samples-data/generative-ai/video/pixel8.mp4", mime_type="video/mp4", ) contents = [video_file, prompt] response = model.generate_content(contents) print(response.text) --- response 喜んでお手伝いいたします。以下は、このビデオの短い概要です。 このGoogle Pixelの広告では、東京に住む写真家のSaeko Shimadaさんが、夜の東京のさまざまな場所を訪れます。彼女は、新しいPixelのビデオブースト機能を紹介しています。この機能では、暗い場所でもナイトサイト機能が自動的にオンになり、画質が向上します。 Shimadaさんは、最初に東京に引っ越してきたときに住んでいた街、Sanchaを訪問します。そこで、彼女はその場所の思い出を振り返り、その場所でビデオを撮影します。その後、渋谷を訪れて、夜の街の活気に満ちた様子を撮影します。 このビデオ全体を通して、Shimadaさんは新しいPixelのカメラの機能を紹介しています。 ご不明な点がございましたらお知らせください。
英語で返信させるともっと詳しい説明が表示されます。日本語での説明は英語版の半分程度になっています。
オーディオの文字起こしにいついて説明します。以下は、オーディオ ファイルを使用してインタビューを書き起こす方法を示しています。オーディオのみのファイルのタイムスタンプの理解を有効にするには、GenerationConfig で audioTimestamp パラメータを有効にします。
import vertexai from vertexai.generative_models import GenerativeModel, GenerationConfig, Part # TODO(developer): Update and un-comment below line # PROJECT_ID = "my-project-id" vertexai.init(project=PROJECT_ID, location="us-central1") model = GenerativeModel("gemini-1.5-flash-002") prompt = """ Can you transcribe this interview, in the format of timecode, speaker, caption. Use speaker A, speaker B, etc. to identify speakers. """ audio_file_uri = "gs://cloud-samples-data/generative-ai/audio/pixel.mp3" audio_file = Part.from_uri(audio_file_uri, mime_type="audio/mpeg") contents = [audio_file, prompt] response = model.generate_content(contents, generation_config=GenerationConfig(audio_timestamp=True)) print(response.text) # Example response: # [00:00:00] Speaker A: Your devices are getting better over time... # [00:00:16] Speaker B: Welcome to the Made by Google podcast, ... # [00:01:00] Speaker A: So many features. I am a singer. ... # [00:01:33] Speaker B: Amazing. DeCarlos, same question to you, ... --- response 00:00 Speaker A: your devices are getting better over time and so we think about it across the entire portfolio from phones to watch to buds to tablet. We get really excited about how we can tell a joint narrative across everything. 00:14 Speaker B: Welcome to the Made by Google Podcast where we meet the people who work on the Google products you love. Here's your host, Rasheed Finch. 00:21 Speaker B: Today we're talking to Aisha Sharif and De Carlos Love. They're both product managers for various Pixel devices and work on something that all the Pixel owners love. The Pixel feature drops. This is the Made by Google Podcast. 00:35 Speaker B: Aisha, which feature on your Pixel phone has been most transformative in your own life? 00:40 Speaker A: So many features. I am a singer, so I actually think recorded transcription has been incredible because before I would record songs, I just like freestyle them, record them, type them up, but now with transcription, it works so well even deciphering lyrics that were jumbled. I think that's huge. 00:57 Speaker B: Amazing. De Carlos, same question to you, but for your Pixel Watch, of course, longtime listeners will know you work on Pixel Watch. What has been the most transformative feature in your own life on Pixel Watch? 01:07 Speaker C: I work on the fitness experiences and so for me it's definitely the ability to track my heart rate but specifically around the different heart rate targets and zone features that we've released. For me it's been super helpful. My background is in more football, track and field and in terms of what I've done before and so using the heart rate features to really help me understand that I shouldn't be going as hard when I'm running, you know, leisurely two or three miles and helping me really tone that down a bit. It's actually been pretty transformative for me to see how things like my resting heart rate have changed due to that feature. 01:42 Speaker B: Amazing. And Aisha, I know we spend a lot of time and energy on feature drops within the Pixel team. Why are they so important to us? 01:49 Speaker A: So exactly what De Carlos said, they're important to this narrative that your devices are getting better over time and so we think about it across the entire portfolio from phones to watch to buds to tablet to fold, which is also a phone, but we've even thrown in like chrome OS to our drops sometimes and so we get really excited about how we can tell a joint narrative across everything. The other part is with our Pixel 8 and 8 Pro and I'm still so excited about this. We have seven years of OS updates, security updates and feature drops and so feature drops just pairs so nicely into this narrative of how your devices are getting better over time and they'll continue to get better over time. 02:27 Speaker B: Yeah, we'll still be talking about Pixel 8 and Pixel 8 Pro in 2030 with those seven years of software updates and I promise we'll have an episode on that shortly. Now, the March feature drop is upon us, but I just wanted to look back to the last one, first one from January. Aisha, could you tell us some of the highlights from the January one that just launched? 02:47 Speaker A: So it was one of the few times where we've done a software drop with hardware as well, so it was really exciting to get that new mint color out on Pixel 8 and 8 Pro. We also had the body temperature sensor launch in the US, so now you're able to actually just with like a scan of your forehead, get your body temp, which is huge. And then a ton of AI enhancements, Circle to search came to Pixel 8 and 8 Pro, so you can search from anywhere. One of my favorites, photo emoji. So now you can use photos that you have in your album and react to messages with them. Most random, I was hosting a donut ice cream party and literally had a picture of a donut ice cream sandwich that I used to react to messages. Love those little random reactions that you can put out there. --- 10:18 Speaker B: Thank you for listening to the Made by Google Podcast. Don't miss out on new episodes. Subscribe now wherever you get your podcasts to be the first to listen.
返信されたテキストが長いので、省略しました。日本語の音声ファイルの利用ができなかったので、英語版で実行しました。
チャット プロンプト リクエストを送信する方法について説明します。ここでは、サポートされている SDK を使用して、Gemini 1.0 Pro(gemini-1.0-pro)モデルにチャット プロンプトを送信する方法を取り上げます。Gemini 1.0 Pro は、自然言語タスク、マルチターン テキストとコードチャット、コード生成など、テキストのみの入力によるプロンプトをサポートしています。テキストとコードを出力できます。
Gemini 1.0 Pro の基盤モデルは、言語の理解と生成に優れた大規模言語モデルです。コードの理解と生成においても、Geomini Pro とは、シングルターンのプロンプトとレスポンスで対話することや、マルチターンの連続した会話でチャットすることができます。
以下のコードを実行して下さい。stream=True となっていますので、ストリーミング レスポンスを生成します。
import vertexai from vertexai.generative_models import GenerativeModel, ChatSession # TODO(developer): Update and un-comment below line # PROJECT_ID = "my-project-id" vertexai.init(project=PROJECT_ID, location="us-central1") model = GenerativeModel("gemini-1.5-flash-002") chat_session = model.start_chat() def get_chat_response(chat: ChatSession, prompt: str) -> str: text_response = [] responses = chat.send_message(prompt, stream=True) for chunk in responses: text_response.append(chunk.text) return "".join(text_response) prompt = "こんにちは" print(get_chat_response(chat_session, prompt)) # Example response: # Hello there! How can I help you today? prompt = "虹の中にある全ての色は何ですか?" print(get_chat_response(chat_session, prompt)) # Example response: # The colors in a rainbow are often remembered using the acronym ROY G. BIV: # * **Red** # * **Orange** ... prompt = "虹には、どうしてそのような色が出るのでしょうか?" print(get_chat_response(chat_session, prompt)) # Example response: # It's important to note that these colors blend smoothly into each other, ... --- response こんにちは! 虹の色は、実際には連続的なスペクトルなので、明確な数の色に分類するのは難しいです。 しかし、一般的には以下の7色が挙げられます: * **赤** * **橙** * **黄** * **緑** * **青** * **藍** * **紫** ただし、これらの色の境界は曖昧であり、人によって、あるいは光の条件によって、微妙に違って見えることもあります。 実際には、赤と橙の間、橙と黄の間など、無数の微妙な色合いが存在しています。 虹の色は、太陽光が空気中の水滴によって屈折、反射、分散されることで生み出されます。 詳しく説明すると: 1. **太陽光は様々な色の光からなる:** 太陽光は、私たちが目に見える可視光線だけでなく、赤外線や紫外線など、様々な波長の光を含んでいます。 これらの光は、波長によって屈折率が異なります(波長の短い光ほど強く屈折します)。 2. **水滴への入射と屈折:** 太陽光が雨粒などの水滴に入射すると、空気と水の境界面で屈折します。 この時、異なる波長の光はそれぞれ異なる角度で屈折します。 波長の短い紫色の光は強く屈折し、波長の長い赤色の光は弱く屈折します。 3. **水滴内での反射:** 屈折した光は水滴の内側で反射します。 4. **水滴からの出射と分散:** 反射した光は、再び水滴と空気の境界面で屈折して水滴から出射します。 この時、異なる波長の光はそれぞれ異なる角度で出射するため、光が分散され、様々な色が分離して見えます。 5. **観測者の位置:** 虹を見るためには、太陽の反対側に位置し、雨粒によって散乱された光を目にする必要があります。 そのため、虹の位置や形は、観測者と太陽、そして雨粒の位置関係によって決まります。 簡単に言うと、太陽光が水滴の中でプリズムのように作用し、様々な色の光を分離することで虹が発生するのです。 それぞれの色の光は、特定の角度で観測者に届くため、円弧状に見えます。
以上が、Vertex AI API の Python SDK を用いて、Gemini モデルにプロンプトを送信して、その返答を受信するためのコードサンプルでした。Gemini モデルでのチューニングの方法については触れませんでした。Imagen を利用することに関しても省略しました。
Vertex AI には、次の基盤モデル API があります。
詳しい情報は Vetrex AI 公式サイトを参照下さい。
Vertex AI の Model Garden で利用可能なモデルには、Googleが開発した Gemma など、 そして、Llama 、 Huggingface 、 Flux 、 Stable Diffusion などのオープンソースモデルがあります。さらに、パートナー モデルと呼ばれるモデルを使用することもできます。利用可能なモデルの詳細は、 Model Garden のモデルカードで確認できます。Anthropic Claude モデルは、Vertex AI で使用できるパートナー モデルの一つです。