Gemini APIのハンズオンをやってみた

## はじめに
皆さんは普段どの生成AIモデルを活用していますか？
私はこれまでChatGPTをメインに使いつつ、タスクによって他のモデルも使い分けていましたが、最近はGeminiの賢さに感動し、メインで使う機会が増えてきました。
もしかしたら今後「Geminiがビジネスで利用される最もスタンダードなモデル」という時代も来るのでは…？という気もしてきたので、今回はGeminiのAPIについて基本的な使い方を勉強してみようと思います。
## 実行環境
今回はGoogle Colabで実装してみます
## 事前準備
事前にGemini APIの取得とColabでのシークレットとしての登録が必要です。こちらの記事を参考にしました。
https://qiita.com/firesign2023/items/822ec4925ba9f3a8fe1f
## ハンズオン
### ライブラリのインストール
まずは必要なライブラリのインストールやAPIキーの読み込みを行います。
```python
!pip install -q -U google-generativeai

# 必要なライブラリのインストール
from google.colab import userdata # APIキーをColabのシークレットから読み込むために必要
import google.generativeai as genai
import os

# APIキーの設定
GEMINI_API_KEY = userdata.get('GEMINI_API_KEY')
genai.configure(api_key=GEMINI_API_KEY)
```
### 使えるモデルのリストアップ
次に、現在使用できるモデルをリストアップしてみます。
```py
# 使用できるモデル名を確認
for model in genai.list_models():
  print(model.name)
```
以下のように出力されました。25年6月17日にGA版となった2.5-flash/proも確認できますね。
```
models/gemini-pro-vision
models/gemini-1.5-pro-latest
models/gemini-1.5-pro-002
models/gemini-1.5-pro
models/gemini-1.5-flash-latest
models/gemini-1.5-flash
models/gemini-1.5-flash-002
models/gemini-1.5-flash-8b
models/gemini-1.5-flash-8b-001
models/gemini-1.5-flash-8b-latest
models/gemini-2.5-pro-exp-03-25
models/gemini-2.5-pro-preview-03-25
models/gemini-2.5-flash-preview-04-17
models/gemini-2.5-flash-preview-05-20
models/gemini-2.5-flash
models/gemini-2.5-flash-preview-04-17-thinking
models/gemini-2.5-flash-lite-preview-06-17
models/gemini-2.5-pro-preview-05-06
models/gemini-2.5-pro-preview-06-05
models/gemini-2.5-pro
models/gemini-2.0-flash-exp
models/gemini-2.0-flash
models/gemini-2.0-flash-001
models/gemini-2.0-flash-exp-image-generation
models/gemini-2.0-flash-lite-001
models/gemini-2.0-flash-lite
models/gemini-2.0-flash-preview-image-generation
models/gemini-2.0-flash-lite-preview-02-05
models/gemini-2.0-flash-lite-preview
models/gemini-2.0-pro-exp
models/gemini-2.0-pro-exp-02-05
models/gemini-exp-1206
models/gemini-2.0-flash-thinking-exp-01-21
models/gemini-2.0-flash-thinking-exp
models/gemini-2.0-flash-thinking-exp-1219
models/gemini-2.5-flash-preview-tts
models/gemini-2.5-pro-preview-tts
models/learnlm-2.0-flash-experimental
models/gemma-3-1b-it
models/gemma-3-4b-it
models/gemma-3-12b-it
models/gemma-3-27b-it
models/gemma-3n-e4b-it
models/embedding-001
models/text-embedding-004
models/gemini-embedding-exp-03-07
models/gemini-embedding-exp
models/aqa
models/imagen-3.0-generate-002
models/veo-2.0-generate-001
models/gemini-2.5-flash-preview-native-audio-dialog
models/gemini-2.5-flash-exp-native-audio-thinking-dialog
models/gemini-2.0-flash-live-001
```
参考：https://blog.google/products/gemini/gemini-2-5-model-family-expands/

