はじめに
ChatGPT-4oがでました。そしてその影ではGemini-1.5-flashがリリースされました。
ChatGPTと比べたときの優位性は何でしょうか?
それは、無料でAPIが使えることです。
![](https://ai.google.dev/static/site-assets/images/share.png?hl=ja)
無料版のapiの制限は現在
- 1分あたりのリクエスト数 : 15
- 1分あたりのトークン数 : 100万token
- 一日あたりのリクエスト数 : 1500
となっています。つまり、毎分100万tokenを1日中使っても問題ないのです(60*24=1440リクエスト)。個人利用では、十分すぎる使用容量です。
しかも、flashと名のつく通りとても返答が高速なのです。
もちろん有料版(従量課金制)にすれば
- 1分あたりのリクエスト数 : 360
- 1分あたりのトークン数 : 1000万token
- 一日あたりのリクエスト数 : 10000
となり、100万tokenあたり0.35~0.70ドルかかります。
使ってみる
使い方は従来のGeminiと変わっていません。
スタートガイドに大体の使用方法は書いてあります。
![](https://ai.google.dev/static/site-assets/images/share.png?hl=ja)
使うためには、google-generativeaiをpipでいれるだけです。
pip install -q -U google-generativeai
API_KEYを取得してきたら、それを入力します。
Geminiを使うためには、モデルを選択する必要があります。
Geminiのモデル名一覧は次のようにして表示できます。
import google.generativeai as genai
GOOGLE_API_KEY = '`xxx'
genai.configure(api_key=GOOGLE_API_KEY)
for m in genai.list_models():
if 'generateContent' in m.supported_generation_methods:
print(m.name)
表示されるものがこちら
models/gemini-1.0-pro
models/gemini-1.0-pro-001
models/gemini-1.0-pro-latest
models/gemini-1.0-pro-vision-latest
models/gemini-1.5-flash-latest
models/gemini-1.5-pro-latest
models/gemini-pro
models/gemini-pro-vision
今回は、Gemini 1.5 flashを使いたいので、該当するモデルを選択します。
日本語で質問してみます。
model = genai.GenerativeModel('gemini-1.5-flash-latest')
response = model.generate_content("生きる意味とはなんですか?")
print(response.text)
生きる意味を教えてくれました。
生きる意味は、人それぞれであり、一つの答えはありません。しかし、多くの人が人生の目的や意義を探し求める中で、以下のよ* **学びと成長:** 新しい知識や経験を吸収し、自己成長を続けること。
* **喜びと幸福:** 人生における喜びや幸福を感じ、充実感を得ること。
* **精神的な探求:** 宗教、哲学、芸術などを通して、自分自身や宇宙について深く考えること。
これらの要素はすべて、人生に意味を与える可能性を秘めています。重要なのは、自分にとって何が重要で、何を追求したいのかを見つけることです。
**生きる意味を探すヒント:**
* **自分の価値観や興味関心を考える:** あなたは何に価値を感じるか? 何に興味があるか?
* **過去の経験を振り返る:** 過去にどのような喜びや充実感を感じたのか?
* **未来について考える:** あなたはどんな未来を望んでいるか?
* **他の人々の生き方を学ぶ:** 他の人々の生き方や考え方から学ぶことは、あなた自身の生き方を考える上で役立ちます。
* **自分自身の心に耳を傾ける:** あなたの心は、あなたにとって何が重要なのかを告げてくれます。
生きる意味は、探求し続けるプロセスであり、答えは常に変化する可能性があります。大切なのは、自分の人生を積極的に生き、自分にとって意味のある生き方を見つけることです。
マルチターンでの会話
会話(および履歴)を送信するには、次のようにします。適当な宇宙人と会話してみます。
import google.generativeai as genai
GOOGLE_API_KEY = 'xxx'
genai.configure(api_key=GOOGLE_API_KEY)
model = genai.GenerativeModel('gemini-1.5-flash-latest', system_instruction=['あなたは宇宙人で、地球人には理解できない言語で会話してください。'])
messages = [
{
'role':'user',
'parts': ["あなたは宇宙人ですか?"]
},
{
'role':'model',
'parts':["mdasflk,saf saflk,sad sdfadaf dafadfea(はいそうですという意味)"]
},
{
'role':'user',
'parts':["宇宙人から見た地球人の概略を教えて下さい"]
}
]
response = model.generate_content(messages)
print(response.text)
ちゃんと返答してくれました!。マルチターンを利用すれば、相手の会話に制限をつけられます。
sdasfdsf adf sdaf asdfasf asdasdfad fad sfasfdafsdf safsdafasdf asdfasdfasdf asdfad(地球人は奇妙で、常に争いを起こす種族だ。しかし、彼らは創造的な一面も持ち合わせている。彼らは自分たちの惑星を破壊する可能性も、それを守る可能性も秘めている。興味深い存在だ。)
Json回答の受け取り
本題に入ります。
LLMをなにかの自動化に利用しようとしていると、多くの場合でjsonで回答してほしいときがあります。
単純に指示するのであれば、こうなります。これはほとんどのLLMで実現できる内容です。
※指示文をsystem_instructionとして入力できますが、直接質問文へ入れても問題ありません。
import google.generativeai as genai
GOOGLE_API_KEY = 'xxx'
genai.configure(api_key=GOOGLE_API_KEY)
json_format = '''
[
{
"title":str,
"time":time stamp,
"to_do":str
}
]
'''
model = genai.GenerativeModel('gemini-1.5-flash-latest', system_instruction=[f'返答は次のjsonフォーマットに従ってください。{json_format}'])
response = model.generate_content("休日の予定を計画してください。できるだけ予定を詰め込んでください。映画も見たいです")
print(response.text)
もちろん、指示に従って、jsonフォーマットの文字列が返ってきます。
[
{
"title": "朝ヨガ",
"time": "2023-12-09T07:00:00",
"to_do": "自宅で30分のヨガをする。体の柔軟性を高め、心身をリフレッシュする。"
},
{
"title": "ブランチ",
"time": "2023-12-09T09:00:00",
"to_do": "近くのカフェで美味しいブランチを楽しむ。インスタ映えする写真も忘れずに!"
},
{
"title": "美術館",
"time": "2023-12-09T10:30:00",
"to_do": "話題の美術館に行って、芸術に触れる。最近は〇〇展が開催されているので、ぜひ足を運んでみたい。"
},
{
"title": "ショッピング",
"time": "2023-12-09T13:00:00",
"to_do": "気になる洋服や雑貨を買いに行く。事前にチェックしておいたお店を回る。"
},
{
"title": "映画鑑賞",
"time": "2023-12-09T16:00:00",
"to_do": "話題の映画〇〇を鑑賞。ポップコーンとドリンクは必須!"
},
{
"title": "夕食",
"time": "2023-12-09T19:00:00",
"to_do": "おしゃれなレストランで夕食を楽しむ。美味しい料理とワインで特別な時間を過ごす。"
},
{
"title": "バー hopping",
"time": "2023-12-09T21:00:00",
"to_do": "街のバーを巡り、お酒を嗜む。新しいお店を開拓するのも良い。"
}
]
しかし、これって確実性に欠けるんですよね。必ずしもjson形式で返ってくるとは限らず、また、文字列がjson以外の文字も含んでしまうことも多々あります(はいわかりました。などの応答文が混入)。
そんなときは、generation_confingに”response_mine_type”:”application/json”をしていします。
import google.generativeai as genai
GOOGLE_API_KEY = 'xxx'
genai.configure(api_key=GOOGLE_API_KEY)
model = genai.GenerativeModel('gemini-1.5-flash-latest', generation_config={"response_mime_type":"application/json"})
response = model.generate_content("休日の予定を計画してください。できるだけ予定を詰め込んでください。映画も見たいです。タイトル、タイムスタンプ、行動内容を入れてください")
print(response.text)
すると、geminiからのレスポンスはjsonフォーマットに従ったものだけになります。(もちろん、指示文を追加すれば、jsonのフォーマットを指定できます)
{"schedule": [{"time": "08:00", "action": "起床、朝食"}, {"time": "09:00", "action": "ヨガ"}, {"time": "10:00", "action": "近くの公園で散歩"}, {"time": "11:00", "action": "カフェでランチ"}, {"time": "12:00", "action": "美術館見学"}, {"time": "14:00", "action": "映画鑑賞(タイトル:〇〇)"}, {"time": "16:00", "action": "ショッピング"}, {"time": "18:00", "action": "レストランでディナー"}, {"time": "20:00", "action": "バーで一杯"}, {"time": "22:00", "action": "帰宅、就寝"}]}
素晴らしいですね。pythonではこれをjsonライブラリを使ってdictionaryへと変形できます。
import json
import pprint
response_dict = json.loads(response.text)
pprint.pprint(response_dict, sort_dicts=False)
ん~。完璧です。あとはこの辞書形式のデータを利用すれば、データベースへの登録や、次の質問へのチェーン。質問分岐などにも活用できます。
{'schedule': [{'time': '08:00', 'action': '起床、朝食'},
{'time': '09:00', 'action': 'ヨガ'},
{'time': '10:00', 'action': '近くの公園で散歩'},
{'time': '11:00', 'action': 'カフェでランチ'},
{'time': '12:00', 'action': '美術館見学'},
{'time': '14:00', 'action': '映画鑑賞(タイトル:〇〇)'},
{'time': '16:00', 'action': 'ショッピング'},
{'time': '18:00', 'action': 'レストランでディナー'},
{'time': '20:00', 'action': 'バーで一杯'},
{'time': '22:00', 'action': '帰宅、就寝'}]}
余談
毎回、microsoftのphiモデルがリリースされて、ローカルLLMもいけるやん!って試行錯誤してると、geminiがリリースされて、googleのapi叩けばいいか。ってなる。
追記
ローカルLLMでもjsonフォーマットを指定できる話を書きました。