ろぼいんブログ
更新:

GoogleのGemini APIの使い方

Google製の大規模言語モデル(LLM)のGeminiのAPIを使ってみたので、その使い方を紹介します。

Geminiとは

Geminiの公式サイトのスクリーンショット
Geminiの 公式サイト のスクリーンショット

Gemini は、Googleが開発した大規模言語モデル(LLM)です。ChatGPTのように、テキストで対話できるAIです。Google I/O 2023で 発表 され、12月7日に 公開 されました。

GeminiにはUltra、Pro、Nanoの3つのサイズがあり、もっとも小さいNanoではGoogle Pixel 8 Proで動作します。また、ProはGoogle Bardの英語版のモデルとして採用されており、APIとしても利用できます。

Ultraはデモ動画が公開されており、YouTubeで閲覧できます。ただし、このデモは ねつ造だった と報道されています。

Gemini APIの価格

Geminiの公式サイトの価格ページのスクリーンショット
Geminiの 公式サイト の価格ページスクリーンショット

Gemini APIは記事執筆時点では1分あたり60クエリーまで、入力・出力ともに無料です。

これを超えると、入力は1,000文字あたり$0.00025、出力は1,000文字あたり$0.0005です。また、画像も入力でき、1枚あたり$0.0025です。

ChatGPTやGPT-3.5、GPT-4などのOpenAIのAPIではトークン数に応じて課金されるのに対し、Gemini APIでは文字数に応じて課金されるのが特徴です。

英語では1トークン≒1単語ですが、日本語では1トークン≒1文字です。そのため、OpenAIのAPIでは英語の方が安くなる傾向がありますが、Gemini APIでは日本語の方が安くなると思われます。

また、無料版では入力したテキストがAIの学習に利用されますが、有料版では利用されません。

Geminiの使い方

APIキーの取得

まずは、 Geminiの公式サイト にアクセスし、[Get API key in Google AI Studio]をクリックします。

Geminiの公式サイトのスクリーンショット。中央に大きく「Build with Gemini」と書かれている

注意書きが表示されるので、よく読んで理解したらチェックボックスにチェックを入れて[Continue]をクリックします。3つのチェックボックスのうち、下の2つは必須ではありません。

注意書きのモーダルウィンドウが表示されているスクリーンショット

もし、APIを使うことが目的ではなく単にGeminiを試してみたいだけなら、中央の大きなテキストボックスにテキストを入力して[Run]をクリックすれば使えます。

APIとして使いたい場合は、左上から[Get API key]をクリックします。

Google AI Studioのスクリーンショット

新しくプロジェクトを作成してAPIキーを追加するか、既存のプロジェクトにAPIキーを追加するか尋ねられるので、どちらかを選択します。

APIキーの作成方法を尋ねる画面

APIキーが生成されるので、コピーしておきます。APIキーは他人に知られないように注意してください。

APIキーがモーダルウィンドウに表示されている

APIを使う

ここからは、取得したAPIキーで実際にAPIを使ってみます。

ここではJavaScript(Node.js)を使います。Pythonの場合は、公式の ノートブック が分かりやすいです。他のプログラミング言語を使う場合は、 公式チュートリアル を参考にしてみてください。

Node.jsでGemini APIを使うには、 Google AI JavaScript SDK をインストールします。

