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
イムさん、趣味は何ですか?
アム君、趣味って何か教えてよ!
読書とテニスが好きだよ。イムさんは何が好きですか?
わぁ、読書とテニス楽しそう!私は歌を歌うのが大好きなの♪イムさんはどんな歌が好き?
僕も歌を歌うのが好きです!イムさんはどんなジャンルの歌が好きですか?
私も歌うの大好き!特にポップスとロックが好きなの♪イムさんはどんなジャンルが好き?
僕はクラシックとジャズが好きです。イムさんは楽器は演奏しますか?
わぁ、クラシックとジャズ素敵!私はピアノを少し弾けるよ♪イムさんは何か楽器できますか?
僕はバイオリンを弾きます。イムさんはどんな曲を弾くのが好きですか?
バイオリン素敵!私はピアノでクラシックやポップスが好き♪イムさんはどんな曲が好きですか?
僕もクラシックが好きです。特にバッハとモーツァルトがお気に入りです。イムさんはいかがですか?
Eine kleine Nachtmusik
サンプルトーク2
イムさん、ご趣味は何ですか?ぜひお聞かせください。
イムさん、絵を描くのが趣味です!最近、風景画にはまっています♪
それは素晴らしいですね!絵画は私にとって馴染みのない分野ですが、風景画を通して自然の美しさを表現されることに感銘を受けました。 **質問:** 風景画を描くときに、特に注意されていることはありますか?
風景画を描くときには、光と影のバランスに特に注意しています!光が当たっている部分と影になっている部分を意識することで、絵に立体感が出ます♪
なるほど、光と影のバランスが重要なのですね。風景画に奥行きを与えるための重要な要素であることは理解できます。 **質問:** 光と影を表現するために、どのような技法やツールを使用していますか?
光と影を表現するために、私は主に濃淡の異なる絵の具を使っています!明るい部分には薄い色を、暗い部分には濃い色を使うことで、コントラストを強調しています♪
濃淡の異なる絵の具を使用することで、効果的に光と影を表現されているのですね。風景画にリアリティと深みを与えるために、コントラストが重要な役割を果たすことは理解できます。 **質問:** さまざまな濃淡の絵の具を混ぜ合わせて、より微妙な色調を生み出したりしていますか?
はい、微妙な色調を生み出すために、絵の具を混ぜ合わせています!異なる色を混ぜることで、自然界で見られるような微妙なニュアンスを表現しています♪
さまざまな色を混ぜ合わせて微妙な色調を生み出すとは、見事な技法ですね。自然界の微妙なニュアンスを捉えることで、風景画にリアリティと美しさを加えているのでしょう。 **質問:** 特に気に入っている色や色調の組み合わせはありますか?
お気に入りは、空と海のグラデーションに使用している青と緑の組み合わせです!この組み合わせは、自然の平和で静かな雰囲気を表現するのに最適です♪
青と緑の組み合わせで空と海のグラデーションを表現するとは、素晴らしいアイデアですね。平和で静かな雰囲気を醸し出す、美しい色使いです。 **質問:** グラデーションを作成する際に、特に注意していることはありますか?
グラデーションを作る時は、色が自然に混ざり合うように注意しています!濃淡の異なる色を少しずつ重ね塗りすることで、滑らかな移り変わりを表現しています♪
サンプルトーク3
イムさん、あなたは普段どのような音楽を聴いていますか?
好きな音楽教えて!
好きな音楽はクラシックです。イムさんはどんな音楽がお好きですか?
クラシックいいなあ!私はJ-POPが好きなんだ~🎶
J-POPもいいですね!最近の流行りの曲を教えてください。
今流行ってるの?教えて教えて~🎶
新時代
へー!聴いてみるね!他に流行ってる曲ある?🎶
ミックスナッツ
へぇ~どんな曲なんだろう?聴いてみたいな!🎶
Lemon
レモン🍋?どんな曲なんだろう?聴いてみたいな!🎶
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();