このページの本文へ

遠藤諭のプログラミング+日記 第161回

ChatGPTプロンプトプログラミング講座(6)

情報理論の父クロード・シャノンとChatGPTによる完全パングラムの生成

2023年08月14日 09時00分更新

文● 遠藤諭(角川アスキー総合研究所 主席研究員)

  • この記事をはてなブックマークに追加
  • 本文印刷

アルファベット26文字だけからなる文(完全パングラム)を作る

 ChatGPTが、いままでなかなか作ってくれなかったパングラム(アルファベット26文字をすべてを使った短い文)をどんどん作ってくれるようになったことを前回述べた。しかし、それは26文字を使っているが同じ文字が2回以上使われている。そこで、今回は《完全パングラム》と呼ばれるアルファベット26文字の各文字をちょうど1回だけ使った文を作ることを試みる。

 前回、私が与えたプロンプトは「アルファベット26文字をすべて使って短い文を作ってください」という簡単なものだった。これによって、ChatGPTがパングラムを作ったというだけで画期的な出来事だと書いたが、数個ポロポロと出してきただけである。この方法の延長線上では、完全パングラムに到達するのは容易なことではない。そこで、少しプロンプトを工夫してみることにする。

「プロンプト」をどうするか?―― few-shotプロンプトを応用しよう

 どのようにして、より容易にパングラムの問題を解けるようにするか? これに対する答えは、OpenAI公式の「GPT-4 Technical Report」でも推奨されていて、ChatGPTを仕事に生かしているような人たちには常識となっている「few-shotプロンプト」の応用といえるアプローチである。

 世の中には、パングラムをたくさん掲載しているサイトがいくつもある。たとえば、「List of pangrams」というサイトには、何十個ものパングラムと、今回、私が目標としている完全パングラムも7個紹介されている。GitHubの「huyhong/pangrams」にも、122個のパングラムが紹介されている。

 具体的に与えるプロンプトとしては、「アルファベット26文字を少なくとも1回ずつは使ってできるだけ短い文を作ってください」に続けて「以下にその例を示しますが同じものは除外します」と書き、そのあとに既知のパングラムをズラリと並べてやる(後ででてくる動画参照)。

 この作戦はOpenAIのいうとおり絶大な効果をもたらす。まずは「チャレンジングだけどやってみます」ときて、10個のパングラムをさらりと出してきた。わずか1年前には、パングラムといえば、ことば遊びやパズル好きな私のようなオヤジどもが、やっとこ苦労していくつか絞りだせるか? といったものだった。

求めたパングラムについて、日本語訳や文字数、文字の出現頻度を表示しているところ。

 それが、「これらの文は、異なる主題と構造を持ち、パングラムの多様性を示しています。何か他にお手伝いできることがあれば、お知らせください!」などといった余裕たっぷりの調子である。いまや、ChatGPTはパングラムの自動販売機みたいになっている。

 今回、私は、数十個のパングラムをChatGPTで求めたのだが、気にいったものを紹介しておこう。

■My exquisitely bad jokes vex grumpy French wizard."
「私の非常に悪い冗談が、不機嫌なフランスの魔法使いを困らせる」
※なんといっても「私の非常に悪い冗談」というのがいい。

■Jumpy hogs vex quick-witted zebra; they blink and frolic.
「飛び跳ねる豚たちが機敏なシマウマを困らせる;彼らは瞬きして戯れる」
※飛び跳ねる豚とはなんと愛らしいことか! しかも、瞬きして戯れる。

■Jazzy dwarves vex, fumbling quickly on pitch.
「ジャジーなドワーフたちが悩みながら早口で歌を詠唱する」
※音楽が聴こえてくるようだ=どんな?

■Bumpy frogs waltz, vexing sly jackdaw in the quiet haze.
「凸凹のカエルたちがワルツを踊り、静かなもやの中でずる賢いカササギを困らせる。」
※このまま画像生成ソフトに入れてみたくなる。

■Five big quacking zephyrs jolt my wax bed.
「5つの大きな鳴き声をあげる(擬人化された)西風が私のワックスベッドを揺さぶった」
※なんてドラマチックな! カワサキのゼファー乗ってました。

