Gemini APIでAI同士の自動会話を作成してみた
初めに
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トークです。たまに相手の名前を間違えたり変な会話が出来上がりますが、人が会話しているのかと間違う様な綺麗な会話をしたりします。
サンプルトーク1
イムさん、お時間があれば、ご趣味は何ですか?
アム君、趣味は何ですか?
**回答:** 読書と音楽鑑賞に夢中です。 **質問:** イムさん、好きな音楽のジャンルを教えてもらえますか?
好きな音楽のジャンルは?
**回答:** クラシックとジャズを好んで聴いています。 **質問:** イムさんにとって、音楽を聴くことの最大の喜びは何ですか?
音楽を聴く最大の喜びは?
**回答:** 日々の喧騒から離れて、自分の内面世界に浸れることです。 **質問:** イムさん、お好きな作曲家やミュージシャンはいますか?
好きな作曲家やミュージシャンは?
**回答:** モーツァルトとマイルス・デイビスの作品に魅了されています。 **質問:** イムさん、音楽を聴くときにどのような感情を味わいますか?
音楽を聴いた時の気持ちは?
**回答:** 音楽が心を安らげ、インスピレーションを与えてくれます。 **質問:** イムさんは、音楽が自分の生活にどのような影響を与えていると感じていますか?
音楽が生活に与える影響は?
サンプルトーク2
イムさん、最近何か新しい趣味を見つけたり、挑戦したいことはありますか?
アム君、最近何か新しい趣味見つけた?
アム君、最近何か新しい趣味見つけた?それとも何か挑戦したいことはある?
アム君、何か新しい趣味見つけた?挑戦したいことはある?
アム君、最近何か新しい趣味を見つけたのかい?それとも、挑戦したいことはある?
アム君、最近何かハマってることある?挑戦したいこととかある?
アム君、最近ハマっていることはあるかい?それとも、挑戦したいことはある?
アム君、最近ハマってることとかある?それとも、挑戦したいこととかある?
アム君、最近はまっていることはある?それとも、挑戦したいことはあるかい?
アム君、今一番ハマってることってある?挑戦したいこととかもある?
アム君、今一番ハマっていることはあるかい?それとも、挑戦したいことはある?
アム君、今一番ハマってることとかある?何か挑戦したいこととかも教えて!
サンプルトーク3
イムさん、最近何か夢中になっていることはありますか?
イムくん、最近ハマってることはある?
最近ハマっていることですか? 読書ですね。特にミステリー小説が好きで、最近はアガサ・クリスティの作品に夢中です。イムさんは何かハマっていることはありますか?
私も読書が好きだよ!今読んでる本は?
そして誰もいなくなった
私も読んだことある!犯人誰だったっけ?
執事のロジャーズ
えー!意外!私はメイドのミス・ブレントだと思った!
鋭い推理ですね。ミス・ブレントも怪しいと思っていましたが、ロジャーズの完璧なアリバイに騙されてしまいました。
さすがイムくん!私もミス・ブレント疑ってたけど、アリバイ崩せなかったもんね。
イムさんの推理力にも感心しています。ミス・ブレントのアリバイを崩せなかったのは、私の不注意でした。
いえいえ、そんなことないですよ!完璧なアリバイだったんですもん。
Gemini API(Generative Language APIの設定方法
Google AI Studioを起動する
1.Google AI Studioにログインします。※ アカウント登録はサイトのメッセージに従って進めば簡単に出来ますので説明を割愛します。
APIキーを作成する
1.「Get API key」ボタンを押下 ⇒ 「APIキーを作成」ボタンを押下 します。2.「Google Cloud プロジェクト検索」欄からプロジェクトを選択し、「既存のプロジェクトでAPIキーを作成」ボタンを押下します。
APIキーを取得する
1.作成されたプロジェクトの「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();