見出し画像

生成AIを利用したプログラミングのポイントや気をつける点

生成AIを使ってプログラミングを行うときのポイントや注意点をまとめていきます。まずはハートの図形を描きながら考えてみます。

問い:ハートの図形を描くプログラムを生成してください。

ハートの図形を描く

ChatGPT4のadvanced dataanalysisの場合

ChatGPT4のadvanced data analysisでは次のようになました。advanced data analysisの場合、内部でPythonが動いているのでそのままハートの図形が描かれます。

advanced data analysis

コードは通常は表示されず「コードの詳細を表示」で表示されます。

import numpy as np
import matplotlib.pyplot as plt

# Define the heart shape equations
t = np.linspace(0, 2 * np.pi, 1000)
x = 16 * np.sin(t)**3
y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)

# Plot the heart shape
plt.figure(figsize=(6,6))
plt.plot(x, y, 'r')
plt.title("ハートの図形")
plt.axis("equal")
plt.axis("off")
plt.show()

ChatGPT4の場合

ChatGPT4の通常状態だと次のようになります。
パターン1)

def draw_heart():
    print("  ***     ***  ")
    print(" *****   ***** ")
    print("******* *******")
    print(" ************* ")
    print("  ***********  ")
    print("   *********   ")
   .print("    *******    ")
    print("     *****     ")
    print("      ***      ")
    print("       *       ")

draw_heart()

パターン2)

import numpy as np
import matplotlib.pyplot as plt

def plot_heart():
    t = np.linspace(0, 2 * np.pi, 1000)
    x = 16 * np.sin(t)**3
    y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)
    
    plt.plot(x, y, 'r')
    plt.axis('equal')
    plt.axis('off')  # 軸を表示しない
    plt.show()

plot_heart()

ChatGPT3.5の場合

 無料でも利用可の名ChatGPT3.5の場合は次のようになりました。

import turtle as t

# ウィンドウの設定
t.Screen().bgcolor("white")
t.Screen().title("ハートの図形")

# ペンの設定
t.penup()
t.color("red")
t.pensize(2)

# ハートの形を描く関数
def draw_heart():
    t.goto(0, -200)
    t.begin_fill()
    t.left(140)
    t.forward(224)
    for _ in range(200):
        t.right(1)
        t.forward(2)
    t.left(120)
    for _ in range(200):
        t.right(1)
        t.forward(2)
    t.forward(224)
    t.end_fill()

# ハートを描く
draw_heart()

# ウィンドウを閉じる
t.exitonclick()

ポイント1)生成されたプログラムを実行するスキルは必要

さまざまなパターンの出力がなされるのですが、生成されたプログラムを実行するスキルは必要になります。そのためには

  • プログラム言語

  • そのプログラムの実行環境

を理解しておく必要があります。これを問いに含めることで比較的的確な回答を得ることができます。

問い修正版:Google Colabで実行可能なハートの図形を描くプログラムをPythonで生成してください。

するとChatGPT3.5 でも次のような出力に変わります。

import matplotlib.pyplot as plt
import numpy as np

# ハートの形状を定義
t = np.linspace(0, 2 * np.pi, 1000)
x = 16 * np.sin(t)**3
y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)

# プロット
plt.figure(figsize=(6, 6))
plt.plot(x, y, 'r')
plt.fill(x, y, 'red')
plt.axis('off')  # 軸を非表示にする

# プロットを表示
plt.show()

ChatGTP4と同じような出力になったことがわかると思います。このようにエンジン(GPT3.4かGPT4)による能力の差は「問い」プロンプトエンジニアリングである程度埋めることができるようです。
ただし、これはどんどんエンジンが進化していくと思いますので、あまりプロンプトエンジニアリングを意識することなく、的確に「問い」を発し、壁打ちしながら進めていくのが基本かと思っています。

ポイント2)実は難しいことをやっている

ChatGPT4の出力結果を見てみましょう。

import numpy as np
import matplotlib.pyplot as plt

# Define the heart shape equations
t = np.linspace(0, 2 * np.pi, 1000)
x = 16 * np.sin(t)**3
y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)