try{(()=>{function a(e){if(!e)return;let t=e.getAttribute("tabindex")!==null,n=e.scrollWidth>e.clientWidth;n&&!t?e.setAttribute("tabindex","0"):!n&&t&&e.removeAttribute("tabindex")}var u=window.requestIdleCallback||(e=>setTimeout(e,1)),i=window.cancelIdleCallback||clearTimeout;function l(e){let t=new Set,n,r;return new ResizeObserver(c=>{c.forEach(o=>t.add(o.target)),n&&clearTimeout(n),r&&i(r),n=setTimeout(()=>{r&&i(r),r=u(()=>{t.forEach(o=>e(o)),t.clear()})},250)})}function d(e,t){e.querySelectorAll?.(".expressive-code pre > code").forEach(n=>{let r=n.parentElement;r&&t.observe(r)})}var s=l(a);d(document,s);var b=new MutationObserver(e=>e.forEach(t=>t.addedNodes.forEach(n=>{d(n,s)})));b.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{d(document,s)});})();}catch(e){console.error("[EC] tabindex-js-module failed:",e)}try{(()=>{function i(o){let e=document.createElement("pre");Object.assign(e.style,{opacity:"0",pointerEvents:"none",position:"absolute",overflow:"hidden",left:"0",top:"0",width:"20px",height:"20px",webkitUserSelect:"auto",userSelect:"all"}),e.ariaHidden="true",e.textContent=o,document.body.appendChild(e);let a=document.createRange();a.selectNode(e);let n=getSelection();if(!n)return!1;n.removeAllRanges(),n.addRange(a);let r=!1;try{r=document.execCommand("copy")}finally{n.removeAllRanges(),document.body.removeChild(e)}return r}async function l(o){let e=o.currentTarget,a=e.dataset,n=!1,r=a.code.replace(/\u007f/g,` `);try{await navigator.clipboard.writeText(r),n=!0}catch{n=i(r)}if(!n||e.parentNode?.querySelector(".feedback"))return;let t=document.createElement("div");t.classList.add("feedback"),t.append(a.copied),e.before(t),t.offsetWidth,requestAnimationFrame(()=>t?.classList.add("show"));let c=()=>!t||t.classList.remove("show"),d=()=>{!t||parseFloat(getComputedStyle(t).opacity)>0||(t.remove(),t=void 0)};setTimeout(c,1500),setTimeout(d,2500),e.addEventListener("blur",c),t.addEventListener("transitioncancel",d),t.addEventListener("transitionend",d)}function s(o){o.querySelectorAll?.(".expressive-code .copy button").forEach(e=>e.addEventListener("click",l))}s(document);var u=new MutationObserver(o=>o.forEach(e=>e.addedNodes.forEach(a=>{s(a)})));u.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{s(document)});})();}catch(e){console.error("[EC] copy-js-module failed:",e)}
Terminal window
npm install @google/generative-ai

Gemini APIでは、テキストからテキストの生成と、マルチターンのチャットが用意されています。また、ここでは説明しませんが、テキストと画像からテキストの生成もできます。

テキストからテキストを生成するには、次のようにします。

index.js
const { GoogleGenerativeAI } = require("@google/generative-ai");
const API_KEY = "ここにAPIキーを入力";
const genAI = new GoogleGenerativeAI(API_KEY);
const run = async(prompt) => {
const model = genAI.getGenerativeModel({ model: "gemini-pro"});
const result = await model.generateContent(prompt);
const response = await result.response;
const text = response.text();
console.log(text);
}
run("魔法のリュックサックについての物語を書いてください。");

スクリプトを実行します。

Terminal window
node index.js

すると、次のようなテキストが出力されます。出力結果は実行するたびに変わります。

むかしむかし、あるところに魔法のリュックサックを持つ男の子がいました。リュックサックはどんなものでも詰め込むことができ、決して重くなりませんでした。男の子はリュックサックを学校に持っていき、本や文房具を詰めました。リュックサックは重くならず、男の子は一日中楽に持ち歩くことができました。
ある日、男の子は森を散歩していると、一匹の迷子の猫を見つけました。猫は寒そうで、お腹が空いているようでした。男の子は猫をリュックサックに入れ、家に連れて帰りました。リュックサックは重くならなかったので、男の子は猫を楽に持ち帰ることができました。
家に帰ると、男の子は猫にエサと水をあげました。猫は喜んで食べました。男の子は猫を毛布にくるみ、暖かくしてあげました。猫は毛布の中にもぐりこんで、すぐに寝入ってしまいました。
次の日、男の子は猫を森に連れて帰りました。猫は男の子に甘えて、なかなか離れませんでした。男の子は猫をなでて、「また会おうね」と声をかけました。そして、リュックサックに猫を入れて、家へと帰りました。
男の子は魔法のリュックサックのおかげで、猫を助けることができました。そして、猫は男の子の親友になりました。二人は毎日一緒に遊び、とても幸せに暮らしました。

次に、マルチターンのチャットを試してみます。

