Googleの新AI「Gemini」とPythonでChatbot を作ってみた

# はじめに

この記事は[GDSC Japan Advent Calendar 2023](https://qiita.com/advent-calendar/2023/gdsc-japan) の23日目の記事です．

Google Developer Student Clubs TUAT Founder のほきです．

2023年12月6日にGoogleが新しい生成AI「[Gemini](https://deepmind.google/technologies/gemini/#introduction)」を発表して，大きな話題となっていますね．Geminiはテキストだけでなく画像・動画が扱えるマルチモーダルな生成AIで，発表によると性能はGPT-4を超えるそうです．

そんな最強AI「Gemini Pro API」が2024年のはじめ頃までは1分間60リクエストまで無料で使えるので，PythonでChatbotを作成してみました．コードも載せておくので是非真似して遊んでみてください．

# デモ
~~最初に今回作るChatbotの全体像を示しておきます．次のリンクから動かして遊んでみてください．~~

~~https://appapppy-ezwvbs4zdgnnythwotss5o.streamlit.app/~~

:::note warn
今回は無料枠で動かしているので，最初にも書いた通り1分間60リクエストまでになっています．常識の範囲内で遊んでいただくようお願いします．
:::

# API Keyの取得
まず，次のサイトにアクセスしてください．

https://ai.google.dev/?hl=en

アクセスしたら`Get API Key in Google AI Studio`をクリックしてください．
そうするとGoogle AI Studioが立ち上がるので`Get API Key`からAPI Keyを取得してください．
このときに写真の黄色で塗りつぶされているところをメモしてください．あとで使うので忘れないようにしてくださいね．

![スクリーンショット 2023-12-24 13.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736924/3691d1f3-253d-f8c3-fe16-b9bc20e56673.png)

これでAPI Keyを取得することができました．

# コーディング
はじめにこのコードは次のGitHubリポジトリを参考に作っています．作成者の方ありがとうございます．

https://github.com/streamlit/llm-examples

今回はStreamlitを使って簡単にChatbotを作りたいと思います．

https://streamlit.io/

Streamlit は，機械学習やデータサイエンス向けのオープンソースWebフレームワークで，

- HTMLやCSS，JavaScriptといったフロントエンドの知識が不要で，Pythonで全てのコードを記述することができる
- Matplotlibなどを用いてグラフをそのまま表示することができる
- 公式でデプロイ用のクラウドサーバーが用意されているため，簡単に無料でデプロイできる

といった特徴があります．DjangoやFlaskと比べると細かいところをいじれない欠点はありますが，お手軽に作れるのは魅力的です．

ではまず必要なライブラリをインポートしましょう．

```python
import streamlit as st
import google.generativeai as genai
```

また，Streamlit Cloudを使うことを考え，`requirements.txt`に使うライブラリを書いておきましょう．

次に，モデルを定義します．

```python
# Google Generative AI（Gemini API）のAPIキー設定
genai.configure(api_key=YOUR_API_KEY)

# Geminiモデルの設定
model = genai.GenerativeModel('gemini-pro')
```

YOUR_API_KEYは先程メモしたものを書いてください．

:::note warn
今回は簡単に作るためにAPI Keyをベタ書きしていますが，あんまりよろしくないです．特にコードを公開する場合は，API Keyを自分以外の人が見れてしまうのは大変まずいのでよしなにしてください．
:::

これで準備は完了です．

それでは，ユーザーが入力→Geminiを使って応答を作成→応答を表示の部分を作っていきます．
といってもとても簡単で数行でかけます．

```python
# ユーザー入力の取得
prompt = st.text_input("Your message:")

# Gemini APIを使って応答を生成
response = model.generate_content(prompt)

# 応答をテキストとして取得
assistant_response = response.text

# 応答を表示
st.text(f"Assistant: {assistant_response}")
```
こんな感じでChatのメイン機能が出来上がりました．

他にもデザインやメッセージリストを作成して既存のメッセージを表示する機能を加えて出来上がったコードは次のとおりです．

```python
import streamlit as st
import google.generativeai as genai

# Streamlitのタイトルと説明
st.title("💬 Chatbot")
st.caption("🚀 A streamlit chatbot powered by Google AI")

# Google Generative AI（Gemini API）のAPIキー設定
genai.configure(api_key=YOUR_API_KEY)

# Geminiモデルの設定
model = genai.GenerativeModel('gemini-pro')

# セッション状態にメッセージリストがない場合は初期化
if "messages" not in st.session_state:
    st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}]

# 既存のメッセージを表示
for msg in st.session_state.messages:
    # ここではシンプルなテキスト表示を使用
    st.text(f"{msg['role']}: {msg['content']}")

# ユーザー入力の取得
prompt = st.text_input("Your message:")

if prompt:
    # ユーザー入力をセッション状態に追加
    st.session_state.messages.append({"role": "user", "content": prompt})

    # Gemini APIを使って応答を生成
    response = model.generate_content(prompt)

    # 応答をテキストとして取得（ここではresponse.textと仮定）
    assistant_response = response.text

    # 応答をセッション状態に追加し、表示
    st.session_state.messages.append({"role": "assistant", "content": assistant_response})
    st.text(f"Assistant: {assistant_response}")
```
# デプロイ＆テスト
コードが完成したらデプロイしましょう．やり方はこちらの記事が詳しく説明しているので，参考にしてください．

https://qiita.com/tamura__246/items/366b5581c03dd74f4508

実際に動かしてみると

![スクリーンショット 2023-12-24 17.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736924/17d3d410-ac49-572a-7617-949a8e44e80c.png)

うまくできていそうですね！

# おわりに
Geminiを使って無料でChatbotをつくることができました．
Geminiは2024年のはじめ頃まで無料で使えるのでぜひ遊んでみてください．

また，Google Developer Student Clubsでは，アプリ開発をはじめとしてメンバー同士で教え合いながら，楽しくプロダクト開発をしています．興味のある方はぜひお近くのチャプターに参加してみてください！

https://sites.google.com/view/gdsc-jp/home