■Vexed nymphs quickly jump over the big wizard; zany frolics.
「悩ましいニンフたちは、大きな魔法使いを素早く飛び越える; おどけた戯れ」
※ニンフと魔法使いはパングラフの世界観にピッタリだ。
 

 ところで、ChatGPTで、この種の作業をやっている人なら「ChatGPTの出力ってデタラメなことも多いでしょう」と思われているはずだ。実際、そうなのだがこの点はどうするのか?

「検証」してもらう―― 7月から提供のCode Interpreterが絶大な威力を発揮

 ChatGPTが、とんでもないデタラメを平気で言うことがあるのはご存じのとおりだ(幻覚=ハルシネーションという)。実は、今回、私は「Code Interpreter」のオプションをオンにして行った。Code Interpreterとは、ChatGPT plus(20ドル/月)のユーザー向けに提供されたオプションである。

 その設定では、ChatGPTは、いちど出力してきたパングラムに対して「これらの文がパングラムであることを確認しましょう」と自ら申し出て、いちど表示したパングラムのうちどれが正しいパングラムであるかをリストアップしてきたのだ。

 実のところ、ChatGPTが「できました」とか「アルファベット26文字すべてが使われたパングラムです」といってきたときにできていないことも多い。Code Interpreterをオンにしておいても自主的に検証をしてくれるとも限らない(ここは人間以上に気まぐれである)。その場合は、さきほどのプロンプトに続けて「検証もしてください」と付け加えるとよい。実は、こうした検証作業すら間違うこともあるのだが、Code Interpreterでは、実行されるコードが見れるようになっているのでそれを確認するのが正しい使い方である。

情報理論の父 クロード・シャノンが50年以上前に作った完全パングラム

 プロンプトを工夫することで手応えを感じたわけだが、今回目指しているのは完全パングラム(アルファベット26文字の各文字をちょうど1度だけ使った文)である。これがどんなものか、少し触れておきたいと思う。

 1992年7月号の『月刊アスキー』の「ことば遊びコンピュータ」(本記事の文末参照)では、次の2つの完全パングラムを紹介している(前回紹介した『英語ことば遊び事典』からの引用)。

■Cwm fjord bank glyphs vext quiz.
「渓谷のフィヨルドの片側に刻まれた古代の碑文は変わり者を悩ませる。

■Zing, vext cwm fly jabs Kurd qoph.
「渓谷にまぎれ込んだハエが、ブンブンうなり声をあげ、クルド人の書いたヘブライ語のアルファベット19番目の文字をつついている」

 これらの文は、英語ネイティブの人でもすぐに解釈できるとは思えない。「cwm」は、両方のパングラムに登場するがウェールズ語の「渓谷」にルーツを持つ単語だそうだ。パングラムでは、ウェールズ語の単語がしばしば登場する。また、現代の英語でも略語が使われることがあり分かりにくさを増す結果になっている。

 とはいえ、調べてみると以下のようなパングラムが知られていることがわかる(前述の「List of pangrams」などによる)。

■Cwm fjord veg balks nth pyx quiz.
■Cwm fjord bank glyphs vext quiz.
■Jink cwm, zag veldt, fob qursh pyx.
■Junky qoph-flags vext crwd zimb.
■Squdgy fez, blank jimp crwth vox!
■Veldt jynx grimps waqf zho buck.
■Bortz waqf glyphs vex muck djin.
■Blowzy night-frumps vex'd Jack Q.
■J.Q. Schwartz flung D.V. Pike my box.
■Jump dogs, why vex Fritz Blank QC?
■Mr Jock, TV quiz PhD, bags few lynx.
■Zing, vext cwm fly jabs Kurd qoph.

 もはや何を言っているか分からないものばかりというのが正直なところだろう。パングラム(アルファベットのすべての文字を使う)においては、「The quick brown fox jumps over the lazy dog.」のような誰でも分かる不自然さのない文を作ることができた。しかし、完全パングラム(アルファベットのすべての文字を1度ずつ使う)となると、まるで話が違ってくるわけだ。

 そんな完全パングラムだが、作者の名前が付記されていることもある。それを見ていくと、「Squdgy fez, blank jimp crwth vox!」は、情報理論の父こと、Claude Shannon(クロード・シャノン)によるものだというのだ。

 我らがコンピューターの世界において、アラン・チューリング、ジョン・フォン・ノイマンと並ぶといえる最重要人物の1人。彼の業績がなかったら安全で安定したデータ通信が確保されるのはしばらくあとになったかもしれない。スマホで自撮りしてSNSにポストしたり、彼女にメールしたりできているのもシャノンのお世話になっている。

 それでは、このシャノンのパングラムはどんな意味なのか? ということで調べてみると、やっぱり「これどんな意味?」という話がでてきた。『ニューヨークタイムズ』1972年8月16日の「読者から編集者へ」のコーナーで、このパングラムが取り上げられていた。

