告解『GPTとPaLM 2で"しりとり"をしてもらい、地獄絵図を作ったことについて』
生成AIという人類の高尚な英知を用いて、無駄かつ凄惨な結果を招いたことに対して、罪の告解をこのnoteに記したい。
GPT(gpt-35-turbo 0613)とPaLM 2(chat-bison-32k)で「しりとり」をしてもらう。
誰が得をする内容だろうか?
しかし、損得勘定を抜きにして、私は見てみたかった。
AI同士が織りなす対話を。そして対決を。
待っているのは、ただの地獄絵図だと知らずに。
AIとAIの会話が見たい
始まりは「AI同時による会話が見たい」という小さな好奇心だった。
実は以前検証をしたことがある。
テーマを「AIと人類の共存」とし、批判的な考察を述べ合う設定(コンテキストを設定)にしてみたが、AIモデルの真摯さが勝り、お互いの意見を尊重しつづけ、同じ内容が繰り返される内容にとどまってしまった。
もっと刺激的な会話が見たい、その欲求は沸々と燃え上っていった。
ではゲームではどうだろう?
AI同士にゲームをしてもらう。
これを実現するには「どのようなゲームにするか」選択が重要だ。
オセロやチェスといったゲームは実装するにはかなりハードルが高い。
そして何より生成されるテキストに私は一番の興味をもっている。
となると必然的に手軽な言葉遊びが妥当だ。
今回は古来の遊びである「しりとり( Word chain game )」を採用することにした。
人類の英知へ貢献できていないことの懺悔
AI同士にしりとりをさせると言う事は、全く人類の英知には貢献しない。
ただの興味本位の実験だ。
OpenAIのOpen Interpreterを始め、画期的で素晴らしい技術が次々と生まれてくる中、これほどまでにくだらない使い方をする。
これは罪深いことだろう。
しかし賽は投げられた。まずは作る。私の決意は揺るがないものとなる。
しりとりに協力してもらった生成AIモデル
今回採用したAIモデルは
Azure OpenAI GPT(gpt-35-turbo 0613)
Google Cloud Platform PaLM 2(chat-bison-32k)
賢さに定評があるモデルであると同時に、Pay-as-you-go(従量課金制)で使える、お財布に優しい、ありがたい存在だ。
実現に向けたルールの設計
しりとりを実現するにあたり、順守しなければならないルールは、
下記の3点だ。
“ん”で終わらないこと
相手の出力した単語の最後の文字から開始する単語を出力こと
そして同じ単語は出力しないこと
特に「同じ単語は出力しないこと」は設計が難しい。
出力をひらがな・カタカナに限定しても「りんご」と「リンゴ」の区別はどうつけるのか、これには、ひらがなかカタカナで統一された配列を用意し、配列の中に重複がないか、チェックするプロセスが必要になる。
まずはモックだ。簡単にPythonで作って見ることにした。(もちろんChatGPTの力を沢山借りていることは言うまでもない)
Pythonによるモック
機能を実装するにあたり、Power Fx式はExcelのように式を書くことができるメリットがある。反対に、この内容が私の中で、「クリティカルな式が思い浮かんでこない」というデメリットになったりする。
経験値の問題もあるだろう。
文章の作成と同じで、本質を突いた短い文章を作るよりは、要素をダラダラ詰めた長い文章が書くほうが簡単であることと同じ構造だ。
まずはブレストでモックを作って見るとしよう。
こちらはPySimpleGUIで作ったデモだ。
Microsoftが提供しているサンプルコードを、PySimpleGUIに載せればいい単純な仕様になる。
不完全な仕様になっているが、興味のある方はGitHubを見てほしい。
複数のライブラリを試したが、殺風景であることは否めない。
単にしりとりを見つめるといったような流れも、あまり面白くない。
Pythonで作ったこの画面も退屈なものだ。
そうなると何が面白くなるスパイスだろう。そこで画像生成AIの登場だ。
画像生成AIのDALL-EがAPI経由で利用できる。
画像生成が気軽に実装できる素晴らしい機能だ。
Text to Imageになるが、日本語をプロンプトにしてもあまりうまくいかないと言うことが報告されている。
APIの結果で返される値は、画像参照先のURLだ。
URL参照で画像を表現する、
これはPower Appsのメディアコントロールがカバーしているので、やはりPower Appsで実装することは素晴らしくやり易い。
Power Automateで内部的に「ゴッホが描いた{Output}」としてPromptを作成
そしてPromptを日本語を英語に翻訳
翻訳した文字列をAPIに渡す
戻り値のURLをメディアコントロールに設定する。
こうして実装は進んでいく。
Power AppsとPower Automate
先に断わっておこう。
今回私が作成したPower AppsとPower Automateは、お粗末なところだらけだ。
「会話の履歴」を、配列でPower Automateに渡すと部分は、強引にテキストを加工し、平文のJSONに整え、Power Automateが良い具合に解釈してくれることに委ねた。
言ってしまえば「クソフロー」だ。
システム任せの最悪な作りと言えるだろう。
Power Appsも美しいコード(Power Fx)は全く採用できていない。
驚愕するほどお粗末な内容になっている。
しかしながら、「会話の履歴を蓄積しながら、送信する」と言う方法については、今の私にはこの方法しか思いつかなかった。
ルール違反対策
「しりとりのルールに違反している orしていない」といった判定は、
Power Appsの関数の機能で実現している。
AIがミスをしてしまう事は織り込み済みだ。ミス対策は作り込んでいない。私は見たいのは「素のAIの対話」だ。完璧な回答ではない。
ひとまず会話を50回実施してもらう。AIのポテンシャルに委ねてみたい。
それが一興というものだろう。下手な制限は創造性を奪う。
横やりを入れるほうが無粋というものだ。
ムリヤリ実装する繰り返し処理
また「会話を繰り返し実現する」という部分については、ForAll関数というPower Appsの繰り返し処理を採用したいと考えた。
しかし、ForAll関数の中で変数の設定はできない。
関数が使えないと、文字列の加工は、さらなるクソコード、地獄絵図と化す。
Toggleボタンを設定し、OnChangeで起動する処理を、既定の数値(50以下) まで繰り返す。
Set(bool,!bool)のような循環参照形式で繰り返しを実現する強引な方法をとった。
OnChangeの値の概要 - クソコードなので割愛しつつ
Set(Cnt,Cnt + 1);
// PROMPT加工
// GPT格納
// ルール違反判定
Collect(コレクション,
{
role:boolean型でGPTかPaLM2か判定,
text:結果の文字列,
word:結果の文字列(ひらがな)
}
);
// PaLM2 PROMPT加工
// PaLM2格納
// ルール違反判定
Collect(コレクション,
{
role:boolean型でGPTかPaLM2か判定,
text:結果の文字列,
word:結果の文字列(ひらがな)
}
);
// DALL-E実施
// Concurrentで多少の作業高速化
Concurrent(
Set(DALL1,'DALL-EのPowerAutomate'.Run(gptの結果).result),
Set(DALL2,'DALL-EのPowerAutomate'.Run(palm2の結果).result)
);
// 一応保存
Collect(colDALL,
{
gpt:DALL1,
palm:DALL2
}
);
// boolはToggleのDefault
// この方法でOnChange Methodが再起動する
If(Cnt <= 50,Set(bool,!bool));
美しいコードとは離れてしまうが、繰り返し処理としては有効な油断なので、テクニックとして記しておこう。せめてもの罪滅ぼしだ。
泣きたくなるようなひどい仕様、こんな雑な事はするべきではないことは言うまでもない。しかしどうしても興味が勝る。
今すぐに見てみたい、その欲に私は勝てなかった。
実験 AI同士のしりとり
前置きが長くなってしまった。実験を開始してみよう。
最初の文字列に「りんご」を投げる。
やはりしりとりの始まり、
いや人類の始まりや発展に寄与し続けている「りんご(Apple)」はこの場にふさわしい。
さて、実験はどうなるだろうか。
結果
今回のアプリの実践については、Power Automateを使用した「しりとり」の実現になる。厳密な設定はしていない。
ほぼAIのポテンシャルに委ねている。
実行時間が長いので、結果を5倍速で公開しよう。
まるで成立していない。ただの地獄絵図だ。
AIのゲシュタルト崩壊や学習モデルに悪影響を及ぼしていないか心配に感じる。
データで見る結果
まずは表形式でありのままを見せよう。
画像を全て貼り付けする。見づらいがご了承いただきたい。
次に集計結果を見てみよう。
※普段はセル結合しないが、見やすさを意識し、セル結合を採用している。
圧倒的な「リンゴ」と「ゴリラ」
まず「リンゴ」と「ごりら」の登場回数がダントツで多い。
しりとりと言えば「リンゴ」と「ごりら」を言ってしまうのは、確かにそうだ。
だがしかし、「ン」で終わる「ラーメン」が何度も登場するのは何故なのか。
「リンゴ🍎」 > 「ごりら🦍」 > 「ラーメン🍜」
だけではない。脈絡が無くても「ラーメン🍜」
もはやこれはシャットダウンのショートカットにも感じてしまう。
途中からの人格崩壊
履歴から見えてくるように、途中からAIモデルも何を言っているのかルールが、サッパリわからなくなってきている。前提の崩壊だ。
彼らの感覚を崩壊させてしまった罪を感じざるを得ない。
謎の「サラダ○○」や「フロート○○」が新ルールを生み出したAIの苦肉の策を感じさせてくれる。
しかしながらルールには沿っていないのだ。Systemに渡されたコンテキストから外れるため、ジレンマの中で揺れ動く様子が非常に見受けられる。
彼らの中で辻褄が合わなくなってしまったのだ・・。
Power Appsの画面も意味が分からなくなってしまった
DALL-Eの作品
せっかくなので、画像生成AIで作った画像も見直そう。
API Errorで生成されなかったテキストもあるので、数は合わない。
私の感想は、ひたすら並ぶ「ごりら🦍」の絵だ。
あとあまり美味しくなさそうな「ラーメン」の絵が並ぶ。
これは果たして絵なのだろうか?
ゴッホという偉大なコトバから連想されるのは、やはり「ひまわり」なのだろう。渡されていないテキストから「ひまわり」が映り込むことにその趣きを感じざるを得ない。
appendix
DALL-Eの出力URLからPythonで出力する方法をここに載せておく。
import requests
import os
# get requestを送り、ファイルを書き出す方法
def save_image_from_url(url, save_path):
response = requests.get(url, stream=True)
response.raise_for_status()
with open(save_path, 'wb') as file:
for chunk in response.iter_content(chunk_size=8192):
file.write(chunk)
filename = "FileName.png"
save_path = os.path.join("FolderName", filename)
print(f"Image saved to {save_path}")
今回の結果は、罪の意識を抱きながらも大切なデータとしてテーブルデータと画像は全てpng形式で保存している。
ちなみにDALL-Eの画像はブログストレージに1度的に格納されるので、Pythonでリクエストを送信し、ローカルに保存をする方法をとった。
Power Automateでも出来ると思うが、非常にrequestに時間がかかるため、今回はコードを採用した。
90枚の画像を生成したため、料金は500円かかっている。
果てしない技術の発展に対して、
今回Power Appsでこの機能を実現し、任務を果たしてくれたGPT(gpt-35-turbo 0613)、そしてPaLM 2(chat-bison-32k)のモデルに対して感謝を表明したいと思う。
そしてこんなくだらないことに付き合わせてしてしまったことに対し、懺悔の気持ちを抱いている。
AIの使い方をより深く理解していれば、
また厳密な単語の処理と言うものを実装していけば、
もっと精密な「しりとり」を成立させられるのだろう。
今回の結果は、「AIの創造性」に全てを委ねた結果だ。
結果として残ったのは「リンゴ」と「ゴリラ」と「ラーメン」の大量の画像。
AIが混乱する様子を残した記録だけだった。
作者として一言言わせてもらおう。
GPT、そしてPaLM 2。君たちは面白くなりすぎた。
この記事が気に入ったらサポートをしてみませんか?