# Plot the heart shape
plt.figure(figsize=(6,6))
plt.plot(x, y, 'r')
plt.title("ハートの図形")
plt.axis("equal")
plt.axis("off")
plt.show()

実行すると次のように出力されます。

出力結果


このコードは間違っていませんし、シンプルに見えます。が実は難しいことをやっています。そう数学なんです。

ハートの図形を描くときの数式

プログラムは全く関係なくて数学の知識がないとどんなにPythonの文法を知っていても描けないのです。この数式知っている人少ないですよね。生成AIはプログラム自体も得意ですが、プログラム✕数学など分野を超えた組み合わせができるのです。今後様々な分野でこの組み合わせが起こっていくと思います。

ポイント3)だからハート以外の図形は難しい

数式で表現できないと図形を描くことができないので、他の図形は実は難しいのです。演習でみんなとやった星型の図形は次のようになります。GPT4は比較的よく描いてくれますが、ほかの環境では1回ではうまく行かない可能性が高いです。

問い:同じように星型の図形を描いてください。

描かれた星型の図形

ポイント4)実行環境に依存する

出力されたプログラム(コード)はPythonで出力されました。PythonのコードはGoogle Colaboratoryというオンラインの実行環境で実行可能です。

Google Colab上に貼り付けたソース

実行結果は先の結果と同じです。ここに生成されたプログラムを貼り付けて試すことができます。先にChatGPT4とChatGPT3.5で出力されたコードを貼り付けて実行してみましょう。

GPT4の場合

def draw_heart():
    print("  ***     ***  ")
    print(" *****   ***** ")
    print("******* *******")
    print(" ************* ")
    print("  ***********  ")
    print("   *********   ")
   .print("    *******    ")
    print("     *****     ")
    print("      ***      ")
    print("       *       ")

draw_heart()

.printのところがあって、.でエラーになりますが、このように出力されていました。「.printでエラーになるよ」と指摘すると直りました。

アスキーアートのハート
GPT4の実行結果

GPT3.5 の場合

GPT3.5 で出力れたコードも試してみましょう。

import turtle as t

# ウィンドウの設定
t.Screen().bgcolor("white")
t.Screen().title("ハートの図形")

# ペンの設定
t.penup()
t.color("red")
t.pensize(2)

# ハートの形を描く関数
def draw_heart():
    t.goto(0, -200)
    t.begin_fill()
    t.left(140)
    t.forward(224)
    for _ in range(200):
        t.right(1)
        t.forward(2)
    t.left(120)
    for _ in range(200):
        t.right(1)
        t.forward(2)
    t.forward(224)
    t.end_fill()

# ハートを描く
draw_heart()

# ウィンドウを閉じる
t.exitonclick()

これはGoogle Colab上ではエラーになります。

エラーメッセージ

実はこのコードも間違っていないんです。パソコン内に構築したPythonの実行環境だと実行することができます。

AnacondaのJupyterNotebook

実行結果は次のとおりです。

実行結果

生成AIは「問い」にプログラム言語の種類や実行環境を書いてあげない限り、一番もっともらしい回答を生成します。その回答が自分の実行環境と一致しているとは限らないんです。
はじめにChatGPT3.5が生成したコードはturtle(カメ:タートル)グラフィック描画のライブラリを利用したものでこれはWindowsやMacなどのOSの力を借りるのでブラウザ上では普通実行できないものになります。だからGoogle Colabでは実行できなかったのです。
描画の方法も異なっていて、数学というより画面内をカメが動いて行って図形を描画するものになります。
実はGoogle Colab上でturtleを実行するためのライブラリ(ColabTurtle)もありますが、これは一般的ではないため生成AIでは生成されません。生成AIは誰でも使えるわけですから、今後生成AIで生成されない情報が宝の山になる可能性を感じます。これらの情報には検索でたどり着くしかありませんし、このような情報を発信できるスキルが重要なスキルになるのだと思います。もちろん生成AIも知らないモノを作る能力も重要なスキルになるのだと思います。

ColabTurtleでハートの図形を描こうとしましたが、かなり機能が絞られているようで、ChatGPT4でも苦戦していました。

