Google Gen AI SDK（Python版）を試す： Gemini 2.0 Flash ＋ JSON出力（structured outputs）

## はじめに
先月、以下の記事を書く際などに試した「Gemini 2.0 Flash」の話です。

- [Gemini の API を OpenAI のパッケージ ＋ Node.js で試す（テキスト・複数の画像の入力）【生成AI−2】 - Qiita](https://qiita.com/youtoy/items/0a4539ce6b9160d55e60)
- [第3弾（Gemini 2.0 Flash編）：AIは「からあげ」と「とり天」を見分けられるのか【からあげ帝国-2】 - Qiita](https://qiita.com/youtoy/items/389c6ef7f284017ce35a)
- [Microsoft製の「Vision for Copilot Preview」と Gemini 2.0 Flash の組み合わせ：GitHub Copilot での画像入力【GitHub dockyard-2】 - Qiita](https://qiita.com/youtoy/items/f5fb3e7e937edf94f180)

### 概要
以下にあるような新機能ではなく、旧来の API でも使えていた「JSON出力（structured output）」を試しました。

●The next chapter of the Gemini era for developers - Google Developers Blog
　https://developers.googleblog.com/en/the-next-chapter-of-the-gemini-era-for-developers/

#### 実装に用いたもの
実装には、[Python版の Google Gen AI SDK](https://github.com/googleapis/python-genai) を使ってみることにします。

### 今回の記事を書いたきっかけ
今回の記事を書いたきっかけは、はてブ経由で見かけた以下の記事で「Google Gen AI SDK」の話題を見かけたことです。

●Gemini2.0とStreamlitでお手軽なグラウンディング搭載の生成アプリ作成｜masa_kazama
　https://note.com/masa_kazama/n/n8eff1a4be1da

![2025-01-06_00-26-04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e19ee547-1014-13d2-6ad3-1a68510e5724.jpeg)

上記の内容を見かけ、記事で書かれた内容も試してみたいと思ったところですが、それ以外にも今回の「Google Gen AI SDK」のお試しもシンプルにやってみたくなりました。

●Google Gen AI SDKs  |  Generative AI on Vertex AI  |  Google Cloud
　https://cloud.google.com/vertex-ai/generative-ai/docs/sdks/overview

## 実際に試していく
ここから実際に試していきます。

### 元にする情報
その際に元にする情報は、主に以下の公式ドキュメントです。

●Google Gen AI SDK documentation
　https://googleapis.github.io/python-genai/

![2025-01-06_00-29-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3d966e56-f429-30a0-eec2-60c5e8819dbd.jpeg)

### 仮想環境を用意して準備
今回、venv を使った仮想環境の中でやっていきます。

まずは、仮想環境の作成です（※ アクティベートの部分に関わるところで、今回の環境は Mac を使っています）。

```zsh
python -m venv myenv
source myenv/bin/activate
```

さらに以下のコマンドで、Python版 の Google Gen AI SDK を使えるようにします。

```zsh
pip install google-genai
```

#### 環境変数を使う
今回、APIキーは環境変数として設定します。
以下、公式の参考情報です。

●Get a Gemini API key  |  Google AI for Developers
　https://ai.google.dev/gemini-api/docs/api-key#macos---zsh

とりあえず今回は一時的に使えれば良いので、永続化する形にはせず以下のコマンドで利用時のみ使えるようにしました。

```zsh
export GEMINI_API_KEY=【自分の Gemini のAPIキー】
```

### 実装： 簡単なお試し
次は実装関連の話で、まずは簡単なお試しを行います。

#### Google AI API 
今回、Vertex AI API ではなく Google AI API のほうを使っています。

ちなみに上で掲載した記事でも書かれていたように、「Google Gen AI SDK」を使う場合は「Vertex AI API」「Google AI API」のどちらを使う場合でも、以下の部分以外は共通化できるようです。

```python
# Only run this block for Google AI API
client = genai.Client(api_key='YOUR_API_KEY')
```

```python
# Only run this block for Vertex AI API
client = genai.Client(
    vertexai=True, project='your-project-id', location='us-central1'
)
```

#### 簡単なお試しのためのコード
公式ドキュメントを見つつ、お試し用のコードは以下としました。

```python
from google import genai
import os

client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))

response = client.models.generate_content(
    model='gemini-2.0-flash-exp', contents='あなたは誰？'
)
print(response.text)
```

それを試した結果は下記で、レスポンスを得られたことが確認できました。

![2025-01-06_02-40-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/569cdb85-e52b-1d20-0ed9-3dcf7e81c666.jpeg)

ここから、JSON での出力を試していきます。

### 実装： JSON出力（structured output）
JSON での出力を行うコードは、以下の公式情報を参考に作っていきます。

- 参考情報
   - [Google Gen AI SDK documentation](https://googleapis.github.io/python-genai/#json-response-schema)
   - [Gemini API の MIME レスポンス タイプを指定する  |  Generative AI on Vertex AI  |  Google Cloud](https://cloud.google.com/vertex-ai/generative-ai/docs/samples/generativeaionvertexai-gemini-controlled-generation-response-schema?hl=ja#generativeaionvertexai_gemini_controlled_generation_response_schema-python)

具体的には、以下の内容としました。
出力してもらう内容は、適当に決めたものですが「四国4県の県名と県庁所在地のセット」を返してもらうようにしてみました。

```python
from google import genai
import os

client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))

response = client.models.generate_content(
    model='gemini-2.0-flash-exp',
    contents='日本の都道府県の情報をください。四国4県分を対象に。',
    config={
        'response_mime_type': 'application/json',
        'response_schema': {
            'type': 'ARRAY',
            "items": {
                'required': [
                    '名前',
                    '県庁所在地',
                ],
                'properties': {
                    '名前': {'type': 'STRING'},
                    '県庁所在地': {'type': 'STRING'},
                },
                'type': 'OBJECT',
            }
        },
    },
)

print(response.text)
```

上記を実行した結果は以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/125ca4dd-d3e4-604e-51e5-3c52e3d48d8f.png)

無事、想定通りの結果を得ることができました。

## 余談
以下は、Gemini関連で自分が気になったものの雑多なメモです。

「2D spatial understanding」「Pointing and 3D Spatial Understanding」は、Web の GUI では試したのですが、API経由で使うパターンも試せればと思っています。

https://x.com/googleaidevs/status/1872688896804348232

- [cookbook/gemini-2/spatial_understanding.ipynb at ace3178ac0e3afe5cafc9be9f9ea7fff747d846d · google-gemini/cookbook](https://github.com/google-gemini/cookbook/blob/ace3178ac0e3afe5cafc9be9f9ea7fff747d846d/gemini-2/spatial_understanding.ipynb)
- [cookbook/gemini-2/spatial_understanding_3d.ipynb at main · google-gemini/cookbook](https://github.com/google-gemini/cookbook/blob/main/gemini-2/spatial_understanding_3d.ipynb)