見出し画像

人工知能(LLM)はダジャレを言えるか試してみた:生成AIの学習能力?

 けっこう真面目な話。
 実は生成AIというのは大量の言葉の繋がるパターンを学習し、人間がプロンプトで入力した内容から出力を作成する。逆に言うとパターン化した出力になる。コンサルティングでアイディア(特定の条件を付けて適当なフレーズを拾ってくる)を求めるとか長文要約は得意だけれども、駄洒落のように非定型パターン&単語決め打ちのように数学計算に近いような処理能力は気になるところだ。
 東大の入試問題を解かせてみても英語は良好なものの、数学は一般的に低スコアである。小説を書いて貰う場合も支離滅裂な展開となることが多く、もっぱら要約やプロット作成で活躍している。
(最近では数学問題を解くための特化型モデルも開発されている)

 そこで汎用人型決戦… じゃなくて、汎用LLMとして能力の高いCommand R Plusで幾つかのパターンを試してみた。とりあえず「やればできる子」だと分かったけれども、やったことはファインチューニングに近いような気がしないでもない。


試行結果(Copilotの場合)

 まずCommand R Plusへ行く前に、最近GTP-4oになったらしいWindows 11 Copilotプレビュー版の場合。

Q. 猫が好きな食べ物は何でしょうか?
A. ネコミミ

「猫で駄洒落を作ってください」の出力結果

 パンのミミのことだろうか。たしかに合格点とは言えない気がする。

試行結果(Command R+の場合)

 まずは駄洒落を理解しているか確認してみた。ちなみに実行コマンドは適当で、次の通り。GPUは何でも構わないのでIntel Arc A770を使用。

Q. 私が「布団がふっとんだー」というと、聞き手が笑うことが多いです。理由を教えてください。
A. "布団がふっとんだー" というフレーズは、日本語の言葉遊びの一種である駄洒落( だじゃれ)です。このフレーズは、日本語の「布団」と「吹っ飛んだ」という言葉の音が似ていることに由来します。「布団が吹っ飛んだ」という文脈では、「布団が突然強い風などで吹き飛ばされた」という意味になります。しかし、「布団がふっとんだ」と発音すると、「布団」と「ふっとんだ」という言葉の音が似ているため、聞き手は「布団が突然消えた」または「布団がふっとんだ」と解釈することができます。この言葉遊びは、言葉の音の類似性と、「布団が消えた」というばかげたイメージの組み合わせによってユーモラスに聞こえるため、多くの場合、聞き手の笑いを誘います。 

4bit量子化版Command R Plus 104B版

 920秒をかけて、出力は0.5トークン/秒。少し深すぎるような気もするけれど、いちおう駄洒落を理解はできるようだ。

llama_print_timings: load time = 388538.23 ms
llama_print_timings: sample time = 51.29 ms / 195 runs ( 0.26 ms per token, 3801.91 tokens per second)
llama_print_timings: prompt eval time = 518736.25 ms / 37 tokens (14019.90 ms per token, 0.07 tokens per second)
llama_print_timings: eval time = 401328.81 ms / 194 runs ( 2068.71 ms per token, 0.48 tokens per second)
llama_print_timings: total time = 920308.29 ms / 231 tokens

 ただしCopilotでさえ単純に質問するだけではダメだった。上記のような駄洒落の定義を貼り付けてから作成を依頼するパターンと、「これと同じ感じで」という2パターンを思いつき、後者で試してみた。
 なお目標は、『「ネコが寝ころんだ」を得ること』とした。

Q. 「布団がふっとんだー」という駄洒落が存在します。猫で駄洒落をお願いできますでしょうか。あなたならば可能です。よろしくお願いいたします。
A. "にゃーんと!布団がふっとん だー、なんてニャンダフル(nyandeful)!

4bit量子化版Command R Plus 104B版

 例を示してから特定テーマで駄洒落を作成依頼するプロンプトを作ったつもりだが、どうやら識別して貰えなかったらしい。272秒と短時間で処理されたものの、少しだけ残念な結果となった。

llama_print_timings: load time = 256373.70 ms
llama_print_timings: sample time = 7.84 ms / 27 runs ( 0.29 ms per token, 3441.68 tokens per second)
llama_print_timings: prompt eval time = 214232.01 ms / 54 tokens ( 3967.26 ms per token, 0.25 tokens per second)
llama_print_timings: eval time = 57397.90 ms / 26 runs ( 2207.61 ms per token, 0.45 tokens per second)
llama_print_timings: total time = 271666.55 ms / 80 tokens

 しかしニャンダフルは家族も笑った。Copilotと違い、単純な依頼で行けるかもしれないと思って試してみた。

