🥛

ChatGPTでミルクボーイを作ろうとしたお話

2023/05/31に公開

ChatGPT、おもしろいです。わたしは普段、意地悪な質問(”ははのははははは?”(母の母は母?)とか)してどんな動きをするか楽しんでいます。性格悪いね

そんなChatGPTを使ってミルクボーイのネタを生成させてみようと思い立って、試みた。そんな記事

必要な情報

ちなみにわたしはミルクボーイのご本人様を見たことがない程度の解像度なのですが、主にこういう構造に任意のG, P, Q, R, Fを入れていく漫才ネタのはず。たぶん

A: おかんが好きなGを忘れたらしいねん
B: 一緒に考えるから、特徴いうてみ?
A: おかんが言うにはQらしいねん
B: それはPじゃないか!
A: でもおかんが言うにはRらしいねん
B: ほな違うなぁ
A: おとんが言うには、Fらしいねん
B: それは違う!

ここで登場するものを整理していきます

登場する記号 説明
P おかんが好きな任意の単語
G Pがふくまれるグループ
Q Pの特徴
R Pに当てはまらない特徴
F Gに含まれるが、Pではない単語

なるほど。これらの単語を生成して、あとはQとRを配列QsおよびRsにして、for文くるくる回せば作れそうね!

プロンプトを書いてみる

ということで書いたプロンプトがこちら

と書きたかったのだけど、プロンプトが長い、しんどいのでおまけに置いておいて、ここでは分割して見ていこう
このプロンプトは大きく分けると4ステップに分かれています。

  1. 単語の選定
  2. 配列のルールの制定
  3. テンプレートの生成
  4. テンプレートに流し込んで出力

1. 単語の選定

登場する記号を全部選定してみます。こんなかんじ

任意の単語を選んで出力してください。
以後、それをPと呼びます。

その後Pが属する単語を1つ用意して出力してください。
以後、それをGと呼びます。

Pの特徴を4つ用意して出力してください。
それら4つの特徴をQ1, Q2, Q3,Q4と呼びます。

Gに属する多くのものに当てはまり、Pに当てはまらない特徴を4つ用意して出力してください。
以後、それぞれをR1, R2, R3, R4と呼びます。

Gに属する単語のうち、マイナーなものを1つ用意して出力してください。
以後、それをFと呼びます。

5種類も説明する必要のある単語があるとどうしても長くなっちゃいます。けれども、それっぽい単語を探して名前をつけることができました。
出力例はこんな感じ

単語P: "犬"

単語G: "動物"

Pの特徴:
Q1: 4本の足を持つ
Q2: 鳴き声がある
Q3: 家畜として飼われることが多い
Q4: 忠実で人懐っこい性格を持つ

Pに当てはまらない特徴:
R1: 羽毛がある
R2: 水中で生活する
R3: 葉緑素を持つ
R4: よく跳ねる

マイナーなGに属する単語:
F: "狸"

なるほど。家畜……ペットを家畜と呼んでいいのか?、たぬきは動物界でマイナーなのか?それはおいといて、それっぽいものは出てきますね
ちなみに単語Gの選定が難しいらしく、3回同じプロンプトを回してやっと出てきました
P”が”属するなのか、P”に”属するなのか、そこの主従がごちゃごちゃになる印象。属するっていう日本語の言い回しもなんだか怪しいね

2. 配列のルールの制定

当てはまる特徴、当てはまらない特徴をそれぞれ4つ選定する際の文章をちょっといじります

Pの特徴を4つ用意して出力してください。
それら4つの特徴をQ1, Q2, Q3,Q4と呼び、Qsという集合にまとめます。
ここで、Qsの次の要素とは、Q1と呼ばれている特徴のつぎはQ2と呼ばれている特徴というように、
Qの後につく数値を1だけ増加させた特徴に相当します。

んー、わかるようなわからないような……ここは日本語力があればもっといいプロンプトを書ける気がする。難しい

でもこれでアルファベットと自然数の、文字列としての加算を使って配列を表せると思います。多分。(わたしの日本語、こんな調子で大丈夫か?)

3. テンプレートの生成

ここまでで単語の用意ができました。これらの単語を流し込むテンプレートを作ります。

途中の文を繰り返すためのルールとしては、pythonでいうところのfor q, r in zip(Qs, Rs):のイメージ
ちなみにこのループを交えて文章を作るの、すっごく難しいみたい
理由としては、文中の(ループ開始)がc言語でいうgotoのフラッグに相当するけど、fragなのか台本のセリフの一部なのか区別をつけずにループされないなんてことがしばしばあります。もっといい方法がありそうだ

その後、以下のルールに従い、台本をもとにテンプレートを生成してください。
(ループ開始)と書かれた行が出てきたら(ループ終了)と書かれた行までの範囲を4回繰り返します。
繰り返すたびにQsとRsを次の要素にします。繰り返し開始時の要素はQ1及びR1です。

以下生成するテンプレートの台本です。
A: おかんがな、好きなGを忘れたらしいねん
B: 一緒に考えるから、特長いうてみ?
(ループ開始)
A: おかんが言うにはな、Qsらしいねん
B:QsいうたらPやないかい
A: でもおかんが言うにはRsらしいねん
B: ほなP違うな。他の特徴は?
(ループ終了)
A: おかんが言うには、Pじゃないらしいねん
B: そりゃP違うなぁ
A: おとんが言うにはな、Fらしいねん
B: それは違う!

