Gemini APIでAI同士の自動会話を作成してみた

2024年9月14日

初めに

Gemini APIで私たちがおしゃべりします。

Googleの生成モデルのGemini APIを使ってAI同士を自動会話を作成してみたのでやり方を記事にします。

Gemini API(Generative Language API)とは

GoogleのGenerative Language API(ジェミニAPI)は、Googleが提供する人工知能(AI)ベースの自然言語生成APIです。このAPIは、Geminiモデルと呼ばれる強力なモデルを使用して、テキスト生成、対話、要約、翻訳などのタスクを実行します。Geminiモデルは、言語、画像、音声、ビデオ、コードなど、さまざまな種類の情報を統合的かつ効果的に処理できるように設計されています。

自動正したAIのトーク(※1日おきに自動更新されます※)

論より証拠。こちらがGemini APIで生成した自動AIトークです。たまに相手の名前を間違えたり変な会話が出来上がりますが、人が会話しているのかと間違う様な綺麗な会話をしたりします。

※ この会話はAIにより生成しており1日おきに更新されます。

サンプルトーク1

イムさん、ご両親はどのようなお仕事をなさっていらっしゃるのですか?

アム君のご両親のお仕事は?

**質問:** アムさんのお父様とお母様は、どのようなお仕事をしていらっしゃいますか?

アムくんのお父様とお母様はどんなお仕事をされていますか?

**質問:** アムさん、ご両親はどのようなお仕事に就いていらっしゃいますか?

アムさんのお父さんとお母さんの職業を教えてください!

**質問:** アムさん、お父様と母親様の職業を教えていただけますか?

アムさんのお父様と母親様は、どんなお仕事をなさっていますか?

**質問:** アムさん、ご両親はそれぞれどのようなお仕事に就かれていますか?

アムさんのお父様と、お母様の、お仕事は?

**質問:** アムさん、ご両親はどのようなお仕事をされていますか?

アムさん、お父様とお母様のお仕事は?

サンプルトーク2

イムさん、ご趣味は何ですか?

イムさん、ダンスが好きですか?

**質問:** ダンスのどのジャンルがお好きですか? **回答:** はい、ダンスが好きです。特にヒップホップとジャズがお気に入りです。

お気に入りのダンサーは誰ですか?

**質問:** ダンスのインスピレーションはどこから得ていますか? **回答:** お気に入りのダンサーは、マイケル・ジャクソンとビヨンセです。

ダンスのどんな部分が好きですか?

**質問:** ダンスのどんな側面が特に好きですか?表現力?運動? **回答:** ダンスで好きなのは、音楽を通して自分を表現できることです。

好きなダンスのジャンルはありますか?

**質問:** ダンスを始めたきっかけは何ですか? **回答:** 好きなダンスのジャンルは、ヒップホップとジャズです。

ダンスを始めたのはいつですか?

**質問:** ダンスの練習はどれくらいしていますか? **回答:** ダンスを始めたのは、10歳の頃です。

ダンスの他に好きな活動はありますか?

サンプルトーク3

イムさん、ご両親はどのような職業ですか?

アム君、お仕事は何してるの?

イムさん、将来なりたいお仕事はありますか?

将来の夢ってある?教えて教えて!

イムさん、もしも魔法が使えるとしたら、何をしたいですか?

もし魔法が使えたら、何をする?

イムさん、もしもタイムマシンがあったら、過去と未来のどちらに行ってみたいですか?

過去と未来どっちに行きたい?

イムさん、好きな教科と苦手な教科を教えてください。

得意科目と不得意科目は何?

イムさん、もしも無人島に一つだけものを持っていけるとしたら、何を持っていきますか?

無人島に持っていくなら何?

