見出し画像

Gemini APIを使って推論する

前に言った通り記事にした

本記事は、下記のコンペに投稿しようとしていたが、現在のGeminiの機能では出来ないことより中断した。しかし、せっかくコードを書いたので一部を、noteで紹介していく


はじめに

Gemini APIのドキュメントを見ることをオススメする。基本的なことは書いてあるからだ

何をするか

  1. プロンプトで推論する

  2. 画像を送信して解釈してもらう

  3. 音声を送信して文字起こししてもらう

特に画像を複数送信する方法については、パッとみて書かれてなさそうなので見る価値があるかもしれない

前提

  • Google アカウント

  • Python

  • Windows 11 Pro ( Homeでも出来るかと )

事前準備

Gemini API 用の Python SDKをインストールする

pip install google-generativeai

Gemini APIキーを取得しておく

特別、APIキーを取得するのに支払情報やクレジットカードの登録は不要だった(2024/6/23 時点)

APIキーを取得したら、環境変数に登録する
こちらは、ユーザー環境変数に登録した

変数名: 任意の名前 (例:Gemini_API_KEY)
値:取得したAPIキー

実装

基本

Geminiのロードをする

import google.generativeai as genai
import os

# 環境変数をセットする
genai.configure(api_key=os.environ["Gemini_API_KEY"])

# Geminiのロード
model = genai.GenerativeModel('gemini-1.5-flash')

# ここから先にしたいことを書く

modelに関してはいくつか選べるが、入力フォーマットは大して変わらなかったので"gemini-1.5-flash"でいく

環境変数を今までコードにベタ打ちで書いていたが、Geminiで初めて環境変数に格納することをしたのが新鮮だった。自分だけ読むので問題ないと考えていたが、間違ってソースコードをblogなどに晒してしまう機会を未然に防げる。ただし、環境変数に格納するということは他のPCに移行するときに忘れると動作しなくなるので注意は必要だ

# 環境変数を表示する
print(os.environ["Gemini_API_KEY"])

なぜか、VSCodeでPythonを実行したらKEYが読み込めなかったのでVSCodeを一度、閉じたらいけた。気付かなかったので普通にPythonファイルを保存してPowershellやコマンドプロンプトで実行した方がいいかもしれない

python sample.py

プロンプトで推論する

シンプルで分かりやすいコードだ

import google.generativeai as genai
import os

# 環境変数をセットする
genai.configure(api_key=os.environ["Gemini_API_KEY"])

# Geminiのロード
model_name="gemini-1.5-flash"
model = genai.GenerativeModel(model_name=model_name)

# プロンプトを元に推論してもらう
response = model.generate_content("こんにちは!") 

# 出力結果を表示する
print(response.text)

プロンプトの内容をgenerate_contentの引数に文字列として渡せばよい

response = model.generate_content("プロンプトの内容を書く") 

実行するとGeminiによる推論結果が返ってくる

出力結果

画像を送信して解釈してもらう

画像を読み込んで何の写真か解釈してもらおう、サンプルに過去の投稿に使用した画像ファイルを読み込ませる

import google.generativeai as genai
import os
import pathlib
import glob

# 環境変数をセットする
genai.configure(api_key=os.environ["Gemini_API_KEY"])

# Geminiのロード
model_name="gemini-1.5-flash"
model = genai.GenerativeModel(model_name=model_name)

# カレントディレクトリにある画像を参照する
current_directory = os.getcwd()
images=glob.glob(current_directory+"/*.jpeg")

# Geminiに送る画像を定義する
send_pictures=[]
for image in images:

    send_picture = {
        'mime_type': 'image/jpeg',
        'data': pathlib.Path(image).read_bytes()
    }
    send_pictures.append(send_picture)

# プロンプトを元に推論してもらう
response = model.generate_content(["受信した画像は何枚ですか?各画像の文字や描かれた内容を説明してください", *send_pictures]) 

# 出力結果を表示する
print(response.text)

画像を読み込むだけであればドキュメント通りでいいのだが、複数枚、読み込むコードを見つけられなかった

結論から言えば、*配列でアンパックしたものを送信することが出来た
モデルで複数の画像を受け付けられるように見受けられたので試してよかった

response = model.generate_content(["プロンプトの内容", *send_pictures]) 
出力結果

ちなみに、各ファイルを読み込む全てのパターンがドキュメントに記載されているのではないので、一般的な他の話題と組み合わせて使うのだと思い、他の種類のファイルはどう書けばいいかと思ったときにmime typeを調べて指定したらいいのではと思ったら案外いけた。その時に活用したリンクを貼っておく

また、Geminiが受け付けられるファイルの種類(拡張子)が言及されているページがあったと思うので必要に応じて調べてほしい

音声を送信して文字起こししてもらう

音声を送信して何を言っているのか文字起こしをしてもらおう。サンプルとしてVOICEVOXのずんだもんに読み上げてもらったファイルを使おう

import google.generativeai as genai
import os
import pathlib

# 環境変数をセットする
genai.configure(api_key=os.environ["Gemini_API_KEY"])

# Geminiのロード
model_name="gemini-1.5-flash"
model = genai.GenerativeModel(model_name=model_name)

# Geminiに送る音声を定義する
send_audio = {
    "mime_type": "audio/wav",
    "data": pathlib.Path("test.wav").read_bytes()
}

# プロンプトを元に推論してもらう
response = model.generate_content(["受信した音声ファイルの内容を文字起こししてください", send_audio]) 

# 出力結果を表示する
print(response.text)

画像のときもそうなのだが、何回か試行すると「それらしく」解釈してくれる場合もあった。プロンプトの書き方で改善する可能性もあるが、今回は1回で期待した通りにならなかった

出力結果(1回目)
出力結果(2回目)
出力結果(3回目)

機械学習の分野ではあるのだろうけど、音声の認識と文字起こし、また、文字による推論は別々に捉えた方が扱いやすい。あまり言及するつもりはないが自分の中でのフラットとはこういうことだ。一気にプロダクトに対する期待感は薄れるが、ここからどう向き合うかを考える比較的、現実的な対応だと考えている

一方で良かったことは、GeminiのAPIのコードに関してはシンプルに書けるので好感度は上がった

感想

Google ColabでGPUを使って推論するよりは圧倒的に早い。ローカルLLM(llama.cppで出力したGGUF)と比べても全文を待つ時間は変わらないか、少し早いとさえ感じるくらいだ。恐らくクオンタイズをしていないフォーマットで大規模で高性能なGPUで処理しているのだろう。ChatGPTのAPI(有料)は使ったことがないが、恐らくレスポンスはこんな感じなのだろうと思わせてくれる体験だった

LLMを選択するにあたり、ある程度、有用性を理解できればGoogle Colabと同じように有料契約を結んでもいいとは思う。APIキーをユーザーに購入してもらえれば小規模な個人開発アプリも出しやすいだろうし、規模感によっては法人契約を結んでライセンス契約を結んでユーザーはAPIを気にすることなくリリースなんてことも考えられる

最後に見出し画像として使用した「Geminiに生成してもらった画像」を添付して終わりとする

prompt: create images written"Gemini" and sea

おわり!

この記事が参加している募集