Google は ChatGPT に対抗して生成AIの Gemini を公開しました。Gemini の API を使ってみます。ChatGPT の API については こちら です。
アカウント
Gemini の API を使うには Gemini Advanced に登録が必要ですが、次のページによると最初の2ヶ月は無料で使えるようです。

Gemini 使用にあたってのアカウントは必要なく、Google にログインしていれば使えます。
Gemini のキー取得
Google にログインした状態で、下記のページ Google AI Studio にアクセスすると “Get API key” という項目があります。それを選択し、”Create API key” をクリックしてください。このときプロジェクトを指定する必要があります。必要なら新しく作ってください。作ったキーはコピーして安全な場所に保存しておいてください。
Python で Gemini API を使ってみる
Python でプログラムを書いて Gemini API を使ってみます。使う環境は Windows なら WSL、Mac ならターミナルが良いと思います。あるいは、API の動作をテストするだけなら Jupyter Notebook を使うのも良い選択ですが、ここでは説明を省略します。
Python で何か新しいことを始めるときは専用の Python 環境を作ってから始めるのが定番ですのでそのようにします。
1 2 3 4 |
$ cd test ← 作業ディレクトリに移動 $ virtualenv -p python3.11 env ← "env" という名前の環境を定義 $ source env/bin/activate ← 環境に入る (env) $ |
この環境に OpenAI のライブラリをインストールします。
1 |
(env) $ pip3 install google-generativeai |
API キーはプログラムの中には書かずに、環境変数にセットしてプログラムからはそれを参照します。そうすることで、万一プログラムのソースコードが流出しても API キーを守ることができます。
1 |
(env) $ export GOOGLE_API_KEY="APIキー" ← " " で囲みます |
API キーを下のようにプログラムに直接書いても動作しますが、この方法はお勧めしません。
1 2 |
import google.generativeai as genai genai.configure(api_key="APIキー") |
hello.py
次のプログラムをサンプルとして使います。8行目で、Gemini に対して日本語で Hello と言うように投げかけています。ファイル名は hello.py としました。
1 2 3 4 5 6 7 8 9 10 |
import os import google.generativeai as genai GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) gemini = genai.GenerativeModel("gemini-pro") prompt = "Say hello in Japanese" response = gemini.generate_content(prompt) print(response.text) |
実行します。
1 2 3 |
(env) $ python3 hello.py こんにちは (Konnichiwa) (env) $ |
ちゃんと回答が返ってきました。
chat.py
ひとつだけ質問するのではなく、会話をする方法を試してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import os import google.generativeai as genai GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) gemini = genai.GenerativeModel("gemini-pro") chat = gemini.start_chat(history=[]) response = chat.send_message("鳥山明の職業は?") print("--- response(1) ---") print(response.text) response = chat.send_message("代表作のタイトルを3つ教えて。") print("--- response(2) ---") print(response.text) |
実行します。
1 2 3 4 5 6 7 8 |
(env) $ python3 chat.py --- response(1) --- 漫画家 --- response(2) --- 1. ドラゴンボール 2. Dr.スランプ 3. アラレちゃん (env) $ |
会話の履歴は history の中に記憶されています。chat.py の最後に次のコードを追加してみてください。
1 2 3 4 |
print("--- Chat history ---") for message in chat.history: print(f'- {message.role} -') print(f'{message.parts[0].text}') |
全体を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
(env) $ python3 chat.py --- response(1) --- 漫画家 --- response(2) --- 1. ドラゴンボール 2. Dr.スランプ 3. アラレちゃん --- Chat history --- ←ここから下が追加した部分 - user - 鳥山明の職業は? - model - 漫画家 - user - 代表作のタイトルを3つ教えて。 - model - 1. ドラゴンボール 2. Dr.スランプ 3. アラレちゃん (env) $ |
画像を扱う
lunch.py
次は画像を扱ってみます。画像用の Python ライブラリ Pillow をインストールしておきます。
1 |
(env) $ pip3 install pillow |
解析させる画像はこのようなものです。ファイル名は shirasudon.jpg です。
プログラムは次の通りです。hello.py では Gemini のモデルとして “gemini-pro” を使いましたが、画像を扱うには “gemini-pro-vision” が必要です。
1 2 3 4 5 6 7 8 9 10 11 |
import os import google.generativeai as genai from PIL import Image GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) gemini = genai.GenerativeModel("gemini-pro-vision") image = Image.open("shirasudon.jpg") response = gemini.generate_content([image]) print(response.text) |
実行します。
1 2 3 |
(env) $ python3 lunch.py This is a Japanese breakfast set. It includes a bowl of rice topped with whitebait, a bowl of miso soup, a small plate of fried fish, a small plate of pickled vegetables, and a small plate of egg custard. (env) $ |
しらす(whitebait)を認識できることもできないこともありますが、小魚をトッピングした丼だと正しく認識しています。
画像だけでなく、質問も加えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
import os import google.generativeai as genai from PIL import Image GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) gemini = genai.GenerativeModel("gemini-pro-vision") image = Image.open("shirasudon.jpg") prompt = "Analyze the nutrition in each plate, and show in tabular format." response = gemini.generate_content([prompt, image]) print(response.text) |
実行します。
1 2 3 4 5 6 7 8 9 10 |
(env) $ python3 lunch2.py | Dish | Calories | Protein (g) | Fat (g) | Carbohydrates (g) | |---|---|---|---|---| | Rice with whitebait | 400 | 20 | 10 | 60 | | Miso soup | 100 | 5 | 5 | 10 | | Side dish 1 | 50 | 5 | 5 | 5 | | Side dish 2 | 50 | 5 | 5 | 5 | | Side dish 3 | 50 | 5 | 5 | 5 | | Total | 750 | 40 | 30 | 95 | (env) $ |
丼とその他の小皿の栄養素が表形式で出力されました。
sarin.py
次は古いニュース映像を入力してみます。ファイル名は sarin.jpg です。
プログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 |
import os import google.generativeai as genai from PIL import Image GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) gemini = genai.GenerativeModel("gemini-pro-vision") image = Image.open("sarin.jpg") prompt = "Explain about the photo." response = gemini.generate_content([prompt, image]) print(response.text) |
実行します。
1 2 3 |
(env) $ python3 sarin.py The photo shows the aftermath of the sarin gas attack on the Tokyo subway system on March 20, 1995. The attack was carried out by members of the Aum Shinrikyo cult, and resulted in the deaths of 13 people and the injury of thousands more. The attack was the deadliest terrorist attack in Japan's history. (env) $ |
1995年のサリン事件と正しく認識してくれました。
cats.py
複数の画像を渡すこともできます。日本語の質問も試してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import os import google.generativeai as genai from PIL import Image GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) gemini = genai.GenerativeModel("gemini-pro-vision") image1 = Image.open("cat1.jpg") image2 = Image.open("cat2.jpg") image3 = Image.open("cat3.jpg") prompt = "3枚の写真について何が共通で、何が違うか説明してください。" response = gemini.generate_content([prompt, image1, image2, image3]) print(response.text)で |
データは次のものです。
実行します。
1 2 3 4 5 6 7 8 9 |
(env) $ python3 cats.py 3枚の写真に共通しているのはすべて猫が写っていることです。 1枚目と2枚目の写真は実写で、3枚目の写真はイラストです。 1枚目の写真は猫がテーブルの上でリラックスしている様子を写したもので、2枚目の写真は猫の着ぐるみを着た人が立っている様子を写したものです。 3枚目の写真は、猫がビルの壁に描かれている様子を写したものです。 (env) $ |