12/9(月) 応用科学学会シンポジウムで自動運転に関する講演を担当します☆彡

30-3. ChatGPTのGPT-4(Code Interpreter)でコード、図、説明スライドを作成

やること

ChatGPTにCode Interpreterが実装されました。Pythonコードを実行してくれるらしいので試してみましょう!次のシチュエーションを考えます。

ピザ屋を運営していてお客さんからクレームが来ました。

「ピザ持ち上げたら具が落ちたぞ(゚Д゚#)ゴルァ!!」

「具が真ん中に寄りすぎなんだよщ(゚Д゚щ)ゴルァ!!」

「てめぇんところの従業員が単純な往復運動で乗せてっから中心極限定理で真ん中が厚くなんだろwww 数学苦手か?www m9(^Д^)」

ということで従業員向けの研修資料を急いで作ることになりました。

ステップ1:具を均一に乗せるには

pythonで図を生成したいです。xもyも0から1の範囲で大きな円を描いてください。次に、この平面内にランダムで100点を打ってください。このとき、x座標に対してもy座標に対しても正規分布で点を打ってください。pythonコードと図を出力してください。

了解しました。大きな円を描き、その上に正規分布に従ってランダムな100点をプロットします。以下のように実行します:

1. matplotlibを使用して、単位円(半径1の円)を描画します。これは、xとyがそれぞれ0から1の範囲である平面上の円です。
2. numpyを使用して、平均0、標準偏差0.15の正規分布からランダムなx座標とy座標を生成します。100個のランダムな点を生成します。
3. 同じグラフ上にこれらのランダムな点をプロットします。

以下にpythonコードを示します。
[python code]

この図は、正規分布により生成された点がどのように分布するかを視覚化しています。正規分布により生成された点は、平均値(ここでは0)の周辺に集中する傾向がありますが、標準偏差によりその集中度が変わります。ここでは、標準偏差を0.15としたため、点は円の中心付近に集中しています。

この円はピザ生地を表しており、点は具を表しています。人が手で具を乗せる場合、このように具が中央に偏ってしまいます。しかし、ピザの耳の近くにも満遍なく具が乗っているほうが美味しいです。では、それを実現するには、x座標とy座標に対してどのような分布で具を乗せればよいか教えてください。pythonコードと図を出力してください。

ピザの具が全体に均等に分布するようにするには、具を乗せる座標を均等分布(一様分布)からランダムに選ぶのが適しています。一様分布では、指定した範囲内のすべての数値が同じ確率で選ばれるため、具が偏ることなくピザ生地全体に分布します。

具を乗せるx座標とy座標を一様分布からランダムに選ぶPythonコードと、その結果を描画した図を以下に示します。ただし、具がピザ生地からはみ出ないようにするため、具を乗せる座標の範囲を円の内部(半径0.5の範囲内)に限定します。このため、具を乗せる座標は、円の中心からの距離(半径)と角度(θ)を一様分布からランダムに選び、それを直交座標(x座標とy座標)に変換して生成します。

[python code]

すみません、エラーが発生しました。同じ円(Circleオブジェクト)を再利用しようとしたため、エラーが出てしまいました。新たに円を作成し、それをプロットしてみます。以下に修正したPythonコードを示します。

[python code]

上記の図は、具(青い点)が一様分布に従ってピザ生地全体(円)に分布している様子を表しています。具がピザの中心だけでなく、耳の近くにも満遍なく分布していることが視覚的に確認できます。

狙い通りのコードと図を数秒で出力してくれました。コードにエラーが発生した場合はすぐにやり直してくれるので、これまでのように「実行したらエラー出たんだけど?」のやり取りがありません。

さらにすごいのは、数理的な考え方が完璧なことです。コードを確認すると、まず具がはみ出ないように極座標を使用し、かつ、平面内で一様分布になるように平方根を取っています。これは数理的に妥当です。(ちなみに球なら三乗根)

# Generate 100 random points with uniform distribution
r = 0.5 * np.sqrt(np.random.rand(100))  # sqrt is used to avoid clustering at the center
theta = 2 * np.pi * np.random.rand(100)

# Convert polar coordinates to cartesian coordinates
x_uniform = 0.5 + r * np.cos(theta)
y_uniform = 0.5 + r * np.sin(theta)

ステップ2:説明資料を作る

では、ピザを作る現場において、どのような手の動かし方をすればこの乗せ方が実現できるかを説明するプレゼンテーションを作成してください。つまり、このように生地全体に均一的に具が乗り、かつ、生地からはみ出ないようなオペレーションについてです。図を用いて2枚程度のプレゼンテーションファイルとして出してください。プレゼンテーションの聞き手はピザの作り方は十分に理解しているため、具を乗せる方法だけに着目した説明としてください。

了解しました。そのようなプレゼンテーションを作成するために、まずは以下の手順を提案します:

1. スライド1: 具を均等に乗せる目的とその重要性について説明する。具が均等に乗っているピザとそうでないピザの違いを強調する。
2. スライド2: 具を均等に乗せるための具体的な手順について説明する。具を一様分布に乗せるための手法やテクニックを提供する。

では、この情報を元にスライドを作成しましょう。ただし、この環境では直接プレゼンテーションファイルを作成することはできませんので、スライドの内容をテキストとして書き出し、それを元に自身でスライドを作成していただく形になります。具体的なスライドの内容は以下のようになります。

スライド1: “具を均等に乗せる重要性”
・テキスト: “ピザ生地全体に具を均等に分布させることは、すべてのスライスで一貫した味を得るために重要です。具が中心に偏ったり、不均等に分布していると、味のバランスが崩れ、食べる時の満足度が下がる可能性があります。”
・画像: 具が不均等に分布している図(正規分布)

スライド2: “具を均等に乗せるための手順”
・テキスト: ” 具をピザ生地全体に均等に分布させるために、以下の手順を踏むことができます:
1. 具を一つずつ手で取り、ピザの中心から外側へ放射状に配置します。具を乗せる際には、毎回ランダムな角度と距離を選びます。これにより、具が中心に偏ることを防ぎます。
2. 具を取る際には、バラエティに富んだ具を一度に手に取り、それを一度に散らばらせます。これにより、特定の具が一箇所に集中することを防ぎます。
3. 具を乗せる際には、具の量と位置を調整し、具が生地全体に均一に分布するようにします。具が生地からはみ出さないように注意します。”
・画像: 具が均等に分布している図(一様分布)

このテキストを元に、ご自身でスライドを作成いただければと思います。画像としては、私たちが生成した2つのプロット(具が正規分布と一様分布で配置されたもの)を使用できます。

先程のコードの「r = 0.5 * np.sqrt(np.random.rand(100))」の部分で、平方根を適用した意図をオペレーションに含めてください。よろしく。

了解しました。具が生地全体に均一に分布するために、コード中で使用した平方根の操作をオペレーションに反映したスライド内容を以下に提案します。

(以下、差分)
1. 具を一つずつ手で取り、ピザの中心から外側へ放射状に配置します。具を乗せる際には、具の量を増やすほど乗せる位置を外側にシフトさせます。これにより、具が中心に偏ることを防ぎ、具が全体に均等に分布します。

先程のコードで平方根を適用したのは、生地の中心近くに具が集中するのを防ぐためです。具を乗せる位置の距離をランダムに選ぶと、小さい値(つまり、中心近く)が選ばれやすくなり、具が中心に集中してしまう可能性があります。これを避けるために、距離の値に平方根を適用し、大きい値(つまり、外側)が選ばれやすいように調整しました。

この操作をオペレーションに反映すると、具を乗せる位置を決定する際に、具の量を増やすほど乗せる位置を外側にシフトさせる、という手順になります。これにより、具が全体に均等に分布し、生地の中心近くに具が集中するのを防ぐことができます。

意図を理解してくれています。ただ、こちらの指示も重要で、こちらにもリテラシーと論理力が必要です。

ステップ3:説明資料を良くする

スライドの中で、赤字で強調すべき部分があれば教えてください。該当部分だけの列挙で良いです。

以下のポイントを赤字で強調すると良いでしょう:

1. スライド1のテキスト: “すべてのスライスで一貫した味を得るために重要です。”
2. スライド2の手順1: “具を乗せる際には、具の量を増やすほど乗せる位置を外側にシフトさせます。”
3. スライド2の手順3: “具が生地からはみ出さないように注意します。”

素晴らしいです。ところで、2つの図を修正したいです。ペパロニピザに見えるように点の形をサラミっぽくしてください。具の数と大きさは適当に調整してだいたいLサイズのピザっぽくしてください。ただし具の数は揃えてください。

了解しました。ペパロニピザに見えるように点の形を調整し、具の数と大きさをLサイズのピザに見立てて調整します。

まず、具が不均等に分布している図(正規分布)から始めます。

[python code]

次に、具が全体に均等に分布している図(一様分布)を生成します。具の形状、大きさ、数は先程と同じにします。

[python code]

具(赤色と青色の円)がそれぞれ中心に偏っている図(正規分布)と全体に均等に分布している図(一様分布)を生成しました。具の形状を円にし、具の大きさをさらに大きくして、Lサイズのピザに見立てています。また、具の数を50に調整しました。これらの図を使用して、具がどのようにピザ生地全体に分布するかを視覚的に示すことができます。

matplotlibで図を作るときのオプションって毎回検索しますよね。毎回覚えられない。ChatGPTなら一撃。

さいごに

コピペでパワーポイントに詰め込んだものがこちら。(赤字も言われた通り)

従業員向けの研修資料ができました。

SNS等でお気軽にご連絡ください

※当ブログに関することは何でもご相談・ご依頼可能です(Servicesになくても)
※TwitterはFF外の場合はDMではなく返信orメンションでお願いしますm(_ _)m

情報発信しています

質問・コメントはSlackやDiscordでお気軽に

勉強会の告知はこちらで

自然言語モデル
この記事を書いた人

博士(理学)。専門は免疫細胞、数理モデル、シミュレーション。米国、中国で研究に携わった。遺伝的アルゴリズム信者。物価上昇のため半額弁当とともに絶滅寸前。

この記事をシェアする
Vignette & Clarity(ビネット&クラリティ)
タイトルとURLをコピーしました