【Python】Gemini APIを使ってみる

# はじめに
ある日、なんとなく生成AI関連のAPIを使ってみたくなったので、とりあえず無料で使えそうな`Gemini API`を利用してみることにしました。（`ChatGPT API`も初回は数ドル分無料で使えるらしいですが、はじめに5ドル以上支払わなければいけないらしくやめました。）
今回は`Python`を使ってそのAPIを簡単に動かしてみることにしました。
また、今回はGeminiのモデルとして`Gemini-1.5-flash`を使用しました。
# 始め方
### 1,APIキーの取得

https://aistudio.google.com/prompts/new_chat?hl=ja

上記のサイトに移動したら`Get API key`→`APIキーを作成`と進んでください。これでキーの取得は完了です。キーは何度でも確認することはできますが、いちいちサイトを訪れるのも面倒なのでどこかにメモしておきましょう。
カード情報などを入力していない限り、使いすぎで請求がくるなんてことはないです。（多分）

### 2,PythonにGemini API用の`Python SDK`をダウンロードする
Gemini API用のPython SDKは、`google-generativeai`パッケージに含まれています。ターミナルで以下のコードを入力してください。

:::note warn
開発環境にPython 3.9以降がインストールされている必要があります。
:::


```
pip install -q -U google-generativeai
```

# リクエストを送信する
まずはじめに`google.generativeai`モジュールをimportします。ただ、モジュール名が長いので、公式でも`genai`と縮めて用いることが推奨されているようです。
次に、先ほど取得したAPIキーを下のコードの「"YOUR_API_KEY"」の部分に入力してください。
`model`の部分については、前述したように今回は`gemini-1.5-flash`にしたのでそれを記述します。

下のコードは`Gemini API`を利用するにあたって最低限必要なコードです。

```python
import google.generativeai as genai

genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-1.5-flash")
```

では、`generateContext`メソッドを使用して簡単なリクエストを送信してみます。以下のコードを実行してみましょう。リクエストの本文は英語でも日本語でも可です。

```python
import google.generativeai as genai

genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-1.5-flash")
response = model.generate_content("簡単に自己紹介をして。")
print(response.text)
```
実行すると、多少の差異はあるものの、大抵は「私はGoogleによって訓練された、大規模言語モデルです。」のような返答が来ると思います。

### 返答のスタイルを指定する
モデルに送信するプロンプトは、モデルがレスポンスを生成する方法を制御するパラメータが含まれており、それらは`GenerationConfig`を使用して構成することができます。
ただ、このオプションはモデルによって異なる場合があるそうです。
公式では以下のコードを用いて紹介しています。
```python
import google.generativeai as genai

genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-1.5-flash")
response = model.generate_content(
    "Tell me a story about a magic backpack.",
    generation_config=genai.types.GenerationConfig(
        # Only one candidate for now.
        candidate_count=1,
        stop_sequences=["x"],
        max_output_tokens=20,
        temperature=1.0,
    ),
)

print(response.text)
```
コードを見ていただけると分かりますが、`GenerationConfig`は`model.generate_content()`内に記述します。では、中身についてそれぞれ解説していきます。

`candidateCount`には、返される生成された回答の数を指定します。現在、この値は 1 にのみ設定でき、指定しない場合はデフォルトで1になるので意識しなくても大丈夫だと思います。

`maxOutputTokens`は、候補に含めるトークンの最大数を設定します。簡単にいえば「返答の長さ」です。

`stopSequences`には、出力生成を停止する一連の文字列（最大 5 つ）を指定します。指定すると、stop_sequence が最初に出現した時点で API が停止します。
`maxOutputTokens`で長さを指定すると文章が中途半端なところで終わりがちなので例えば「"."」や「"。"」とすることで出力中途半端にならないようにできます。

`temperature`は出力のランダム性を制御します。より創造的な返答を生成する場合は大きい値を、より確定的なレスポンスを生成する場合は小さい値を使用します。値の範囲は0.0から2.0です。

`generateContent`への個々の呼び出しを構成することもできます。

:::note info
今紹介した`max_output_tokens`や`temperature`などの設定はモデルを初期化するときに指定し、プログラム内でその設定値がデフォルトの値となります。
しかし、`generateContent`によってそれぞれの返答に対してその設定をすることが可能になるということです。
:::

### インタラクティブなチャットを構築する
複数回にわたる質問と回答を収集することもできます。これにより、回答に向けて段階的に進んだり、複数の部分からなる問題についてサポートを受けることができます。
公式では以下のコードを用いて紹介しています。
```python
import google.generativeai as genai

genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-1.5-flash")
chat = model.start_chat(
    history=[
        {"role": "user", "parts": "Hello"},
        {"role": "model", "parts": "Great to meet you. What would you like to know?"},
    ]
)
response = chat.send_message("I have 2 dogs in my house.")
print(response.text)
response = chat.send_message("How many paws are in my house?")
print(response.text)

```

`model.start_chat()`メソッドを使って、チャットを開始します。`history`にこれまでの会話履歴がリスト形式で渡され、この履歴はモデルに過去の会話の文脈を理解させるために使用されます。
`{"role": "user", "parts": "Hello"}`では、はじめに「私たち」がモデルに対し「Hello.」と言ったことを、
`{"role": "model", "parts": "Great to meet you. What would you like to know?"}`では、それに対し「モデル」が私たちに対し「Great to meet you. What would you like to know?」と言ったことを表します。

そして、１つ目の`response`には「I have 2 dogs in my house.」に対する返答を、２つ目には「How many paws are in my house?」に対する返答を記録し、それぞれを出力します。

# おわりに
今回の記事では`Python`を使って`Gemini API`を簡単に動かしてみました。しかし、このままでは普通にGeminiを使うのと何ら変わりはありません（むしろこちらの方がかなり面倒）。もっとスキルを高めてAPIならではのことにも挑戦していきたいと思います、
では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。

# 参考
https://ai.google.dev/gemini-api/docs/quickstart?hl=ja&lang=python

https://ai.google.dev/gemini-api/docs/text-generation?hl=ja&lang=python