はじめに
近年、ChatGPTやGoogle Geminiなど、さまざまなAIが急速に私たちの日常生活に浸透しています。これらのAIは、大規模言語モデル(large language model:LLM)と呼ばれます。この記事を読んでいる皆さんの多くも、一度は各プラットフォームが提供するウェブサービスを通じて使ってみたことがあるでしょう。中には、積極的に日常で活用している方もいるかもしれません。
さて、このようなLLMを利用した多くのサービスには、Web APIが提供されています。Web APIとは、外部のプログラムがインターネット経由でアクセスできるインターフェースのことです。単に人間を相手にして「質問と回答をやりとりする」だけでなく、一度機械が解釈することを前提に設計されています。
たとえば「友達のようにキャラクターと会話できるアプリケーション」といった、ユニークなソフトウェアも世の中には存在します。この場合は例えば、Geminiとユーザの間にソフトウェアが介在するわけですが、そのソフトウェアはGemini APIを通じて、Geminiに質問を投げかけ、回答を受け取ります。つまり、Gemini APIは、Geminiとユーザの間に介在するソフトウェアのために、Geminiにアクセスするためのインターフェースを提供しているわけです。
今回は、
- Google Geminiを例に、AIのWeb APIを実際に使ってみる
- Pythonの著名なライブラリであるFastAPIを使って、自作のAIのWeb APIを作ってみる
という2つのアプローチを通して、Web APIへの理解を深め、Pythonではそれとどのように連携することができるのか、一緒に見ていきましょう。
Gemini APIに実際にアクセスしてみる
まずは、実際にGemini AIのAPIにアクセスしましょう。
Google AI StudioでAPIキーを取得する
Gemini AIのAPIにアクセスするにはAPIキーが必要です。APIキーは以下の手順で取得します。
- Google AI Studioにアクセスする
- Get API Keyをクリックする

- APIキーを作成し、出てきたモーダルのAPIキーをコピーする

ここで得たキーは、取り扱いに注意してください。
実際にリクエストしてみる
curlは、主にHTTPリクエストを送信するコマンドラインツールです。Web APIはWebというほどですから、当然HTTPを利用してアクセスします。HTTPはもちろんウェブブラウザを利用して接続することも可能ですが、今回の動作確認では、ウェブブラウザよりも都合が良いため、curlを利用してみましょう。
- Windowsの場合はコマンドプロンプトやPowerShell、Macの場合はターミナルを起動する
- 以下のコマンドを入力する(ただし、{}の中に当てはまる言葉は適宜変更してください)
$ curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent" \ -H 'Content-Type: application/json' \ -H 'X-goog-api-key: {先ほどコピーした API キー}' \ -X POST \ -d '{ "contents": [ { "parts": [ { "text": "{広島の観光名所を挙げてみて}" } ] } ] }'
すると、数秒待てば、以下のような返答が得られます。
{ "candidates": [ { "content": { "parts": [ { "text": "広島には魅力的な観光名所がたくさんありますね!いくつかご紹介します。\n\n**歴史・文化**\n\n**平和記念公園・広島平和記念資料館:** 言わずと知れた、広島の象徴的な場所。原爆の悲劇を伝えるとともに、平和への願いを発信する場所です。\n**原爆ドーム:** 原爆の惨禍を伝える遺構。世界遺産にも登録されています。\n**広島城:** 別名「鯉城」とも呼ばれる美しい城。再建された天守閣からは広島市内を一望できます。\n ...(続く)
このような形式のテキストに見覚えがないでしょうか? そうです。普段はウェブアプリで見るようなテキストの内容が、ターミナル上に返ってきたJSONらしきデータの中に埋め込まれています。このように、Google Gemini APIは、APIキーによってGeminiを使う権限があるユーザかどうかを識別し、送られてきたプロンプトを解し、その答えをプログラムが参照しやすい形で返してくれるのです。これは、Web APIの一種です。
さらに、Gemini APIからの方が利用しやすい機能として、roleという概念があります。roles
とはその名の通り、「役割」を意味します。例えば、広島に住んで20年の寿司職人などのような文字列をうまく与えると、それに即した回答を返してくれます。AIのロールプレイングと言い換えてもいいでしょう。
例えば、以下は「広島の美味しいご飯屋さんを教えてください。ただし、テキストで返してください」という質問を、以下の役割たちに従って問うた結果です。
役割「広島市の観光案内所のコンシェルジュ」
「はい、承知いたしました。広島には美味しいお店がたくさんありますよ!まず、広島といえばやはりお好み焼きは外せませんね。市内には数えきれないほどのお店がありますが、地元の人に愛されているお店として「みっちゃん総本店」や「八昌」などが有名です。それぞれのお店で焼き方や味が異なるので、食べ比べてみるのも楽しいかもしれません。お好み焼き以外にも、広島の瀬戸内海で獲れた新鮮な魚介を使った料理もおすすめです。...(続く)...」
役割「広島出身の政治家」
「広島には美味しいお店がたくさんありますね!例えば、広島風お好み焼きを食べるなら、「みっちゃん総本店」は外せません。創業から変わらない味を守り続けていて、地元の人にも観光客にも愛されています。行列ができることもありますが、並んで食べる価値ありです。新鮮な牡蠣を堪能したいなら、「かなわ」がおすすめです。瀬戸内海で育った牡蠣は濃厚でクリーミー。生牡蠣はもちろん、焼き牡蠣や牡蠣フライなど、様々な調理法で楽しめます。少し贅沢な気分を味わいたいなら、「日本料理 喜多丘」はいかがでしょう。...(続く)...」
役割「広島の下町を知り尽くしている地元の通の人」
「ほい、きたきた!広島の美味いもんね、任せときんさい!どこに行きたいかによって、おすすめはガラッと変わるけぇね。まず、「広島焼き」じゃなくて「お好み焼き」ね!本場の味を体験したいなら、老舗の「みっちゃん総本店」は外せんよ。カープファンなら「カープ」ってお店もあるし、鉄板の上でアツアツを頬張るのが最高じゃ。ちょっと贅沢したいなら、瀬戸内海の新鮮な魚介料理がええね。...(続く)...」
内容も気になりますが、その口調や紹介する店、紹介の仕方を見てみてください。特に「広島の下町を知り尽くしている地元の通の人」がわかりやすいように、話し方や表現がぐっと砕けているのが分かるでしょう。このように、同じ質問であっても「どの視点から答えるのか」をシステム側に指定できる、ということを示しました。他にも、APIからアクセスできる概念としてtemperature
などがあります。詳しくはドキュメントを参照してください。