こんにちは! 虎の穴ラボのA.Mです。
この記事は夏の連載企画の10日目の記事です。
前回はS.Aさんによる「GPT-4o の画像解析でレシートを読み取る bot を作ってみた」が投稿されました。
OpenAIのChatGPTは普段からよく使っていますが、2023年末頃から話題になっているGoogleの生成AIであるGeminiはまだ触ったことがなかったので、今回はGeminiのAPIをいろいろ触ってみたいと思います。
Geminiについて
Geminiは、Googleが開発しているマルチモーダル生成AIです。 マルチモーダルは、複数の形式や手段を組み合わせることを意味しており、Geminiは入力にテキストデータだけでなく、画像・音声・動画といった異なる種類のデータを組み合わせて使用できるという特徴があります。
Gemini APIで使えるモデル
Gemini APIでは、以下のようなさまざまなモデルが使えます。(※2025年2月17日更新)
※公式ドキュメントより引用
モデル バリエーション | 入力 | 出力 | 最適な用途 |
---|---|---|---|
Gemini 2.0 Pro 試験運用版 | 音声、画像、動画、テキスト | テキスト、画像(近日提供予定)、音声(近日提供予定) | 品質が向上(特に世界に関する知識、コード、長いコンテキスト) |
Gemini 2.0 Flash | 音声、画像、動画、テキスト | テキスト、画像(近日提供予定)、音声(近日提供予定) | 次世代の特徴、速度、マルチモーダル生成によるさまざまなタスク |
Gemini 2.0 Flash-Lite プレビュー | 音声、画像、動画、テキスト | テキスト | 費用対効果と低レイテンシを重視して最適化された Gemini 2.0 Flash モデル |
Gemini 1.5 Flash | 音声、画像、動画、テキスト | テキスト | さまざまなタスクで高速で汎用性の高いパフォーマンスを実現 |
Gemini 1.5 Flash-8B | 音声、画像、動画、テキスト | テキスト | 大量の低インテリジェンス タスク |
Gemini 1.5 Pro | 音声、画像、動画、テキスト | テキスト | より多くのインテリジェンスを必要とする複雑な推論タスク |
Gemini 1.0 Pro(非推奨) | テキスト | テキスト | 自然言語タスク、マルチターン テキストとコードチャット、コード生成 |
Gemini 1.0 Pro Vision (非推奨) | 画像、動画、テキスト | テキスト | 画像の説明の生成や画像内のオブジェクトの識別など、視覚関連のタスク向けに最適化されたパフォーマンス |
テキスト エンベディング | テキスト | テキスト エンベディング | 最大 2,048 個のトークンのテキストに対して最大 768 次元の弾力性のあるテキスト エンベディングを生成します。 |
エンベディング | テキスト | テキスト エンベディング | 最大 2,048 トークンのテキストに対して 768 次元のテキスト エンベディングを生成します。 |
AQA | テキスト | テキスト | 指定されたテキストに対してアトリビューション付きの質問応答関連のタスクを実行する |
現状、レート制限はあるものの、ちょっと試すくらいなら無料で使えるようです。(2025年2月時点)
詳細は公式ページをご確認ください。
Gemini API の料金 | Google AI for Developers
※代表的なモデルの性能比較については以下の記事をご参照ください。 toranoana-lab.hatenablog.com
Gemini API を触ってみる
APIキーの発行
まずはAPIキーを発行します。
「Google AI Studio」を開きます。
Google AI Studio
続いて、サイドメニューの「Get API Key」ボタンを押します。
「APIキーを作成」ボタンを押します。
以下のようなダイアログが表示された場合は確認の上「OK」を押します。
「新しいプロジェクトでAPIキーを作成」を選択します。既存のGoogle Cloudプロジェクトがある場合はそちらを選択してもOKです。
作成された「APIキー」をコピーしておきます。
一度画面をリロードすると、下部にテスト用のcurlコマンドが表示されます。
APIキーを指定して実行してみます。
(GEMINI_API_KEYは、先ほどコピーしたAPIキーに置き換えてください)
APIのエンドポイントから、モデルは「Gemini 1.5 Flash」が指定されているのが分かりますね。
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=GEMINI_API_KEY" \ -H 'Content-Type: application/json' \ -X POST \ -d '{ "contents": [{ "parts":[{"text": "AIの仕組みをGeminiを例に説明してください。"}] }] }'
以下のようなレスポンスが返ってきていればOKです。
{ "candidates": [ { "content": { "parts": [ { "text": "GoogleのGeminiは、大規模言語モデル(LLM)であり、その仕組みは他の多くのLLMと共通点が多い一方で、Google独自の技術も取り入れています。以下に、Geminiの仕組みをいくつかの側面から説明します。\n\n**1. トランスフォーマーアーキテクチャ:**\n\nGeminiの中核は、トランスフォーマー アーキテクチャです。これは、入力データ(テキスト、コード、画像など)を構成要素(単語、トークン)に分割し、それらの間の関係性を考慮して処理する神 経回路網です。 トランスフォーマーは、自己注意機構(self-attention mechanism)と呼ばれる仕組みを用いて、入力データ内の全ての要素間の関係性を同時 に考慮します。これにより、文脈を深く理解し、より複雑なタスクを実行できるようになります。 Geminiは、この自己注意機構を非常に大規模に実装すること で、膨大な量のデータからパターンを学習し、高度な言語理解能力を獲得しています。\n\n**2. 多様なデータセットの学習:**\n\nGeminiは、テキスト、コード 、画像など、非常に多様なデータセットで学習されています。この多様なデータセットは、Geminiに幅広い知識と能力を与えています。 単なる言語理解だけで なく、画像のキャプション生成、コードの生成、翻訳など、様々なタスクに対応できるのは、この多様な学習データによるものです。 Googleは、学習データの 規模や質については詳細を公開していませんが、極めて巨大なデータセットを用いていることは間違いありません。\n\n**3. パラメータの規模:**\n\nGeminiは 、膨大な数の「パラメータ」を持っています。パラメータとは、モデルが学習を通じて調整する数値であり、その規模がモデルの能力に大きく影響します。パラ メータが多いほど、モデルはより複雑なパターンを学習し、より高度なタスクを実行できます。Geminiのパラメータ数は公式には公開されていませんが、他の最 先端のLLMと同様に、数兆規模であると推測されます。\n\n**4. モジュール性と効率性:**\n\nGeminiは、単一の巨大なモデルではなく、複数のモジュールから構成されている可能性が高いです。これは、モデルのトレーニングと推論をより効率的に行うためです。 異なるモジュールが、異なるタスクに特化している可能 性があり、それらを組み合わせることで、様々なタスクに対応することができます。 また、効率的な計算手法やハードウェアの活用により、推論速度を向上させていると考えられます。\n\n**5. モデルの微調整 (Fine-tuning):**\n\n基本的な大規模言語モデルを学習した後、特定のタスクやドメインに合わせた微調整が行われます。例えば、医学的な質問応答システムを構築する場合、医学関連のデータを用いてGeminiを微調整することで、より正確な回答を得られるようになり ます。\n\n\n**まとめ:**\n\nGeminiは、トランスフォーマーアーキテクチャに基づき、多様な大規模データセットを用いて学習された、巨大なパラメータを持つLLMです。 モジュール性と効率性を重視した設計により、様々なタスクに柔軟に対応できることが特徴です。 しかし、その具体的なアーキテクチャや学習方法の詳細については、Googleから完全に公開されていない部分も多く残されています。\n\n\nこれらの説明は、現在公開されている情報に基づいた推測を含むもの です。 GoogleはGeminiに関する技術の詳細を徐々に公開していくと考えられます。\n" } ], "role": "model" }, "finishReason": "STOP", "avgLogprobs": -0.32691509804029145 } ], "usageMetadata": { "promptTokenCount": 11, "candidatesTokenCount": 712, "totalTokenCount": 723, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 11 } ], "candidatesTokensDetails": [ { "modality": "TEXT", "tokenCount": 712 } ] }, "modelVersion": "gemini-1.5-flash" }
ちなみに、APIキーが間違っている場合は以下のようなエラーが返ってきます。
{ "error": { "code": 400, "message": "API key not valid. Please pass a valid API key.", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "API_KEY_INVALID", "domain": "googleapis.com", "metadata": { "service": "generativelanguage.googleapis.com" } }, { "@type": "type.googleapis.com/google.rpc.LocalizedMessage", "locale": "en-US", "message": "API key not valid. Please pass a valid API key." } ] } }
簡単なプロンプトを入力してみる
まずは自己紹介をしてもらいましょう。
(GEMINI_API_KEYは、先ほどコピーしたAPIキーに置き換えてください)
API_KEY="GEMINI_API_KEY" curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${API_KEY}" \ -H 'Content-Type: application/json' \ -X POST \ -d '{ "contents": [{ "parts":[{"text": "自己紹介をしてください。200文字以内で回答してください。"}] }] }'
レスポンスとして以下のような内容が返ってきました。
※candidates.content.parts.textの内容を抜粋
▼2024年6月時点の回答
こんにちは!私はGoogleによって訓練された、大規模言語モデルです。膨大なテキストデータから学習し、様々なタスクを実行できます。例えば、文章の生成、翻訳、要約、質問への回答などです。常に学習を続けており、より賢く役に立つ存在を目指しています。何か質問があれば、遠慮なく聞いてください!
▼2025年2月時点の回答
私はGoogleによって訓練された、大規模言語モデルです。膨大なテキストデータセットを学習し、様々なタスクを実行できます。質問に答えたり、文章を生成したり、翻訳したり、要約したりといったことが得意です。常に学習を続けており、能力向上を目指しています。 私の目的は、ユーザー の役に立つ情報を提供することです。正確で有益な回答を心がけていますが、完璧ではありません。出力内容については、ご自身でも確認することをお勧めします。
内容に大きな変化はありませんが、出力内容が完璧ではなく、自身でも確認するよう促す内容が追加されているようです。
画像を読み込ませてみる
次に、画像を読み込ませてみます。
使う画像はこちらのメイドちゃん。
この画像をGeminiに渡して、説明をしてもらいます。
# 画像データはbase64エンコードして渡す IMAGE_DATA=$(base64 42_toralabevent.png) curl "https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key=${API_KEY}" \ -H 'Content-Type: application/json' \ -X POST \ -d @- <<EOF { "contents":[ { "parts":[ {"text": "画像を説明してください。日本語で回答してください。"}, { "inlineData": { "mimeType": "image/png", "data": "${IMAGE_DATA}" } } ] } ] } EOF
実行結果は以下のようになります。
※candidates.content.parts.textの内容を抜粋
▼2024年6月時点の回答
画像には、紫色の髪をした女の子が、ピンク色のテーブルの前に立っています。テーブルの上には、絵の具のパレットが描かれた看板と、何枚もの紙が積み重ねられたものが置かれています。女の子は、笑顔で紙を手に持ち、テーブルの看板に「とらぶ!」と書かれた文字を指さしています。女の子の隣には、赤い旗が立てられており、「とらぶ」と書かれた文字が書かれています。背景は白です。全体的に、女の子が何か商品を販売している様子が描かれた、かわいらしいイラストです。
▼2025年2月時点の回答
画像は、メイド服を着た紫髪の女の子が、小さなテーブルに立って何かを販売している様子を描いたイラストです。 女の子は笑顔で、両手でピンク色の商品(おそらくパンフレットなど)を持っています。テーブルの上には、商品が積み重ねられており、「NEW!!」の札が立てられています。テーブルの看板には「とららが!」と大きく書かれており、これが店名もしくは商品名であると推測できます。また、テーブルの横に小さなイーゼルがあり、カラーパレットと思われるイラストが描かれたボードが立てられています。さらに、女の子の後ろには「とららが」と書かれた旗が立っています。全体的な雰囲気は可愛らしく、親しみやすいものです。イラスト全体の色使いはパステル調で、優しい印象を与えます。
手書き風の文字はさすがに正しく読み取れなかったようで、「とらラボ!」が「とらぶ」や「とららが」になっていますが、説明自体はだいたい合ってそうです。
2025年2月に再度実行してみたところ、イラストの雰囲気や印象などについての説明が増えており、モデルの進化を感じられますね。
レスポンスのJSON形式を指定してみる
次のように、generationConfig
にresponseMimeType
を指定することで、レスポンスの形式をJSONに指定できます。
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${API_KEY}" \ -H 'Content-Type: application/json' \ -X POST \ -d '{ "contents": [ { "parts": [ { "text": "カレーに使われる代表的なスパイスを5つ挙げてください。次のJSONスキーマで回答してください。 schema:\n\n Spice = {\"spice_name\": str, \"explanation\": str}\n\nReturn a `list[Recipe]`\n" } ] } ], "generationConfig": { "responseMimeType": "application/json" } }'
レスポンスは以下の通りです。
"candidates": [ { "content": { "parts": [ { "text": "[{\"spice_name\": \"ターメリック\", \"explanation\": \"黄色い粉末で、カレーのベースとなるスパイス。独特の風味と色合いを与えます。抗炎症作用も期待できます。\"}, {\"spice_name\": \"コリアンダー\", \"explanation\": \"独特の香りと苦味を持つスパイス。カレーに深みと複雑さを加えます。消化促進作用も期待できます。\"}, {\"spice_name\": \"クミン\", \"explanation\": \"ナッツのような風味を持つスパイス。カレーに暖かさと香ばしさを加えます。消化促進作用も期待できます。\"}, {\"spice_name\": \"チリペッパー\", \"explanation\": \"辛味を加えるスパイス。種類によって辛さの度合いが異なります。食欲増進作用も期待できます。\"}, {\"spice_name\": \"ガラムマサラ\", \"explanation\": \"複数のスパイスをブレンドしたものです。カレーに複雑な風味と香りを加えます。一般的に、カレー粉にはガラムマサラが含まれています。\"}]\n" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "safetyRatings": [ { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HATE_SPEECH", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HARASSMENT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "probability": "NEGLIGIBLE" } ] } ], "usageMetadata": { "promptTokenCount": 50, "candidatesTokenCount": 216, "totalTokenCount": 266 } }
JSONスキーマの部分を整形すると、以下のようになります。
指定した通りの形式で出力されていますね。
[ { "spice_name": "ターメリック", "explanation": "黄色い粉末で、カレーのベースとなるスパイス。独特の風味と色合いを与えます。抗炎症作用も期待できます。" }, { "spice_name": "コリアンダー", "explanation": "独特の香りと苦味を持つスパイス。カレーに深みと複雑さを加えます。消化促進作用も期待できます。" }, { "spice_name": "クミン", "explanation": "ナッツのような風味を持つスパイス。カレーに暖かさと香ばしさを加えます。消化促進作用も期待できます。" }, { "spice_name": "チリペッパー", "explanation": "辛味を加えるスパイス。種類によって辛さの度合いが異なります。食欲増進作用も期待できます。" }, { "spice_name": "ガラムマサラ", "explanation": "複数のスパイスをブレンドしたものです。カレーに複雑な風味と香りを加えます。一般的に、カレー粉にはガラムマサラが含まれています。" } ]
触ってみた所感
- 思ったよりも簡単に使える
- GPT-4oと同じくらい回答速度が速い(体感)
- ChatGPTと同じ感覚でプロンプト作ると、思ったような回答が得られなかったりするので、使いこなすには慣れが必要かもしれない
- レスポンスの形式をJSON形式で指定できるのは、プログラム上で扱う際にとても便利そう
まとめ
というわけで、GoogleのGemini APIを触ってみました。 今回はcurlコマンドでAPIを叩いてみましたが、様々な言語のライブラリも公開されているので、そのうちGemini APIを使ったアプリを作ってみたいですね。
2025年2月追記: 代表的なモデルの性能比較の記事を書いたので、興味ある方はぜひ読んでみてください。 toranoana-lab.hatenablog.com
採用情報
虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp