ChatGPTのプログラムを読む能力がヤバすぎる
ChatGPTでプログラミングをしたことがあるだろうか?
「ないわ」という人。あなたがもしエンジニアなら、今すぐ試してほしい。これは本当にヤバいテクノロジーだ。エンジニアとして評価される能力がこれから劇的に変わる。筆者はそう確信している。
GPTを使いこなせるかどうか?
これが次世代のエンジニアの生命線になるだろう。GPTを使いこなすエンジニアはとんでもない生産性向上を実現し、GPTを使えないエンジニアは問答無用で仕事がなくなる。もしくはGPTの運用コストより安い給料で搾取される。
「GPT×エンジニアリング」のノウハウをいち早くキャッチアップすることで、このキモすぎるテクノロジーの大波に乗ろうではないか。
ChatGPTにプログラムを書いてもらう方法については、以前こちらのnoteで紹介した。
「二次元の熱伝導方程式」について、あれこれとChatGPTに指示することでプログラムを書かせる方法を具体的なプロンプトとともにまとめたものだ。このnoteに掲載したすべてのコードはChatGPTが書いている。
例えば、
「熱伝導方程式を解いて、温度分布とプロファイルを表示してほしい。熱拡散率を変えてそれを比較したい。」
と伝えればこんなコードを書いてくれる。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
# Constants
Lx, Ly = 1, 1 # Domain dimensions (m)
Nx, Ny = 100, 100 # Number of grid points
dx, dy = Lx / (Nx - 1), Ly / (Ny - 1) # Grid spacing (m)
total_time = 12.0 # Total simulation time (s)
thermal_diffusivities = [0.5 * 1e-4, 1e-4, 1.5 * 1e-4] # Different thermal diffusivities
def init_temperature_field(Nx, Ny):
T = np.zeros((Ny, Nx))
T[Ny // 2 - 10 : Ny // 2 + 10, Nx // 2 - 10 : Nx // 2 + 10] = 100
return T
def update_temperature(T, alpha, dt, dx, dy):
T_new = T.copy()
T_new[1:-1, 1:-1] = (
T[1:-1, 1:-1]
+ alpha * dt * (
(T[1:-1, 2:] - 2 * T[1:-1, 1:-1] + T[1:-1, :-2]) / dx**2
+ (T[2:, 1:-1] - 2 * T[1:-1, 1:-1] + T[:-2, 1:-1]) / dy**2
)
)
return T_new
fig, axes = plt.subplots(3, 2, figsize=(12, 12), sharex='col', sharey='row')
for i, alpha in enumerate(thermal_diffusivities):
dt = 0.25 * min(dx, dy)**2 / alpha # Time step (s)
T = init_temperature_field(Nx, Ny)
n_steps = int(total_time / dt)
for step in range(n_steps + 1):
T = update_temperature(T, alpha, dt, dx, dy)
# Plot the final temperature distribution in the xy-plane
im = axes[i, 0].imshow(T, cmap='hot', origin='lower', extent=[0, Nx, 0, Ny])
axes[i, 0].set_title(f'Temperature Distribution (α = {alpha:.1e})')
axes[i, 0].set_ylabel('y (m)')
# Create a custom colorbar axis with the same length as the y-axis
divider = make_axes_locatable(axes[i, 0])
cax = divider.append_axes("right", size="5%", pad=0.1)
fig.colorbar(im, cax=cax, label='Temperature (°C)')
# Plot the temperature profile along the x-axis through the center
x = np.linspace(0, Lx, Nx)
axes[i, 1].plot(x, T[Ny // 2, :], label=f'α = {alpha:.1e}')
axes[i, 1].set_title(f'Temperature Profile (α = {alpha:.1e})')
axes[i, 1].set_ylabel('Temperature (°C)')
# Set the x-axis label for the bottom subplots
for ax in axes[-1, :]:
ax.set_xlabel('x (m)')
plt.suptitle('2D Heat Transfer for Different Thermal Diffusivities')
plt.tight_layout(rect=[0.1, 0.03, 1, 0.95]) # Increase left margin to 0.1
plt.show()
おそろしいプログラミング能力と言わざるを得ない。この程度のコードであればChatGPTはあっさりと書いてしまうのだ。
これを使いこなせるかどうかで、エンジニアの生産性が天と地ほど違ってくるのは容易に想像できる。ChatGPTはエンジニアの能力格差を拡大するとんでもない装置なのだ。
こんなおそろしいプログラミング能力をもつChatGPTだが、「プログラムを書かせる」以外にも、実はおそろしい使い方がある。「プログラムを読ませる」という使い方だ。
本稿では、ChatGPTがもつ驚異の「プログラムを読む能力」を紹介する。
コードにコメントを書いてもらう
物理シミュレーションや数値計算に限らず、筆者はプログラムにコメントを書く作業がきわめて嫌いである。面倒くさすぎる。大事なのはわかっている。わかっているけど書けない。
これをChatGPTにやらせてみたらどうか?
以下は筆者が書いたCFDのコードである。実行するといわゆる円柱まわりの流体の流れを可視化する。
import numpy as np
import matplotlib.pyplot as plt
def distance(x1, y1, x2, y2):
return np.sqrt((x2-x1)**2 + (y2-y1)**2)
plot_every = 1000
Nx, Ny = 400, 100
tau = .53
Nt = 10000
NL = 9
cxs = np.array([0, 0, 1, 1, 1, 0,-1,-1,-1])
cys = np.array([0, 1, 1, 0,-1,-1,-1, 0, 1])
weights = np.array([4/9,1/9,1/36,1/9,1/36,1/9,1/36,1/9,1/36])
F = np.ones((Ny,Nx,NL)) + 0.01*np.random.randn(Ny,Nx,NL)
F[:,:,3] = 2.3
cylinder = np.full((Ny, Nx), False)
for y in range(0, Ny):
for x in range(0, Nx):
if(distance(Nx//4, Ny//2, x, y)<13):
cylinder[y][x] = True
for it in range(Nt):
#print(it)
F[:,-1,[6,7,8]] = F[:,-2,[6,7,8]]
F[:,0,[2,3,4]] = F[:,1,[2,3,4]]
for i, cx, cy in zip(range(NL), cxs, cys):
F[:,:,i] = np.roll(F[:,:,i], cx, axis=1)
F[:,:,i] = np.roll(F[:,:,i], cy, axis=0)
bndryF = F[cylinder,:]
bndryF = bndryF[:,[0,5,6,7,8,1,2,3,4]]
rho = np.sum(F,2)
ux = np.sum(F*cxs,2) / rho
uy = np.sum(F*cys,2) / rho
F[cylinder,:] = bndryF
ux[cylinder] = 0
uy[cylinder] = 0
Feq = np.zeros(F.shape)
for i, cx, cy, w in zip(range(NL), cxs, cys, weights):
Feq[:,:,i] = rho*w* (1 + 3*(cx*ux+cy*uy) + 9*(cx*ux+cy*uy)**2/2 - 3*(ux**2+uy**2)/2)
F += -(1.0/tau) * (F - Feq)
if (it%plot_every == 0):
plt.imshow(np.sqrt(ux**2+uy**2))
plt.pause(.01)
plt.cla()
コードを見ての通り、全くコメントがない。そこでChatGPTにコメントを書いてもらおう。プロンプトは以下。
ChatGPTからの回答は次のようになる。
import numpy as np
import matplotlib.pyplot as plt
def distance(x1, y1, x2, y2):
return np.sqrt((x2-x1)**2 + (y2-y1)**2)
plot_every = 1000 # どれだけの頻度でプロットを更新するか
Nx, Ny = 400, 100 # シミュレーション領域のサイズ
tau = .53 # 緩和時間
Nt = 10000 # シミュレーションの総時間ステップ数
NL = 9 # Lattice-Boltzmannの速度の数
cxs = np.array([0, 0, 1, 1, 1, 0,-1,-1,-1]) # x方向の速度ベクトル成分
cys = np.array([0, 1, 1, 0,-1,-1,-1, 0, 1]) # y方向の速度ベクトル成分
weights = np.array([4/9,1/9,1/36,1/9,1/36,1/9,1/36,1/9,1/36]) # 速度の重み
F = np.ones((Ny,Nx,NL)) + 0.01*np.random.randn(Ny,Nx,NL) # 分布関数
F[:,:,3] = 2.3
cylinder = np.full((Ny, Nx), False) # 円柱の配置を表す二次元配列
for y in range(0, Ny):
for x in range(0, Nx):
if(distance(Nx//4, Ny//2, x, y)<13):
cylinder[y][x] = True
for it in range(Nt):
#print(it)
F[:,-1,[6,7,8]] = F[:,-2,[6,7,8]]
F[:,0,[2,3,4]] = F[:,1,[2,3,4]]
for i, cx, cy in zip(range(NL), cxs, cys):
F[:,:,i] = np.roll(F[:,:,i], cx, axis=1)
F[:,:,i] = np.roll(F[:,:,i], cy, axis=0)
bndryF = F[cylinder,:]
bndryF = bndryF[:,[0,5,6,7,8,1,2,3,4]]
rho = np.sum(F,2) # 密度
ux = np.sum(F*cxs,2) / rho # x方向の速度
uy = np.sum(F*cys,2) / rho # y方向の速度
F[cylinder,:] = bndryF
ux[cylinder] = 0
uy[cylinder] = 0
Feq = np.zeros(F.shape) # 平衡分布関数
for i, cx, cy, w in zip(range(NL), cxs, cys, weights):
Feq[:,:,i] = rho*w* (1 + 3*(cx*ux+cy*uy) + 9*(cx*ux+cy*uy)**2/2 - 3*(ux2+uy2)/2)
F += -(1.0/tau) * (F - Feq) # 分布関数の更新
if (it % plot_every == 0):
plt.imshow(np.sqrt(ux**2+uy**2)) # 速度の大きさを表示
plt.pause(.01)
plt.cla()
どうだろう。
筆者はこれをはじめて見たとき、恐怖を感じずにはいられなかった。
おそろしいのはコメントの内容だ。「プログラムの全体像」を理解しないと明らかに書けないものになっている。
つまりこういうことだ。
ChatGPTはコメントが一切ないコードを見て、なにをやっているかの全体像を一瞬で読み解き、書かれているプログラミング言語と学問的な数式を照らし合わせ、それに使用する物理パラメータがどのような変数で定義されているのかを判断している。
ちょっとシャレになってない。
コードの解説をしてもらう
世の99%のプログラマーは、自分にとって新しい領域のプログラミングにトライするとき、おおよそ以下のようなステップを踏むのではないだろうか?
ググって先人のコードを見つける
それを実行して結果を見る
さらにググりながらコードの内容を理解しつつ、ちょっとづつ修正していく
基本はこのようなことをやるだろう。なにを隠そう、プログラミングとは先人の知恵を少しだけ自分用に修正する仕事である。他人が書いたコードの理解に努める時間がとても長いのだ。
しかしながら、人の書いたコードはとにかく読みづらい。変数が何を意味し、どんな計算に代入され、その先の計算にどのように使われるのかを読み解くのはとても骨が折れる。
これをChatGPTにやらせてみたらどうか?
例として、上記の例、筆者が書いたコメントが一切ないCFDのコードを解説してもらう。
コードを丸投げし、以下のプロンプトを打ち込んでみよう。
ChatGPTからの回答は以下。DeepLによる和訳のみ掲載する。
繰り返そう。
このコードは全くコメントを書いていない。それなのに、ChatGPTは残酷なほど精緻なアウトラインを一瞬で提供してくれるのだ。
「人が書いた初見のコードを読む」という能力において、ほぼすべての人間はChatGPTに負けたと言って差し支えない。筆者はそう考えている。
この概要について、より詳細に掘り下げたいときは以下のプロンプトを使うと良い。
ChatGPTからの回答は以下。
数式が読みづらいときは以下のプロンプト。
ちょっとシャレになってない(2回目)。
最後に
いかがだろうか。ChatGPTのプログラミング能力で注目すべきは「書く」だけではない。初見のコードを読み解き、それを数学的な知識で解説する能力も驚くほど高い。
ChatGPTはエンジニアの能力格差を拡大するおそろしい装置だ。使い方を早期にキャッチアップすることで、このキモいテクノロジーの恩恵に預かろうではないか。
これら以外の使用法についても目下研究中だ。よさげなものは随時ツイッターで紹介していく。
この記事が気に入ったらサポートをしてみませんか?