ColabTurtleでの描画

実行環境によって簡単にできることとできないことがあるということがわかると思います。

ポイント5)言語によっても得意不得意がある

Google ColabはPythonのオンライン実行環境です。ここでハートの図形を描きました。一方Googleスプレットシートから開いたGoogle App Scriptは≒JavaScriptのオンライン実行環境です。ここでメール送信などができました。
プログラム言語ですから基本頑張れば何でもできるはずということで、まずはGoogle App Scriptでハートの図形を描いてみます。

問い:Google App Scriptを使ってGoogle スプレットシートにハートの図形を描きたいです。コードを生成してください。

function drawHeart() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  
  // セルの背景色を初期化
  sheet.getRange("A1:Z100").setBackground("white");
  
  // ハートの形状に合わせてセルの背景色を赤に変更
  sheet.getRange("E5:F5").setBackground("red");
  sheet.getRange("D6:G6").setBackground("red");
  sheet.getRange("C7:H7").setBackground("red");
  sheet.getRange("C8:H8").setBackground("red");
  sheet.getRange("D9:G9").setBackground("red");
  sheet.getRange("E10:F10").setBackground("red");
  sheet.getRange("F11").setBackground("red");

  // セルのサイズを正方形に調整
  sheet.setColumnWidths(1, 26, 21); // 21 pixels
  for(var i = 1; i <= 100; i++) {
    sheet.setRowHeight(i, 21);
  }
}


実行結果(今ひとつ)

何回か試した結果

ハートの図形(グラフ)

次に、Google Colabからメールを送ってみましょう。
問い:Google Colabからメールを送信するサンプルを生成してください。

import smtplib
from email.mime.text import MIMEText

def send_email(subject, body, to_email):
    # Gmailの認証情報
    gmail_user = 'your_email@gmail.com'
    gmail_password = 'your_password'
    
    # メールの設定
    msg = MIMEText(body)
    msg['From'] = gmail_user
    msg['To'] = to_email
    msg['Subject'] = subject
    
    # Gmailでのメール送信
    try:
        server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
        server.ehlo()
        server.login(gmail_user, gmail_password)
        server.sendmail(gmail_user, to_email, msg.as_string())
        server.close()

        print('Email sent!')
    except Exception as e:
        print('Something went wrong:', e)

# 使用例
send_email('Hello from Colab', 'This is a test email sent from Google Colab.', 'recipient@example.com')

Gmailのメールアドレスやパスワードを入れなければいけないようです。入力したとしてもGmailの認証関係でエラーとなってしまいました。

Something went wrong: (534, b'5.7.9 Application-specific password required. Learn more at\n5.7.9  https://support.google.com/mail/?p=InvalidSecondFactor c15-20020a17090a020f00b002776288537fsm5654990pjc.53 - gsmtp')

この辺のエラーを解消するにはプログラミングの知識ではなく、Gmailの仕様などを理解する必要がありそうです。

ポイント6)日本語は難しい

ハートの図形を描いたときのタイトルに注目します。

ハートの図形

Heart Shapeの部分を日本語化してみます。

文字化け

□(トーフ)で表示されて「ハートの図形」が表示されません。これを文字化けと言います。文字コードが異なるとかフォントがないなどのいくつかの理由で発生します。
この場合はGoogle Colab上で日本語フォントをインストールして実行する必要があります。

!pip install japanize-matplotlib

import japanize_matplotlib

japanize_matplotlib.japanize()

# 3. プロットを再度描画
import numpy as np

# ハートの図形を定義
t = np.linspace(0, 2 * np.pi, 1000)
x = 16 * np.sin(t)**3
y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)

# ハートの図形を描画
plt.figure(figsize=(6,6))
plt.plot(x, y, 'r')
plt.title("ハートの図形")
plt.axis("equal")
plt.axis("off")
plt.show()
日本語の出力

いくつか方法はありますが、日本語などのローカルな話は検索したほうが早い場合があります。ローカルな話は生成AIだけでなく検索も活用するのが良いと思います。

以上、ハートの図形を描くで伝えたかったメッセージです。

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