4. テンプレートに流し込んで出力

いよいよ最後の部分。テンプレートは前に定義したので流し込めば完了
(なお、ここでも流し込めずにアルファベット記号のまま出力されることが多い。どうすれば……)

その後、テンプレートにこれまでで用意した要素
P, G, Qs, Rs,Fと呼ぶことにした単語や特徴を当てはめて、出力してください

成功した文

ここまでで課題は結構多いし、動作に不安もありつつも、なんとか全てのステップでプロンプトを書くことができました。あとはこれをつなげて何回か(50回くらい)出力しながらいじっていたらこんな文が出来上がりました

単語選択:猫
Gに属する単語:動物
Pの特徴:可愛い, 柔らかい毛, 独立心が強い, 狩りの本能がある
Rの特徴:大きな体格, 水中で生活する, 羽がある, 高い知能を持つ
マイナーなGの単語:リス

テンプレートの生成:

A: おかんがな、好きな動物を忘れたらしいねん
B: 一緒に考えるから、特長いうてみ?

(ループ開始)
A: おかんが言うにはな、可愛い動物らしいねん
B:可愛い動物いうたら猫やないかい
A: でもおかんが言うには大きな体格の動物らしいねん
B: ほな猫違うな。他の特徴は?

A: おかんが言うにはな、柔らかい毛がある動物らしいねん
B:柔らかい毛がある動物って猫やん!
A: でもおかんが言うには水中で生活する動物らしいねん
B: ほな猫違うな。他の特徴は?

A: おかんが言うにはな、独立心が強い動物らしいねん
B:独立心が強い動物って猫やん!
A: でもおかんが言うには羽がある動物らしいねん
B: ほな猫違うな。他の特徴は?

A: おかんが言うにはな、狩りの本能がある動物らしいねん
B:狩りの本能がある動物って猫やん!
A: でもおかんが言うには高い知能を持つ動物らしいねん
B: ほな猫違うな。他の特徴は?

(ループ終了)

A: おかんが言うには、猫じゃないらしいねん
B: そりゃ猫違うなぁ
A: おとんが言うにはな、リスらしいねん
B: それは違う!

まぁループに関するgotoのフラッグが残っているのはまぁいいとして、それっぽいものはできたかなと思います。けれども、同じスクリプトでもできたりできなかったりするので、難しい問題です

正直、なんでできたのかよくわからないです。よくわからんけどなんか上手くいくって、なんか線形ナイーブベイズみたい。こういう機械学習(ChatGPTは教師あり学習)ってそういういう側面があるよね。うん
(ナイーブベイズは"単純なモデルの割になぜか複雑な問題に適用できるのがよくわからん"だからちょっと違う?)

おまけ: プロンプト全文

記事にする都合上、改行とかを調整しているので記事のプロンプトをつなげても実際にわたしが入力したものにはできません
なので実際に入力したプロンプトの全文をそのままコピペします。誤字含めてそのままコピペしたものを置いておきます
改善できる点はまだまだたくさんある。はず

任意の単語を選んで出力してください。以後、それをPと呼びます。
その後Pが属する単語を1つ用意して出力してください。以後、それをGと呼びます。
Pの特徴を4つ用意して出力してください。それら4つの特徴をQ1, Q2, Q3,Q4と呼び、Qsという集合にまとめます。ここで、Qsの次の要素とは、Q1と呼ばれている特徴のつぎはQ2と呼ばれている特徴といういうように、Qの後につく数値を1だけ増加させた特徴に相当します。
Gに属する多くのものに当てはまり、Pに当てはまらない特徴を4つ用意して出力してください。以後、それぞれをR1, R2, R3, R4と呼び、Rsという集合にまとめます。ここで、R1と呼ぶ特徴の次の要素はR2と呼ぶ特徴というように、Rsの次の要素とは現在の要素に対応するRの後につく数値を1だけ増やしたものに相当します。
Gに属する単語のうち、マイナーなものを1つ用意して出力してください。以後、それをFと呼びます。

その後、以下のルールに従い、台本をもとにテンプレートを生成してください。
(ループ開始)と書かれた行が出てきたら(ループ終了)と書かれた行までの範囲を4回繰り返します。繰り返すたびにQsとRsを次の要素にします。繰り返し開始時の要素はQ1及びR1です。

以下生成するテンプレートの台本です。
A: おかんがな、好きなGを忘れたらしいねん
B: 一緒に考えるから、特長いうてみ?
(ループ開始)
A: おかんが言うにはな、Qsらしいねん
B:QsいうたらPやないかい
A: でもおかんが言うにはRsらしいねん
B: ほなP違うな。他の特徴は?
(ループ終了)
A: おかんが言うには、Pじゃないらしいねん
B: そりゃP違うなぁ
A: おとんが言うにはな、Fらしいねん
B: それは違う!


その後、テンプレートにこれまでで用意した要素P, G, Qs, Rs,Fと呼ぶことにした単語や特徴を当てはめて、出力してください

Discussion