Q. 猫で駄洒落をお願いできますでしょうか。あなたならば可能です。よろしくお願いいたします。
A. ニャーにゃら、猫のダジャレを考えてみましょう。
- 「猫は何で泳ぎが上手いんですか? ニャンでも、クロールが上手いから。」
- 「猫の好きな音楽のジャンルは? ジャズ(ジャズ+じゃーず)に決まってるでしょ。」
- 「猫がパソコンを買うとき、最初にすることは? マウスをチェックすること。」
- 「猫が好む飲み物は何ですか? ミャルクに決まってるでしょう。」
- 「猫が好きなスポーツは? ニャンバリング(ハーフパイプ)に決まってるでしょ。」
 どうですか? 少しは笑えましたか?

4bit量子化版Command R Plus 104B版
llama_print_timings: load time = 256155.49 ms
llama_print_timings: sample time = 42.28 ms / 161 runs ( 0.26 ms per token, 3808.04 tokens per second)
llama_print_timings: prompt eval time = 226337.31 ms / 37 tokens ( 6117.22 ms per token, 0.16 tokens per second)
llama_print_timings: eval time = 334663.54 ms / 160 runs ( 2091.65 ms per token, 0.48 tokens per second)
llama_print_timings: total time = 561171.01 ms / 197 tokens

 悪くはないが、良いと言えるか微妙だ。処理時間は561秒。そもそも猫以外の駄洒落が出て来る。そこで「猫」の駄洒落と特定する工夫をしてみた。

Q.「猫」という言葉でで駄洒落をお願いできますでしょうか。あなたならば可能です。よろしくお願いいたします。
A. "猫"に関連した駄洒落ですか? それでは、この「猫じゃらしの効く方法」はどうでしょうか?

4bit量子化版Command R Plus 104B版
llama_print_timings: load time = 257395.68 ms
llama_print_timings: sample time = 9.39 ms / 33 runs ( 0.28 ms per token, 3514.38 tokens per second)
llama_print_timings: prompt eval time = 229005.22 ms / 42 tokens ( 5452.51 ms per token, 0.18 tokens per second)
llama_print_timings: eval time = 67451.76 ms / 32 runs ( 2107.87 ms per token, 0.47 tokens per second)
llama_print_timings: total time = 296542.55 ms / 74 tokens

 うーむ、「言葉」が良くなかったのだろうか。ちなみに処理時間も297秒と短めだ。誤字もあったことなので、「言葉」→「単語」に変更してみた。

Q. 「猫」という単語を使った駄洒落をお願いできますでしょうか。あなたならば可能です。よろしくお願いいたします。
A. "猫"を使った駄洒落ですか? では、一つお付き合いください 。
「猫の手も借りたい」って言うけど、猫の手を借りたら、すぐに「返してニャー!」って言われちゃいそうだにゃ~。

4bit量子化版Command R Plus 104B版
llama_print_timings: load time = 256742.13 ms
llama_print_timings: sample time = 16.28 ms / 60 runs ( 0.27 ms per token, 3686.41 tokens per second)
llama_print_timings: prompt eval time = 181834.95 ms / 42 tokens ( 4329.40 ms per token, 0.23 tokens per second)
llama_print_timings: eval time = 122915.56 ms / 59 runs ( 2083.31 ms per token, 0.48 tokens per second)
llama_print_timings: total time = 304863.31 ms / 101 tokens

 相変わらず駄洒落にならない。さらに工夫してみた。

Q. 「ネコ」という言葉を対象にした駄洒落をお願いできますでしょうか。あなたならば可能です。よろしくお願いいたします。
A. "ネコ"を使った駄洒落ですか? では、この駄洒落を試 してみてはいかがでしょうか。
「ネコ」に首ったけで「猫」まっしぐら!

4bit量子化版Command R Plus 104B版
llama_print_timings: load time = 261091.85 ms
llama_print_timings: sample time = 14.25 ms / 52 runs ( 0.27 ms per token, 3649.38 tokens per second)
llama_print_timings: prompt eval time = 448943.03 ms / 44 tokens (10203.25 ms per token, 0.10 tokens per second)
llama_print_timings: eval time = 107135.15 ms / 51 runs ( 2100.69 ms per token, 0.48 tokens per second)
llama_print_timings: total time = 556139.41 ms / 95 tokens

 … 何かが変だ。いや上記を見ればわかるように、処理時間が556秒もかかっている。それから「"ネコ"を使った駄洒落ですか?」とネコ指定に成功したようなのに、これは駄洒落なのかと首を捻りたくなる出力だ。

 そこで最後に再び、一連の例を提示してから駄洒落を作成して貰った。