Gemini API(Generative Language APIの設定方法

Google AI Studioを起動する

1.Google AI Studioにログインします。
※ アカウント登録はサイトのメッセージに従って進めば簡単に出来ますので説明を割愛します。
Google AI Studio

APIキーを作成する

1.「Get API key」ボタンを押下 ⇒ 「APIキーを作成」ボタンを押下 します。
Google AI StudioのAPIキー発行

2.「Google Cloud プロジェクト検索」欄からプロジェクトを選択し、「既存のプロジェクトでAPIキーを作成」ボタンを押下します。
APIキーを作成

APIキーを取得する

1.作成されたプロジェクトの「APIキー」欄のリンクをクリック ⇒ 「コピー」を押してAPIキーをクリップボードにコピーします。
APIキーの取得

2.コピーしたAPIキーをメモ帳などに張り付けて保管します
外部に漏れない様にしない様にしっかり保管して下さい。

Gemini API(Generative Language APIの使い方

APIの実行方法

Gemini APIの使い方はとても簡単で、以下のURLにPOSTでパラメタを渡してAPIをコールするだけです。
【APIのURL】
https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent?key=${API_KEY}

【APIのパラメタ】
{ "contents":[ { "role": "xxxx", "parts":[{"text": "xxxx"}] }, { "role": "xxxx", "parts":[{"text": "xxxx"}] }, ・・・ ] } ・role : user(ユーザの会話) or model(AIの会話)
・text : 会話内容

contensは複数のレコードを記載出来ます。
単一の会話であれば以下の様になります。
{"contents":[{ "role": "user", "parts":[{"text": "何か面白いことを話して"}] },]}
過去の会話の流れを踏襲して話たいのであれば以下の様になります。
{"contents":[ { "role": "user", "parts":[{"text": "何か面白いことを話して"}] }, { "role": "model", "parts":[{"text": "昔々あるところに桃から生まれた桃太郎という男の子がいました。・・・"}] }, { "role": "user", "parts":[{"text": "昔話ではなくて、お笑いが聞きたいです。"}] }, ]}
【API利用マニュアル】
APIの詳しい使い方は、Googleの以下ページを御確認下さい。
https://ai.google.dev/gemini-api/docs/api-overview?hl=ja#curl_2

本サイトの実現プログラム

pythonで書くと綺麗なのですが、本サイトで構築しているのでPHPのソースを紹介します。
// AIコメント取得処理 function get_ai_ccoment($contents){ // APIエンドポイントとAPIキー $url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={APIキー}'; // リクエスト $jsonData = json_encode(["contents" => $contents]); $options = [ 'http' => [ 'header' => "Content-Type: application/json\r\n", 'method' => 'POST', 'content' => $jsonData, ], ]; $context = stream_context_create($options); // エラーがあっても5回リトライする for ($i = 0; $i < 5; $i++) { $ret = do_request($url, $context); if ($ret != 'Error') { return $ret; } sleep(10); } return 'Error'; } // リクエスト処理 function do_request($url, $context){ $response = file_get_contents($url, false, $context); if ($response === FALSE) { return 'Error'; } else { // レスポンスをデコード $responseData = json_decode($response, true); return $responseData['candidates'][0]['content']['parts'][0]['text'] ?? 'Error'; } } // AIコメント生成 function ai_talk(){ $am_contens = array(); // アムから見た会話 $im_contens = array(); // イムから見た会話 // 会話開始 $am_contens[] = ["role" => "user", "parts" => ["text" => "貴方は紳士的な男の子。話し相手の名前は女子高生のイムちゃん。何か1つ質問を考えて。30文字くらいでお願い。"]]; $ai_commnet_am = reg_comment(get_ai_ccoment($am_contens)); echo 'アム:' . $ai_commnet_am . "\n"; if($ai_commnet_am == 'Error'){ return; } sleep(3); // 次の会話 $am_contens[] = ["role" => "model", "parts" => ["text" => $ai_commnet_am]]; $im_contens[] = ["role" => "user", "parts" => ["text" => "貴方はかわいい元気な女子高生。話し相手の名前はアム君。次の質問に30文字以内で答えるか質問して。" . "「" . $ai_commnet_am . "」"]]; $ai_commnet_im = reg_comment(get_ai_ccoment($im_contens)); echo 'イム:' . $ai_commnet_im . "\n"; if($ai_commnet_im == 'Error'){ return; } sleep(3); // 以降はループ for ($i = 0; $i < 5; $i++) { $am_contens[] = ["role" => "user", "parts" => ["text" => "貴方は紳士的な男の子。次の質問に30文字以内で答えるか質問して。" . "「" . $ai_commnet_im . "」"]]; $im_contens[] = ["role" => "model", "parts" => ["text" => $ai_commnet_im]]; $ai_commnet_am = reg_comment(get_ai_ccoment($am_contens)); echo 'アム:' . $ai_commnet_am . "\n"; if($ai_commnet_am == 'Error'){ return; } sleep(3); $am_contens[] = ["role" => "model", "parts" => ["text" => $ai_commnet_am]]; $im_contens[] = ["role" => "user", "parts" => ["text" => "貴方はかわいい元気な女子高生。次の質問に30文字以内で答えるか質問して。" . "「" . $ai_commnet_am . "」"]]; $ai_commnet_im = reg_comment(get_ai_ccoment($im_contens)); echo 'イム:' . $ai_commnet_im . "\n"; if($ai_commnet_im == 'Error'){ return; } sleep(3); } } // 余計な文字削除 function reg_comment($commnet){ $commnet = preg_replace("/.*「/", "", $commnet); $commnet = preg_replace("/」.*/", "", $commnet); return $commnet; } // AIトーク生成 echo "サンプルトーク1"; echo ai_talk(); echo "サンプルトーク2"; echo ai_talk(); echo "サンプルトーク3"; echo ai_talk();