ニューヨークタイムズの「Letters to the Editor」

 答えているDavid Kahnという人物は、ニューヨークタイムズ名物のクロスワードパズルの作者のようなのだが。シャノンのパングラムの意味は、次のようなものだと解説している。

 A man wearing a Turkish hat, or fez, of the squat and mashed, or squdgy style, is playing a crwth, or Welsh violin. The crwth's voice, or vox, too jimp, or skimpy, and he decides to blank, or mute it. He removes his headgear and addresses it: “Squdgy fez,” he commands, “blank jimp crwth vox.”

 ずんぐりしたfez(トルコ帽)をかぶった男が、crwth(ケルト民族の弦楽器)、あるいはウェールズのバイオリンを弾いている。crwthのvox(音)が、あまりにもjimp(か細く)てskimpy(貧弱)なので、彼は、それをblank(無音)にすることに決めた。彼は帽子を手にとり「ずんぐりした帽子よ、楽器の音を消してくれ」と言った。

 ところで、OpenAIの元メンバーによって設立され、強力なライバルともいわれるAnthropicの大規模言語モデルは「Claude」という名前だ。一部の言語処理やコード生成でChatGPTを凌駕するともいわれるClaude 2の名前は、このクロード・シャノンにちなんだものではないかと思われる。

どのようにして「完全パングラム」を作り出してもらうか?

 前述のように、ChatGPTは、パングラム(アルファベット全文字を使う文)は作れるようになった。ところが、完全パングラム(アルファベット26文字をちょうど1度ずつ使った文)に対しては、作ろうとはしてくれるのだが最後はあきらめてしまった。ChatGPTは、しばしば 《手動では》という言葉を使うのだが、大規模言語モデルのアテンションのメカニズムでは容易に答えにたどりつけないという意思表示だ。

 そこで、再度、ChatGPTを助けてやることを考える。既知の完全パングラムに関しては、「cwm」や「fjord」や「quiz」など、同じような単語ばかりが使われがちである。それが袋小路を作ってしまう可能性がある。そこで、「ANC単語頻度準拠_英和辞典」から30,000個の英単語をダウンロード。その中からパングラムに含まれることの多い、q、 v、x、z を2個以上含む単語で同じ文字を複数回使っていないものを洗い出すと、その数は26個だった。

 このうち既知の完全パングラムで使われていない単語は22個である。いうまでもなく、これらの処理はすべてCode Interpreterで自動的にやってもらう。そして、次のような処理を行う。

 22個の単語うちの1つ、「viz」(「すなわち」、「つまり」、「言ってみれば」、「取りも直さず」を意味する)であれば、既存の完全パングラムのそれぞれについてv、i、zを含んだ単語を取り去り、それらの単語の残りの文字、取り去らなかった単語、vizの3つの要素からパングラムを作る。このとき人名の頭文字のようなアルファベット1文字も残った文字の扱いとする。既知のパングラム「J.Q. Schwartz flung D.V. Pike my box.」であれば、Schwartz、V、Pike、boxを取り去り。j、q、d、v、s、c、h、w、a、r、t、p、k、eとflung my vizから、パングラムを作るという問題になる。

 まずは、この前段階の作業を次のようなプロンプトで行う。「以下の文について、次の2つのことを教えてください。(1)v、i、zの文字を含む単語を取り除いた文。(2)(1)で取り除いた単語で使われていた文字のうちv、i、zを取り除いた文字」(Code Interpreterはオンで要検証)。既知の完全パングラムは列記してやれば、vizのような単語を1つずつつぶしていけばよい。

 次に、これをもとにパングラムを作ってほしいと伝えるわけだが、ここまでのようなやんわりとしたプロンプトでは、いつまでも答えにたどり着けない結果となる。ChatGPTは、文字1文字ずつをオハジキのように操作することはあまり得意としていないのだ。さっきまで、軽快にパングラムを作り出したのがウソのようにまともな答えを出してこない。

 それでは、このような問題についてはどのようなプロンプトを与えてやればよいのか? 答えは、ChatGPTによるコード生成の要領で細かい指示をしてやることだ。具体的には、次のようなプロンプトを与えることで行った(Code Interpreterはオフ)。ChatGPTによるコード生成については、「ChatGPTでプログラミングのフラット化がはじまっている」を参照のこと。