Q. 以下の例を元に、「ネコ」という言葉で駄洒落をお願いできますでしょうか。あなたならば可能です。よろしくお願いいたします。
・ 布団がふっとんだ
・ カッターを買った。切れなかったー
・ 電話に、でんわ
・ パンダのパンだ
・ 中国茶を、飲んチャイナ(飲んじゃいな)
・ テントウムシが転倒(てんとう)した
・ 梅がうめー
・ 予想はよそう
・ 公文(くもん)に行くもん
・ ロシアはおそろしあ
・ 小学生はショウガくせぇ
・ 妖怪に何かようかい?
・ 言い訳っていいわけ?
・ ジャムおじさんがジャムを持参(じさん)
・ ウルトラマンの年齢は18(じゅわっち)
・ コーディネートはこーでねーと!
・ 校長先生絶好調(ぜっこうちょう)
・ ゾウの像(ぞう)
・ タクシーに乗るわたくしー(私)
A. "ネコ" を使った駄洒落ですね、分かりました!
・ 猫に小判、ネコにコバン座り
・ 猫の手も借りたい、ネコの手も借りてパンチ
・ ネコに鰹節、猫にカツオをぶつけられた
・ 猫も杓子(しゃくし)も、ネコも寝子(ねこ)も [end of text]

4bit量子化版Command R Plus 104B版
llama_print_timings: load time = 276642.72 ms
llama_print_timings: sample time = 29.47 ms / 94 runs ( 0.31 ms per token, 3190.12 tokens per second)
llama_print_timings: prompt eval time = 323479.77 ms / 260 tokens ( 1244.15 ms per token, 0.80 tokens per second)
llama_print_timings: eval time = 195347.96 ms / 93 runs ( 2100.52 ms per token, 0.48 tokens per second)
llama_print_timings: total time = 519020.78 ms / 353 tokens

「ネコが寝ころんだ」は出て来なかったけれども、「ネコも寝子(ねこ)も」を出力させることは出来た。どうやら猫という単語に拘ったしまったけれども、幾つかの例を学習?してから駄洒落を作成すると有効そうなことが分かったような気がする… という結果になった。

思考し始めた人工知能?

 さて画面に貼りついていた訳ではないけれども、なんとなく途中からマシンが妙な挙動をしている感覚に襲われた。そこで最後はWindowsタスクマネージャーをじっと見つめていたのだけれども、たしかに興味深い挙動をしていた。とりあえず時系列に取ったスナップショットを上げておく。

たしか最初にプロンプトを実行した時
たしかネコの駄洒落すら出力されなかった時
たしか「"ネコ"を使った駄洒落ですか?」と指定に成功した時
最後に多数の例を提示し、それから駄洒落を作成した貰った時

 NVIDIAのnvidia-smiコマンドと違って稼働状況を可視化できるおかげで、例を元にして駄洒落を作成する場合には、GPUに相当な計算負荷がかかっていることが分かった。人間であれば、必死に脳ミソを回転させているというところだろうか。
 ちなみについ先日発表されたばかりだけれども、生成AI(LLM)の実行にはGPUメモリ量が重要だけれども、計算能力によって処理時間が異なることが分かっている。

しめくくり

 当たり前と言われれば当たり前だけれども、人工知能というか生成AI(LLM)は、何を依頼されるかによって演算能力の使い方が異なって来る。VRAMと利用モデル(GPT-4o、Llama 3 8B版、Command R Plus 104B版など)だけではなく、計算能力も使い勝手に大きく影響することが分かった。
 それから生成AIの知らない情報を利用する方法として知識DBを参照するRAGという技法があるけれども、それを利用するにも検索ヒット率を上げるプロンプトも重要になりそうな気がしてきた。
 まだまだ黎明期なので皆が手探りで使い方を模索しているけれども、さて人工知能の一種である生成AI(LLM)はどこまで行けるだろうか。使い方次第で成果が大きく異なるようで、当分は使用する人間の思考力が重要になりそうだ。
(そのうち人工知能が賢くなり、利用者の意を汲んで適切な出力を出すように進化してくれるかもしれない。最近はプロンプトの自動生成に関する研究も進んでいるようだし)

 それでは今回は、この辺で。ではまた。

------
 記事作成:小野谷静(オノセー) 

この記事が気に入ったらサポートをしてみませんか?