📙

生成AI on Vertex AI: Gemini APIをPythonから呼び出す

2024/09/13に公開

この記事では Google Cloud の Vertex AI で提供される Gemini API を Python から呼び出してテキストを生成する方法を解説します。
またいくつかのプロンプトを試してみたいと思います。

Geminiモデル

Vertex AI では以下のGeminiモデルが利用可能です。2024年8月12日より Gemini 1.5 Flash のが割引になっています。料金の詳細はVertex AI の料金で確認できます。

  • Gemini 1.5 Flash
  • Gemini 1.5 Pro
  • Gemini 1.0 Pro

Vertex API SDK のインストール

前提条件として開発環境にPython 3.9以降がインストールされている必要があります。
環境が無い方はCloud Shellのほか、無料のColabや権限管理が強化されたColab Enterpriseが利用できます。

まずpipコマンドを実行して、Vertex AI SDKをインストールします。

pip install --upgrade google-cloud-aiplatform

Colabを使っている場合はKernelを再起動させるために以下のコードブロックを実行します。

import IPython

app = IPython.Application.instance()
app.kernel.do_shutdown(True)

ローカル環境やColabを使用している場合はGoogle APIの認証方法を参照して認証を行います。

APIを呼び出してテキストを生成する

必要なライブラリをインポートし、Vertex AIを初期化します。
PROJECT_IDとREGIONは利用している環境に書き換えます。

import vertexai

PROJECT_ID = "[your-project-id]"  # @param {type:"string"}
REGION = "your-region"  # @param {type:"string"}

vertexai.init(project=PROJECT_ID, location=REGION)

from vertexai.generative_models import (
    GenerationConfig,
    GenerativeModel,
)

生成AIモデルを読み込みます。
ここでは記事執筆時点でのGemni 1.5 Proの最新安定版を利用します。
その他のバージョンについてはモデルのバージョンを参照ください。

model = GenerativeModel("gemini-1.5-pro-001")

modelの generate_content メソッドを使って、質問に対するテキスト応答を生成します。

prompt = "ラーメン屋の店名を提案してください"

response = model.generate_content()
print(response.text)

モデル構成パラメータを設定して呼び出す

モデル構成パラメータを設定して呼び出すことが出来ます。
設定可能なモデル構成パラメータについてはAPIリファレンスをご覧ください。

Temperature や top_k, top_p といったパラメータを設定してコンテンツを生成することができます。Temperature は低い値にするほど決定的・再現性のある出力になり、高い値にするほど多様な出力になります。

generation_config = GenerationConfig(
    temperature=0.9,
    top_k=40,
    top_p=0.9,
    candidate_count=1,
    max_output_tokens=8192,
)

response = model.generate_content(
    "Pythonを学ぶコンテンツを検討してください",
    generation_config=generation_config,
)

print(response.text)

プロンプトを調整する

プロンプトギャラリーではプロンプト例を確認できます。ここではいくつかのプロンプトを試して出力を確認したいと思います。

出力フォーマットの指定

出力を JSON や YAML にしたい場合はプロンプトで指示します。

prompt = """カレーの作り方を示してください

JSON:
"""

response = model.generate_content(prompt)
print(response.text)

以下のようにJSONでの出力を得られます(長いので一部省略)。

{
  "name": "カレー",
  "servings": 4,
  "cooking_time": "約40分",
  "ingredients": [
    {
      "name": "鶏もも肉",
      "quantity": "300g",
      "preparation": "一口大に切る"
    },
    {
      "name": "玉ねぎ",
      "quantity": "1個",
      "preparation": "薄切りにする"
    },
    ....
  ]
  "instructions": [
    {
      "step": 1,
      "description": "鶏肉に塩コショウを振る。"
    },
    {
      "step": 2,
      "description": "鍋にサラダ油を熱し、鶏肉を炒める。色が変わったら、玉ねぎ、じゃがいも、にんじんを加えてさらに炒める。"
    },
    ...
  ]
}

分類タスクの実施

感情分析を行いその結果のみを示します。ここではFew-shot promptingの技法を用いて、いくつかのサンプルを与えた上で結果を出力させます。

generation_config = GenerationConfig(temperature=0.1, max_output_tokens=256)

def get_sentiment(message):
    prompt = f"""Please only print the category name without anything else.

I had to compare two versions of Hamlet for my Shakespeare class and unfortunately I picked this version. Everything from the acting (the actors deliver most of their lines directly to the camera) to the camera shots (all medium or close up shots...no scenery shots and very little back ground in the shots) were absolutely terrible. I watched this over my spring break and it is very safe to say that I feel that I was gypped out of 114 minutes of my vacation. Not recommended by any stretch of the imagination.
Classify the sentiment of the message: negative

This Charles outing is decent but this is a pretty low-key performance. Marlon Brando stands out. There\'s a subplot with Mira Sorvino and Donald Sutherland that forgets to develop and it hurts the film a little. I\'m still trying to figure out why Charlie want to change his name.
Classify the sentiment of the message: negative

My family has watched Arthur Bach stumble and stammer since the movie first came out. We have most lines memorized. I watched it two weeks ago and still get tickled at the simple humor and view-at-life that Dudley Moore portrays. Liza Minelli did a wonderful job as the side kick - though I\'m not her biggest fan. This movie makes me just enjoy watching movies. My favorite scene is when Arthur is visiting his fiancée\'s house. His conversation with the butler and Susan\'s father is side-spitting. The line from the butler, \"Would you care to wait in the Library\" followed by Arthur\'s reply, \"Yes I would, the bathroom is out of the question\", is my NEWMAIL notification on my computer.
Classify the sentiment of the message: positive


{message}
Classify the sentiment of the message:
"""
    response = generation_model.generate_content(
        contents=prompt, generation_config=generation_config
    ).text
    return response

response = get_sentiment('この商品は大変素晴らしい')
print(response)

response = get_sentiment('別のを買った方がいい')
print(response)

結果は以下のようになりました。

positive
negative

Vertex AI Studio でのプロンプト設計

プロンプトを調整する場合は Vertex AI Studio を用いるのが便利です。プロンプトを調整してレスポンスを確認することができます。
右上の「コードを取得」リンクからPythonコードを確認することができます。

まとめ

基礎的な内容になりますが、Google Cloud の Vertex AI で提供される Gemini API を用いたテキスト生成について流れを確認しました。

Discussion