index.js
const { GoogleGenerativeAI } = require("@google/generative-ai");
const readline = require("readline");
const API_KEY = "ここにAPIキーを入力";
const genAI = new GoogleGenerativeAI(API_KEY);
const run = async (history, message) => {
const model = genAI.getGenerativeModel({ model: "gemini-pro" });
const chat = model.startChat({
history,
generationConfig: {
maxOutputTokens: 500,
},
});
const result = await chat.sendMessage(message);
const response = await result.response;
const text = response.text();
return text;
}
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const ask = async (question) => {
return new Promise((resolve) => {
rl.question(question, (answer) => {
resolve(answer);
});
});
};
const main = async () => {
const history = [];
while (true) {
const message = await ask("ユーザー:");
const response = await run(history, message);
console.log("モデル:" + response);
history.push(...[
{
role: "user",
parts: message,
},
{
role: "model",
parts: response,
},
])
}
};
main();

スクリプトを実行すると、コマンドラインに[ユーザー:]と表示されるので、そこにテキストを入力してEnterキーを押します。すると、[モデル:]と表示され、AIの返答が表示されます。

実際に試したところ、次のようになりました。

ユーザー:あなたは優秀なアシスタントです。簡潔で適切な応答を返してください。では、自己紹介してください。
モデル:私は、あなたのリクエストやタスクに対して、正確で有益な応答を生成できるよう設計された、高度な言語モデルです。
ユーザー:Node.jsを使って天気を取得する簡単なコードを書いてください。
モデル:
```javascript
const request = require('request');
// OpenWeatherMap API キーを取得する
const apiKey = process.env.OPENWEATHERMAP_API_KEY;
// 都市名を取得する
const city = process.argv[2];
// 天気を取得するためのリクエスト URL を構築する
const url = `http://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`;
// リクエストを送信する
request(url, (error, response, body) => {
// エラーが発生した場合はエラーメッセージを表示する
if (error) {
console.error(error);
return;
}
// ステータスコードが 200 以外の場合もエラーメッセージを表示する
if (response.statusCode !== 200) {
console.error(`Error: ${response.statusCode}`);
return;
}
// 天気情報を JSON としてパースする
const data = JSON.parse(body);
// 天気情報を出力する
console.log(`都市: ${data.name}`);
console.log(`天気: ${data.weather[0].description}`);
console.log(`気温: ${data.main.temp}`);
});
```

また、先ほどのコードは完全に応答が返ってくるまでテキストが表示されませんが、次のようにすると応答の途中経過が表示されます。

index.js
const { GoogleGenerativeAI } = require("@google/generative-ai");
const readline = require("readline");
const API_KEY = "ここにAPIキーを入力";
const genAI = new GoogleGenerativeAI(API_KEY);
const run = async (history, message) => {
const model = genAI.getGenerativeModel({ model: "gemini-pro" });
const chat = model.startChat({
history,
generationConfig: {
maxOutputTokens: 500,
},
});
const result = await chat.sendMessageStream(message);
return result;
}
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const ask = async (question) => {
return new Promise((resolve) => {
rl.question(question, (answer) => {
resolve(answer);
});
});
};
const main = async () => {
const history = [];
while (true) {
const message = await ask("ユーザー:");
const response = await run(history, message);
process.stdout.write("モデル:");
let responseText = '';
for await (const chunk of response.stream) {
const chunkText = chunk.text();
process.stdout.write(chunkText);
responseText += chunkText;
}
process.stdout.write("\n");
history.push(...[
{
role: "user",
parts: message,
},
{
role: "model",
parts: responseText,
},
])
}
};
main();

まとめ

GoogleのGemini APIの使い方を紹介しました。Gemini APIは無料でもかなり使えるので、ぜひ試してみてください。

おすすめアイテム

※このリンクを経由して商品を購入すると、当サイトの運営者が報酬を得ることがあります。詳細はこちら

このサイトを支援する

Buy Me a CoffeeまたはGitHub Sponsorsで支援していただけると、サイトの運営やコンテンツ制作の励みになります。定期的な支援と一度限りの支援がありますので、お間違いのないようにお願いします。

Buy me a coffee

著者のアイコン画像

生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。

Webフロントエンドプログラマーで、テクノロジーに関する話題を追いかけています。動画編集やプログラミングが趣味で、たまにデザインなどもやっています。主にTypeScriptを使用したWebフロントエンド開発を専門とし、便利で実用的なブラウザー拡張機能を作成しています。また、個人ブログを通じて、IT関連のニュースやハウツー、技術的なプログラミング情報を発信しています。

最新記事