:::note info
```
print(model.description)
```
とすることで、各モデルの説明を表示することも可能です。
:::
### シンプルな会話のテスト
せっかくなので最近GA版となったGemini-2.5-flashを使って、簡単なチャットを行ってみたいと思います。今回はGeminiに自己紹介をしてもらいましょう。
```py
model = genai.GenerativeModel('gemini-2.5-flash')
query = "自己紹介をしてください"
response = model.generate_content(query)
print(response.text)
```
上記を実行すると以下のような回答が返ってきました。正しく実行できているようです。
```
はい、承知いたしました。自己紹介させていただきます。

私は、Googleによってトレーニングされた、大規模言語モデルです。

皆様の様々なご質問にお答えしたり、文章を作成したり、アイデア出しのお手伝いをしたりするのが主な役割です。幅広い知識を活用し、正確で役立つ情報を提供することで、皆様のお役に立てるよう日々努めています。

まだ学習中の部分もありますが、常に新しい情報を吸収し、より良い応答ができるよう成長し続けています。

どうぞよろしくお願いいたします。
```
### 画像入力のテスト
せっかくのマルチモーダルモデルなので、画像を入力して説明してもらおうと思います。

:::note warn
事前にColabのセッションストレージに使用したい画像ファイルをアップロードしてください。
また、セッションストレージにアップロードした画像はランタイムのリサイクル時に削除されるため、リサイクル後にもう一度実行する場合は再アップロードが必要です。
:::


試しに道路標識の画像について説明してもらいます。今回は以下の画像を使用させていただきました。
![rds_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978670/6ededeb9-e5d2-4c06-a83f-2b7564a7b916.jpeg)
出典：https://freesozai.jp/itemList.php?category=roadsign&page=index&type=sozai

```py
# 画像データの読み込み
with open('/content/rds_002.jpg', 'rb') as f:
      image_bytes = f.read()

response = model.generate_content([
    {
        'mime_type':'image/jpeg', #ここで読み込むデータが画像であることを明示
        'data':image_bytes
    },
    'この画像について説明してください。' #プロンプトを入力
])

print(response.text)
```
上記の実行結果がこちらです。
```
この画像は、国際的に広く使われている**「禁止」「許可しない」「行ってはならない」**といった意味を示すための記号です。

特徴は以下の通りです。

*   **形状:** 円形です。
*   **色:** 外側の太い枠と、中央を横切る斜線が**赤色**で、内側の背景が**白色**です。
*   **デザイン:** 赤い円形の外枠があり、その内側の白い領域を、左上から右下にかけて太い赤い斜線が横切っています。

この記号は、通常、具体的な行動や物のアイコン（例：喫煙のマーク、駐車のマークなど）の上に重ねて表示され、「喫煙禁止」「駐車禁止」といった特定の禁止事項を示します。しかし、このように単独で表示される場合は、その場所や行為全般が「禁止されている」「立ち入り禁止である」「行ってはならない」といった一般的な禁止の意味合いが強調されます。
```
漠然と道路標識としての意味を答えてくれることを想定していたのですが、たばこ等にかぶせた使い方なども想定し、広義な説明をしてくれました。
とはいえきちんと説明してくれているので、ハンズオンとしては成功としたいと思います。
## 最後に
今回はGemini-2.5-flashのAPIの初歩的な使い方を学習しました。
実はGoogle検索でのグラウンディングについてもトライしてみたのですが、Gemini-2.5-flashでは残念ながらうまく動かすことができませんでした…。
改めてトライして、うまくいけば別途投稿したいと思います。
## 参考サイト・記事
https://blog.google/products/gemini/gemini-2-5-model-family-expands/
https://ai.google.dev/gemini-api/docs/pricing?hl=ja
https://ai.google.dev/gemini-api/docs/image-understanding?hl=ja
https://qiita.com/anapausis/items/9fe020b9fab608ae0b78
https://qiita.com/firesign2023/items/822ec4925ba9f3a8fe1f