Vertex AI のマルチモーダルのサンプルコードを触ってみた

2024年10月7日掲載

キービジュアル

前回は、Vertex AIのマルチモーダル処理を利用して、マルチターンプロンプトのアプリを作成し、Googleサイトに埋め込むまでの手順を紹介しました。

詳細は、「Vertex AI を利用して Google サイトにマルチターンプロンプトを構築してみた」をご確認ください。

今回は、前回の記事で利用した Vertex AI SDK の機能とともに、Vertex AI マルチモーダルの SDK サンプルコードを用いた簡単な利用例を紹介します。

目次

Vertex AI SDK for Python を利用するには

まず Vertex AI SDK を利用するためには google-cloud-aiplatform パッケージのインストールまたは更新を行う必要があります。

今回は次のコマンドでインストールを実行します。

pip install --upgrade google-cloud-aiplatform

現時点で、Vertex AI SDK for Python で推奨されているバージョンは python3.8 以上になります。

Vertex AI SDK のサンプルコード

第 1 弾の記事「Vertex AI を利用して Google サイトにマルチターンプロンプトを構築してみた」でも紹介していますが、以下のように Vertex AI マルチモーダル画面の「コードを取得」よりサンプルコードを取得できます。

 

今回は Python を利用しておりますが、他に Node.js や Java などのコードも取得できます。

モデル定義

パッケージインストール後の Vertex AI モデル定義について紹介します。

今回はサンプルコードで提供しているマルチターンチャットを使用しており、ここでは GCP プロジェクト、使用ロケーション、Gemini モデルのバージョンを指定してマルチターンチャットのセッションを作成しています。

import vertexai
from vertexai.preview.generative_models import GenerativeModel

PROJECT_ID = "プロジェクトIDを入力"
LOCATION = "asia-northeast1"
Model_NAME = "gemini-1.5-pro-001"

# Vertex AI の初期化
vertexai.init(project=PROJECT_ID, location=LOCATION)

# gemini モデルの指定&作成
model = GenerativeModel(model_name=Model_NAME)

# マルチターンチャットのセッション開始
chat = model.start_chat()

テキスト推論

続けて作成したマルチターンチャットを使用してテキスト推論を行います。

マルチターンチャットへは send_message() を使用することでリクエストを行うことができ、まずはサンプルとして「富士山の標高は何mですか?」という質問を行います。

import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession

PROJECT_ID = "プロジェクトIDを入力"
LOCATION = "asia-northeast1"
Model_NAME = "gemini-1.5-pro-001"

vertexai.init(project=PROJECT_ID, location=LOCATION)
model = GenerativeModel(model_name=Model_NAME)
chat = model.start_chat()

def multiturn_generate_content(chat: ChatSession, text: str) -> str:
  response = chat.send_message([text]) # テキストのみでのリクエスト
  return response

text = "富士山の標高は何mですか?"
print(multiturn_generate_content(chat, text))

 

レスポンスは一部のみ掲載しておりますが、以下のように「富士山の標高は **3,776m** です。」という回答が返ってきたので、正しく推論できていることが分かります。

content {
  role: "model"
  parts {
    text: "富士山の標高は **3,776m** です。 \n"
  }
}

 

また、今回はマルチターンを使用しているため、続けて「エベレストとの差は何mですか?」という質問を行います。

import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession

PROJECT_ID = "プロジェクトIDを入力"
LOCATION = "asia-northeast1"
Model_NAME = "gemini-1.5-pro-001"

vertexai.init(project=PROJECT_ID, location=LOCATION)
model = GenerativeModel(model_name=Model_NAME)
chat = model.start_chat()

def multiturn_generate_content(chat: ChatSession, text: str) -> str:
  response = chat.send_message([text]) 
  return response

text = "富士山の標高は何mですか?"
print(multiturn_generate_content(chat, text))

# 追記
text = "エベレストとの差は何mですか?"
print(multiturn_generate_content(chat, text ))

 

2回目の質問では「富士山」というワードを含めていないにもかかわらず、前段の質問から富士山とエベレストの標高の差についての質問だと解釈して回答を返されたので、正しくマルチターンによる推論ができていることが確認できます。

