ブログ | XIMIX

Gemini apiをColab Enterpriseで活用してみた。

作成者: XIMIX 上野|2024.12.23

はじめに

今回はGeminiのテキスト生成・理解能力を、APIを通じて独自のシステムやアプリケーションに組み込む方法をご紹介します。今回はGoogle Cloud PlatformのColab Enterprise上にGemini apiを呼び出し、プロンプトや画像、ファイルを読み込んでみました。

Geminiとは

Geminiは、Googleが開発したマルチモーダル生成AIモデルです。テキスト、画像、音声、動画を入力として受け取り、テキストや画像を生成できます。今回Gemini apiにテキストや画像、CSVファイルをを渡してGeminiからの回答を得ることを目指します。

Geminiはいくつかのプラットフォームで利用することが可能となりますが、今回はGoogle CloudのVertex AI上で提供されているGeminiを利用して検証を行います。従って、本ブログにて実施している内容を再現する場合はGoogle Cloudのプロジェクトが必要になることをご認識いただければと思います。

Gemini api

ここでは、Colab Enterprise上でGemini apiを実行する具体的な手順をご紹介します。

実行手順

ステップ1: Colab Enterpriseにアクセス

Google Cloud Platform上のColab Enterpriseにアクセスします。リージョンは東京に設定し、「ノートブックを作成」で新しいノートブックを作成します。

ステップ2: Gemini apiのコードの取得

Gemini apiのpythonのコードはGoogle Cloud Platformの「Vertex AI」の「自由形式」から「<>コードを取得」で確認することができます。

実際にメッセージ部分にGeminiに送りたいテキストを入力して、右側にある設定からモデルなどを設定して「<>コードを取得」を押してみます。

すると下記のような結果が出力されます。

types.Part.from_textにメッセージに入力したテキストが入っています。

ステップ3:テキストの入力フォームを追加する

ノートブック上にテキストフォームを追加してGemini apiに自由にテキストを入力できるようにコードを修正してみます。

1.apiのインストール

!pip install --upgrade google-genai
import vertexai
from vertexai.generative_models import GenerativeModel, Part, FinishReason
import vertexai.preview.generative_models as generative_model

2.入力フォームの作成

テキストの入力欄の他にGeminiのモデルの種類とTemperatureを調整できるようにしました。

3.gemini apiの実行部分の作成

#@title VertexAI

def generate(model_name, temperature, input_text):
  vertexai.init(project="your-project-id", location="asia-northeast1")
    model = GenerativeModel(model_name)

    generation_config = {
        "max_output_tokens": 8192,
        "temperature": temperature,
        "top_p": 0.95,
    }

    responses = model.generate_content(
        [input_text],
        generation_config=generation_config,
        safety_settings=safety_settings,
        stream=True,
    )

    # 画面に出力し、結果をリストに格納
    results = []
    for response in responses:
        print(response.text, end="")
        results.append(response.text)

    return results

safety_settings = {
    generative_models.HarmCategory.HARM_CATEGORY_HATE_SPEECH: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
    generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
    generative_models.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
    generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
}

generated_results = []
result = []
prompt_text = ""

generated_results = generate(model_name, temperature, input_text)

実行してみた結果がこちらです。

ステップ4:CSVファイルを取り込んでみる

1.ファイルアップロード部分を作成

#@title CSVのアップロード
import pandas as pd
from google.colab import files 
def upload_csv():
    # CSVファイルをアップロード
    uploaded = files.upload()
    for fn in uploaded.keys():
        csv_path = fn
    return csv_path

def read_csv(file_path):
    df = pd.read_csv(file_path)
    return df
# Colab上でCSVをアップロード
csv_path = upload_csv()

# CSVを読み込み
df = read_csv(csv_path)

コードを実行するとファイルアップロードのボタンが出力されます。

2.CSVファイルをプロンプトのテキストに結合して実行

prompt_text = input_text + "\n" + df.to_string(index=False, header=True)
generated_results = generate_no_image(model_name, temperature, prompt_text)

CSVファイルでデータをアップロードして、プロンプトに「下記のデータを分かりやすくまとめて」と入力して実行するとデータをまとめた結果が出力されるようになりました。

ステップ5:画像ファイルを取り込んでみる

1.画像ファイルアップロード部分を作成する

ファイルアップロード部分はCSVファイルと同様ですが、gemini apiに渡せるように画像をbase64エンコード処理しています。

import base64
import mimetypes
from google.colab import files 

#@title 画像のアップロード
def upload_image():
    # 画像をアップロード
    uploaded = files.upload()
    for fn in uploaded.keys():
        image_path = fn
    return image_path

def encode_image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        encoded_string = base64.b64encode(image_file.read()).decode()
    return encoded_string

def detect_mime_type(image_path):
    mime_type, _ = mimetypes.guess_type(image_path)
    return mime_type
# Colab上で画像をアップロード
image_path = upload_image()

# 画像をbase64エンコード
image_base64 = encode_image_to_base64(image_path)

# MIMEタイプを自動検出
mime_type = detect_mime_type(image_path)

2.引数に画像ファイルを指定して実行

generate関数部分も画像を受け取るように修正しました。

def generate(model_name, temperature, input_text, image_base64, mime_type):
  vertexai.init(project="your-project-id", location="asia-northeast1")
    model = GenerativeModel(model_name)

    generation_config = {
        "max_output_tokens": 8192,
        "temperature": temperature,
        "top_p": 0.95,
    }

    image_part = Part.from_data(
        mime_type=mime_type,
        data=base64.b64decode(image_base64))

    responses = model.generate_content(
        [input_text, image_part],
        generation_config=generation_config,
        safety_settings=safety_settings,
        stream=True,
    )

    # 画面に出力し、結果をリストに格納
    results = []
    for response in responses:
        print(response.text, end="")
        results.append(response.text)

    return results

generate関数の引数も増えていますので、関数実行部分も修正してください。

generated_results = generate(model_name, temperature, input_text, image_base64, mime_type)実際に犬の画像をアップロードして、テキスト部分に「添付した画像について教えて」と入力すると「画像には、笑顔の柴犬が写っています。」といった回答が返ってきました。

最後に

今回は、生成AI「Gemini」をapiから呼び出してテキストやCSVファイル、画像ファイルを渡してみました。独自のシステムやアプリケーションでテキストやCSVファイル、画像ファイルに対して生成AIを使用したい場合は参考にしていただければと思います。

また、今回のブログで紹介した機能に加えて、Geminiは音声データや動画ファイルなども取り込むことができますので、公式ドキュメントなどを確認して実装してみてください。

お忙しい中、お読みいただきありがとうございました。今後Geminiなどの生成AIを活用した便利なシステムやサービスがますます普及していくことを期待しております。