Geminiにポケモンの育て方を尋ねてみた

# はじめに

焦燥感と衝動にかられたので急遽記事を書くことにしました．

本日は[Retail AI Adventurers Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rai-adventurers)シリーズ2の15日目の投稿です．

昨日は[@10long](https://qiita.com/10long)さんの[gemini速報 Google Cloud Applied AI Summit を見た雑感](https://qiita.com/10long/items/c394823630ba0aef7e58)で，Geminiの速報をまとめて頂いておりました．本日もGeminiを題材にした内容になります．

# Geminiとは

Gemini(ジェミニ，ジェミナイ)とは，Googleが発表した生成AIモデルです．

日本時間の2023/12/14からGCPでGemini Pro，Gemini Pro Visionを使うことができるようになり，一般提供開始までは無料で使えるとのことです．

https://japan.googleblog.com/2023/12/gemini.html

# 触ってみる

はじめにことわっておきますと，あくまで技術調査が目的です．後述は遊んでいるように見えますがご容赦ください．Geminiについて確認したかった観点は以下です．

- 入力したシンプルな画像を正しく認識すること
- 入力したシンプルな文章を正しく認識すること
- 質問に沿った回答をすること
- 回答の日本語に違和感がないこと
- 現実の情報と矛盾のない回答が返ってくること

以上を踏まえて，読んでいただけますと幸いです．

## 適当なアプリ作成

検証のため適当なアプリを作成しました．やっていることはテキストと画像を投げて，それに対してのGeminiの回答を載せているだけです．GCP上でGeminiを扱ってももちろん問題ないですが，せっかくなのでAPIを使って触ってみよういう好奇心でやりました．Google Cloud SDKをインストールしておく必要はありますが，それさえしておけばAPI keyの発行やロール付与などすることなく使うことができました．現状無料で使えるからかもしれません．

今回はStreamlitを使って実装しました．Streamlitに関しては，[こちら](https://qiita.com/yoshitake_tatsuhiro/items/4bf26bad64b0dc5ab5cf)にわかりやすく記載されているので，良ければご一読ください．

以下適当アプリのコードです．なぐり書きです．

<details><summary>コード</summary>

```python:app.py
import cv2
import numpy as np
import streamlit as st
import vertexai
from vertexai.preview.generative_models import GenerativeModel, Image, Part

PROJECT_ID = "******"
LOCATION = "asia-northeast1"
vertexai.init(project=PROJECT_ID, location=LOCATION)


@st.cache_resource
def load_models() -> GenerativeModel:
    multimodal_model_pro = GenerativeModel("gemini-pro-vision")
    return multimodal_model_pro


def get_gemini_pro_vision_response(
    model: GenerativeModel,
    prompt_list: list,
    generation_config: dict = {},
    stream: bool = True,
) -> str:
    responses = model.generate_content(
        prompt_list, generation_config=generation_config, stream=stream
    )
    final_response = []
    for response in responses:
        try:
            final_response.append(response.text)
        except IndexError:
            pass
    return "".join(final_response)


def main() -> None:
    """Main function"""
    multimodal_model_pro = load_models()
    config = {
        "temperature": 0.1,
        "max_output_tokens": 2048,
    }
    st.write("Prompt")
    prompt = st.text_input("Prompt", label_visibility="hidden")
    fig = st.file_uploader("", type=["png"], label_visibility="collapsed")
    prompt_list = []
    if fig:
        _image = cv2.imdecode(np.frombuffer(fig.read(), dtype=np.uint8), 1)
        _image = cv2.cvtColor(_image, cv2.COLOR_BGR2RGB)
        st.image(_image, width=100)

        image = Image.from_bytes(fig.getvalue())
        image_part = Part.from_image(image)
        prompt_list = [
            prompt,
            image_part,
        ]

    submit = st.button("Submit")
    if submit and fig:
        response = get_gemini_pro_vision_response(
            model=multimodal_model_pro,
            prompt_list=prompt_list,
            generation_config=config,
        )
        st.write(response)


if __name__ == "__main__":
    main()
```

</details>

```shell
streamlit run app.py
```
実行したら，`http://localhost:8501`にアクセスします．

## ポケモン育成論を尋ねてみた

今回はポケモンの育成論を尋ねてみました．理由は，ただ画像を与えて「この画像を説明してください」とGeminiに頼むのは皆さんやられると思い，Geminiに提案までしてもらいたかったためです．食材の画像を入力してレシピを提案，様々な犬の画像を入力して育て方を提案なども考えましたが，正解がわからないのと，少しはエッジの効いた題材にしようと思い，この題材にしました．

ポケモン育成論について簡単にお話ししますと，ポケモンにはそれぞれ長所と短所があり，長所を伸ばすのが良いとされております．すなわち，同じポケモンでも，育て方によって強くなったり弱くなったりします．そこで，Geminiにアイデアをもらうため，ポケモンをどのように育てれば良いのかを尋ねました．

ポケモンに興味のない方は申し訳ございません．犬の種類(柴犬，レトリーバー，ボーダーコリー，，)などに置き換えていただけたらと思います．

### フシギダネ *(図鑑No.001)*

正しくフシギダネと認識し，回答内容もほぼ正しい内容でした(フシギダネはくさ・どくタイプです)．日本語としてもきれいで非常に読みやすかったです．

<img width=15%><img width=70% alt="Bulbasaur.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/90ccc3d2-6384-6438-2d03-8ccbc8caff12.png">


### ブラッキー *(私のお気に入り)*

画像のポケモンはブラッキーなのですが，エーフィと認識されました．エーフィとしての回答はほぼほぼOKでした．最後の文「れいせいは，特攻と素早さが上がる性格」というのは語弊があり，エーフィは昼に進化するので，そのあたりは正しい回答ではありませんでした．

<img width=15%><img width=70% alt="Umbreon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/a3b1d2fa-8660-f98c-287a-0a2e8378217b.png">


### エーフィ *(ブラッキーが間違われたので)*

エーフィとして認識はしてくれました．しかし，事実と異なる内容が多くを占めて返ってきました．

<img width=15%><img width=70% alt="Espeon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/d7803fa9-af46-6da1-1c2f-169ac4802244.png">


### 小まとめ

3匹を題材にGeminiの性能を確認しました．まとめると以下のようになりました．
他のLLMでは試すことができていないので比較できておりませんが，いったん現時点でのGeminiではこのような結果となりました．

| ポケモン | フシギダネ | ブラッキー | エーフィ |
| --- | --- | --- | --- |
| 入力した画像を正しく認識すること | ◯ | ✕ | ◯ |
| 入力した文章を正しく認識すること | ◯ | ◯ | ◯ |
| 質問に沿った回答をすること | ◯ | ◯ | ◯ |
| 回答の日本語に違和感がないこと | ◯ | ◯ | ◯ |
| 現実の情報と矛盾のない回答が返ってくること | △寄りの◯ | △ | ✕ |

# 業務での活用案

ここまでだとほんとうに遊んで終わりのように思われるので，Googleが紹介しているユースケースをピックアップしてごまかします．

## ドキュメントの管理，データ化

ドキュメントの管理やデータ化には活用できます．すでにLLMでRAGという手法がありますが，今回マルチモーダルということなので，文章にはできない挿入画像なども含めて，より高度なEmbeddingが可能になると考えられます．
[サンプルコード](https://github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/retrieval-augmented-generation/intro_multimodal_rag.ipynb)

## レコメンド

部屋を撮影し，その空間に合う家具を提案するという使われ方がされておりました．マルチモーダルの利点を活かした使い方だと感じました．
[サンプルコード](https://github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/use-cases/retail/multimodal_retail_recommendations.ipynb)

# まとめ

ポケモン育成論を題材にGeminiを触ってみました．やってみて言うのも恐縮ですが，もしかしたらタスクが難しかったかもしれません．虚偽がいくつかありましたが，率直にすごい技術だと感じています．

ただし，果たしてマルチモーダルモデルを使う必要があるのかは慎重になるべきと思います．コストやパフォーマンスを踏まえ，既存の画像認識や音声認識ライブラリを使うのも一案だと思います．

# 参考
- [Gemini](https://japan.googleblog.com/2023/12/gemini.html)
- [Gemini github](https://github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/sample-apps/gemini-streamlit-cloudrun/app.py)

# Appendix
Geminiが，ブラッキーをエーフィと誤認するとわかった上で，文章に補足を加えて(「画像のポケモンはエーフィではありません」と追記)，もう一度試したところ，無事ブラッキーと認識してくれました．育成論はイマイチでした．

<img width=15%><img width=70% alt="Umbreon2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/344690b1-5076-62d8-641d-8d53fd8a661a.png">

ブラッキーと明記して，もう一度試したところ，ほぼ完璧な育成論を回答してくれました．ただこれだと画像の情報は必要としていないことになります．テキストのみの情報で回答させたほうが精度が良いのかもしれません．

<img width=15%><img width=70% alt="Umbreon3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/556276d7-771f-0e39-1584-f99f2e94e0c6.png">

英語で尋ねてみると，ブラッキーと認識してくれました．回答は一般的なポケモンの育て方になっており，ブラッキーの特徴を加味してくれていませんでした．

<img width=15%><img width=70% alt="Umbreon4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618319/b476e1c6-028a-5543-a82d-7f0358860704.png">