j、q、d、v、s、c、h、w、a、r、t、p、k、eの14の文字とviz、flung、my、boxの4つの単語をもとに、完全パングラム(アルファベット26文字のすべての文字をちょうど1度だけ使った文)を作ってください。検証もしてください。
次のように進めてください。
まず、jqdvschwartpkeでアナグラムを作ります。
アナグラムとは、これらの文字をすべてを使って(他の文字は追加せずに)、いくつかの意味のある単語のセットを求めたものです。
たとえば、###以下のようなものです(実際にはもっとあります)。
###
dj pq thwackers
hawkers jct pdq
hdqrs jack wept
hdqrs jacket wp
Jeth pdq wracks
###
これらのアナグラムを構成する単語と、viz、flung、my、boxとを組み合わせます。
文として成立するように単語の順序の調整を試みてください。段階的に考えて求めてください。
1つのアナグラムについて複数の可能性を試行錯誤してください。
この処理を、さきほどのアナグラムについて1つずつ試していきます。
20個の完全パングラムを作ってみてください。また、その際、日本語訳を表示してください。

 これの実行のようすの動画をあとで紹介するが、なかなか完全パングラムになる文は出てこない。さらに、アルファベット26文字を1度ずつ使っていても「意味のある文になってません」というものがほとんどである。完全パングラムが、本当にレアだというのもあると思うが、ここまで条件を絞ってしまったかもしれない。

 このやり方ではダメかとも思いかけたのだが、このプロンプトから完全パングラムといえそうなものがいくつか得られたのだった。私自身の脳みそを文を作ることには一切使うことなくである。

カナダ王立騎馬警察が冗談っぽいテレタイプを受信する

 意味のある文として成立していないと完全パングラムとはいえないはずだが、その評価は、ChatGPTにしてもらった。以下、今回できた完全パングラムとその日本語訳、それぞれの単語の意味とChatGPTによる付加説明を紹介する。

■Jeth flung my box pdq, viz wracks.
「ジェスが私の箱を急いで投げた、すなわち壊れた」

Jeth:人名として解釈しています(例:男性のファーストネーム)。
flung: "投げた" の過去形です。
my box: "私の箱" という意味です。
pdq": "pretty darn quick" の略で、"すぐに" または "迅速に" といった意味です。
viz:ラテン語の "videlicet" の略で、"すなわち" または "つまり" といった意味で使います。
wracks: "壊れる" または "破壊する" といった意味の名詞または動詞です。

 これには注釈があって「この構築された文は、略語や非標準の単語を使用しているため、通常の文脈では意味が不明確になる可能性があります。しかし、特定の文脈や背景下では、何らかの意味を持つかもしれません」とある。「なんだふつうには意味が通らないのか?」と思われるかもしれないが、これは、ChatGPTによれば、先にあげた14個の既知の完全パングラムよりはだいぶよい評価である。文として認められない場合は、ChatGPTは「意味不明」とか「文として成立しません」とキッパリと言ってくる。

■RCMP vanquish joky twx fez bldg.
「カナダ王立騎馬警察が冗談っぽいテレタイプのメッセージでフェズをかぶった建物を打ち勝つ」