content {
  role: "model"
  parts {
    text: "エベレストの標高は8,848mなので、富士山との差は:\n\n8,848m - 3,776m = **5,072m** \n\nとなります。エベレストは富士山より5,072m高いことになります。"
  }
}

画像推論

今回は、画像推論について紹介します。

テキスト推論と同様に send_message() を使用することでリクエストを行うことができます。

 

サンプルとして「画像の内容について教えてください」というテキストと以下の画像で質問してみます。

 

今回は Cloud Storage にアップロードしている画像を URL ベースで取得しています。

import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession, Part

PROJECT_ID = "プロジェクトIDを入力"
LOCATION = "asia-northeast1"
Model_NAME = "gemini-1.5-pro-001"

vertexai.init(project=PROJECT_ID, location=LOCATION)
model = GenerativeModel(model_name=Model_NAME)
chat = model.start_chat()

def multiturn_generate_content(chat: ChatSession, text: str, image: Part) -> str:
  response = chat.send_message([text, image])# テキストと画像でのリクエスト
  return response

text = "画像の内容について教えてください"
# 画像は Cloud Storage から取得
image = Part.from_uri("gs://your-storage/test_img1.jpeg", "image/jpeg")
print(multiturn_generate_content(chat, text, image))

 

レスポンスは以下の通り、画像の内容に関する詳細の内容が返され、正しく推論できていることが分かります。

content {
  role: "model"
  parts {
    text: "この画像は、忙しいスタートアップ企業のオフィスでソフトウェア開発者チームが仕事をしている様子を捉えています。焦点は、コードが書かれた画面をじっと見つめ、キーボードで入力をしている男性プログラマーに当てられています。彼の周りの他の開発者も仕事に没頭しており、これは協調的かつ集中的な作業環境であることを示唆しています。オフィス自体には、スタートアップ企業の文化でよく見られる、モダンで開放的な計画が施されています。"
  }
}

 

また、音声推論や動画推論などもデータタイプを指定することで、画像推論と同様にリクエストすることが可能です。

音声推論のサンプルコード
def multiturn_generate_content(chat: ChatSession, text: str, audio: Part) -> str:
  response = chat.send_message([audio, text])
  return response

text = "音声の内容について教えてください"
audio = Part.from_uri("gs://your-storage/test_audio.m4a", "audio/x-m4a")
print(multiturn_generate_content(chat, text, audio))
 
動画推論のサンプルコード
def multiturn_generate_content(chat: ChatSession, text: str, video: Part) -> str:
  response = chat.send_message([video, text])
  return response

text = "動画の内容について教えてください"
video = Part.from_uri("gs://your-storage/test_video.mp4", "video/mp4")
print(multiturn_generate_content(chat, text, video))

システム指示

次にシステム指示について紹介いたします。

システム指示はモデルを作成する時に、 system_instruction を設定することで指定可能になります。

今回は「単位記号を使用せずに回答してください」という指示を設定して、テキスト推論の項目と同様に「富士山の標高は何mですか?」と質問してみます。

import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession

PROJECT_ID = "プロジェクトIDを入力"
LOCATION = "asia-northeast1"
Model_NAME = "gemini-1.5-pro-001"

vertexai.init(project=PROJECT_ID, location=LOCATION)
model = GenerativeModel(
  model_name=Model_NAME,
  system_instruction=["単位記号を使用せずに回答してください"] # モデル宣言時にシステム指示を設定
  )
chat = model.start_chat()

def multiturn_generate_content(chat: ChatSession, prompt: str) -> str:
  response = chat.send_message([prompt])
  return response

prompt = "富士山の標高は何mですか?"
print(multiturn_generate_content(chat, prompt))

 

レスポンスは以下のように単位記号「m」を使用せず「メートル」で回答が返ってきたのが確認できます。

content {
  role: "model"
  parts {
    text: "富士山の標高は3776メートルです。 \n"
  }
}

チャット履歴

今度は、チャットの履歴について紹介します。

Vertex AI のマルチターンチャットではセッションが継続している間は過去の履歴を保持しており、参照することが可能です。

サンプルとして2回テキスト推論を行い、その履歴を確認します。

import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession

PROJECT_ID = "プロジェクトIDを入力"
LOCATION = "asia-northeast1"
Model_NAME = "gemini-1.5-pro-001"

vertexai.init(project=PROJECT_ID, location=LOCATION)
model = GenerativeModel(model_name=Model_NAME)
chat = model.start_chat()

def multiturn_generate_content(chat: ChatSession, prompt: str) -> str:
  response = chat.send_message([prompt])
  return response

prompt = "富士山の標高は何mですか?"
print(multiturn_generate_content(chat, prompt))

prompt = "エベレストとの差は何mですか?"
print(multiturn_generate_content(chat, prompt))

# chat.history を使用することで履歴を参照
for m in chat.history:
  print(m)

 

まず、以下は2回テキスト推論した際のレスポンスになります。

こちらはテキスト推論の項目で質問した時と同様の内容になります。

content {
  role: "model"
  parts {
    text: "富士山の標高は **3,776m** です。 \n"
  }
}

content {
  role: "model"
  parts {
    text: "エベレストの標高は8,848mなので、富士山との差は:\n\n8,848m - 3,776m = **5,072m** \n\nとなります。エベレストは富士山より5,072m高いことになります。"
  }
}

 

以下が chat.history の内容を出力した内容になります。

role が “user” と “model” で分かれており、推論のリクエストとレスポンスが確認できます。

role: "user"
parts {
  text: "富士山の標高は何mですか?"
}
role: "model"
parts {
  text: "富士山の標高は **3,776m** です。 \n"
}
role: "user"
parts {
  text: "エベレストとの差は何mですか?"
}
role: "model"
parts {
  text: "エベレストの標高は8,848mなので、富士山との差は:\n\n8,848m - 3,776m = **5,072m** \n\nとなります。エベレストは富士山より5,072m高いことになります。"
}

 

また、手動で履歴を設定することもできます。

以下のように role と parts の要素を持たせた Content を作成し、チャットセッションを開始時に history に渡すことで設定することができます。

import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession, Part, Content

PROJECT_ID = "プロジェクトIDを入力y"
LOCATION = "asia-northeast1"
Model_NAME = "gemini-1.5-pro-001"

vertexai.init(project=PROJECT_ID, location=LOCATION)
model = GenerativeModel(model_name=Model_NAME)

chatHistory = []

# role user の履歴作成し配列に格納
chatHistory.append(Content(role = "user", parts = [Part.from_text("富士山の標高は何mですか?")]))
# role model の履歴作成し配列に格納
chatHistory.append(Content(role = "model", parts = [Part.from_text("富士山の標高は 3,776m です。")]))

# 作成した履歴を設定
chat = model.start_chat(history=chatHistory)

for m in chat.history:
  print(m)

 

以下が履歴設定後に chat.history の内容を出力した内容になります。

設定通り、履歴が参照できていることが確認できます。

role: "user"
parts {
  text: "富士山の標高は何mですか?"
}
role: "model"
parts {
  text: "富士山の標高は 3,776m です。"
}

まとめ

今回は、第 1 弾の記事「Vertex AI を利用して Google サイトにマルチターンプロンプトを構築してみた」にてアプリを作成した際に使用した Vertex AI SDK  のサンプルコードを用いた簡単なコードを紹介しました。

他にもトークン数やストリーム処理、エンベディングなど今回は使用していない機能もたくさんあります。
Vertex AI SDK を利用し、Google 生成 AI を体験してみてはいかがでしょうか。

Vertex AI DIYプランについて

Vertex AI Search を使って社内文書を検索する生成 AI を構築してみませんか?
ソフトバンクのエンジニアが構築をサポートします。

Vertex AI DIY プランでは、以下の3つのことをご体験いただけます。
詳細は、関連サービスにある「Vertex AI DIYプラン」をご確認ください。

関連サービス

Vertex AI Search を使って社内文書を検索する生成AIを構築してみませんか?
ソフトバンクのエンジニアが構築をサポートします。
Google の生成AIの導入を考えている方はもちろん、どのようなものか確認したいという方でもご活用いただけます。

Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません