Gemini 1.5 flash でjson回答の受け取り

はじめに

ChatGPT-4oがでました。そしてその影ではGemini-1.5-flashがリリースされました。

ChatGPTと比べたときの優位性は何でしょうか?
それは、無料でAPIが使えることです。

Gemini API の料金  |  Google AI for Developers  |  Google for Developers
Gemini API には多数の無料枠があるため、誰でも生成 AI アプリを構築できます。ニーズの拡大に応じた柔軟な料金設定。

無料版の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と変わっていません。
スタートガイドに大体の使用方法は書いてあります。

チュートリアル: Gemini API のスタートガイド  |  Google AI for Developers  |  Google for Developers
Gemini API のスタートガイド(テキスト生成、チャット機能など)

使うためには、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フォーマットを指定できる話を書きました。

タイトルとURLをコピーしました