RCMP: カナダ王立騎馬警察(Royal Canadian Mounted Police)の略
vanquish: 打ち勝つ、征服する
joky: 冗談っぽい、ユーモラスな
twx: テレタイプによる電信の略
fez: フェズ(中東や北アフリカで着用される帽子)
bldg: 建物(buildingの略)

 説明として「この文は、カナダ王立騎馬警察がテレタイプで送信された冗談っぽいメッセージを受けて、フェズをかぶった建物との間で何らかの関わりを持って勝利する様子を描いています」とのこと。

■Blowzy jack vixen fut hdqrs mpg.
「乱れたジャックと女狐は未来の本部のために、マイルあたりのガソリン消費量を提供する」

Blowzy: 乱れた、だらしない
jack: 男性の名前、「ジャック」
vixen: 女狐
fut: 未来、将来
hdqrs: 本部(headquartersの略)
mpg: マイルあたりのガソリン消費量(miles per gallon)

 説明として「この文は、乱れたジャックと女狐が未来の本部に向けて行動し、マイルあたりのガソリン消費量に関する情報を提供する様子を描いています。ただし、意味の成り立たせ方には少しアイロニーやユーモアが感じられます」とのこと。

 これらは、ChatGPTが、完全パングラムを作り出したものといえるのだろうか? いわゆるヒューリスティックなそれも根拠はアルファベットの出現頻度くらいでお膳立てをしてあげた(具体的にはパングラムが成立しやすい単語をあらかじめ詰め込んであげた)。ChatGPTがやったのは、そこから先の以下のような作業である。

(1)残りの文字によるアナグラム生成
(2)単語の順序を入れ替えて意味のある文として成立するパターンを探す
(3)できた文の解説
(4)完全パングラムであるかどうかの検証と日本語訳

 この中では、(2)と(3)が、それでもChatGPTらしい仕事といえるだろう。たぶん、ChatGPTは、これくらいの使い方が正しいのだとも思える。実は、そもそもこの種の作業をChatGPTのウェブ画面からやること自体があまり得策ではなかったりするのである(いま頃言うなと言われそうだがChatGPTは対話では混乱しがちである)。どういうことかというと、プロンプトの組み立てをAPI経由でやっておくのがよい(DeepLearnig.AIとOpenAIによるプロンプト講座でもそれを推奨していたりする)。これについては次回紹介したいと思う。


 『月刊アスキー』1992年6月号と7月号の「ことば遊びコンピュータ」という連載においてパングラフについて書いている。6月号ではパングラムを求める専用のハードウェアを作った人がいることや自己記述的パングラム(パングラムが述べている内容がそれ自身を意味している)なんて話もでてくる。また、7月号では前回紹介したオリジナルのパングラムを遺伝的アルゴリズムでどう求めたかを説明している。どちらも、ホーテンス・S・エンドウ名義。以下、2回分のページをスキャンしたのでご興味のある方はご覧いただきたい。

この時期の月刊アスキーは総ページ数が500~600ページもあった。情報量でポジションを安定維持する作戦である。第三種郵便の規定で広告ページを半分以上にできないためそれが台割のベースになっていた。自分の署名記事でないのは、編集長がこんなものにはまっていてはダサいと感じていたからだ。

 

遠藤諭(えんどうさとし)

 株式会社角川アスキー総合研究所 主席研究員。MITテクノロジーレビュー日本版 アドバイザー。プログラマを経て1985年に株式会社アスキー入社。月刊アスキー編集長、株式会社アスキー取締役などを経て、2013年より現職。人工知能は、アスキー入社前の1980年代中盤、COBOLのバグを見つけるエキスパートシステム開発に関わりそうになったが、Prologの研修を終えたところで別プロジェクトに異動。「AMSCLS」(LHAで全面的に使われている)や「親指ぴゅん」(親指シフトキーボードエミュレーター)などフリーソフトウェアの作者でもある。趣味は、カレーと錯視と文具作り。2018、2019年に日本基礎心理学会の「錯視・錯聴コンテスト」で2年連続入賞。その錯視を利用したアニメーションフローティングペンを作っている。著書に、『計算機屋かく戦えり』(アスキー)、『頭のいい人が変えた10の世界 NHK ITホワイトボックス』(共著、講談社)など。

Twitter:@hortense667

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン