【実例】ChatGPTでコード生成~Code interpreterも解説

  • 2023.07.25
  • AI
【実例】ChatGPTでコード生成~Code interpreterも解説

【実例】ChatGPTでコード生成~Code interpreterも解説

はじめに

近年、生成AIの進化により、プログラミングの世界も大きな変革を遂げています。特に、OpenAIが開発したChatGPTは、その高度な自然言語処理能力により、コード生成の新たな可能性を切り開いています。本記事では、ChatGPTにプログラミングコードを書かせる具体的な方法や事例、コツなどを解説します。また、ChatGPT Plusユーザーへの開放が発表されたCode interpreterを活用する方法についても実例を交えてご紹介します。

ChatGPTとは

ChatGPTは、OpenAIによって開発された大規模な言語モデルです。大量のテキストデータから学習し、人間のように自然な応答を生成することができます。その用途は多岐にわたり、質問応答、文章生成、要約、翻訳、そして本記事の主題であるプログラムの作成など、様々なタスクをこなすことが可能です。

ChatGPTの最大の特徴は、その高度な自然言語処理能力により、人間が理解しやすい形で情報を提供できる点にあります。これにより、プログラミングの初学者がコードを理解する手助けをしたり、経験豊富な開発者が新たな視点でコードを見直すきっかけを提供します。

ChatGPTでコード生成はできるのか

ChatGPTは、コード生成の領域でも優れた結果を示しており、ユーザーが与えた要件に合うプログラミングコードを出力したり、コードのエラー原因を突き止めてより良いコードを生成したりすることができます。特に、PythonやJavaScriptなどのメジャーなプログラミング言語については、大量の学習データが存在すると思われ、これらの言語については高精度なアウトプットが期待できます。

また、ChatGPTは、ユーザーが提供したコードのエラーを特定し、修正案を提供する能力も持っています。そのため、初心者がコードのエラーに直面したときや、経験豊富な開発者が新たな視点でコードを見直す際にも活用が可能です。

ChatGPTを用いたコード生成のメリット

ChatGPTを用いたコード生成には、以下のようなメリットがあります。

  • 時間の節約
    • ChatGPTは、ユーザーが日本語や英語などの自然言語で要件を説明し指示を与えるだけで、それに対応するコードを生成することができます。ChatGPTが一度の回答に要する時間は数秒から長くとも数十秒程度であり、人間が一からコードを考えるよりも時間を大幅に節約することが可能です。複雑なコード生成を一発で成功させることは難しいかもしれませんが、少なくとも開発者がより複雑な問題解決に時間を割くことの助けになることでしょう。
  • エラーの特定と修正
    • ChatGPTは、ユーザーが与えたコードのエラーを特定して修正案を提供することも可能です。そのため、作成したコードのエラー解消やより利便性の高いコードを模索する際にも強力なツールとなります。
  • 多言語対応
    • ChatGPTが対応できるプログラミング言語は多岐にわたります。精度は学習データの量や質によって異なりますが、目的や状況に応じて複数の言語を使うことができることは大きな強みと言えます。
    • 因みに「ChatGPTがコード生成をすることができるプログラミング言語には何がありますか?」という質問をChatGPT(GPT-4)に尋ねたところ、下記のような回答が得られました。

chatgpt-code-generation1 ※GPT-4を使用

  • コスト削減
    • 上述の強みを持つChatGPTですが、GPT-3.5のモデルなら無料、より高性能なGPT-4モデルなら1アカウントにつき月額20ドルで利用することができます。またモデルのAPIを用いる場合も、下記記事で解説しているコストで利用可能です。人間のプログラマーが持つ価値とChatGPTの価値を一概には比較できませんが、コストパフォーマンスの良い手段であると言えます。

これらのメリットは、ChatGPTを用いたコード生成が、プログラミングの学習から実践まで、幅広い領域で有用であることを示しています。

ChatGPTを用いたコード生成の方法

ChatGPTを用いてコードを生成する方法は直感的で、以下のステップに従って行うことができます。

  • 要件の定義
    • まず、生成したいコードの要件を明確に定義します。これは、具体的な機能の説明や解決したい問題の説明などを主に自然言語で言語化することを想定としています。
  • ChatGPTへの入力
    • 次に、定義した要件をChatGPTに入力します。要件はなるべく詳細且つ明確に入力することが重要です。例えば「ユーザーからの入力を受け取り、その入力が数字であるかどうかを判定するPythonの関数を作成してください」という形で要件を入力します。
  • コードの生成
    • 入力された要件に基づいてChatGPTがコードを生成します。
  • コードの確認と調整
    • 要件の複雑さや指示の出し方によっては、一度のやりとりで完ぺきなコードが生成できるとは限りません。そのため生成されたコードを人間の目で確認し、適宜調整することが必要です。
  • エラーの特定と修正
    • 生成されたコードにエラーがある場合、そのエラーメッセージや実行結果の様子を伝える事で修正案を得ることができます。

以上が、ChatGPTを用いてコードを生成する基本的な手順です。

【実例】ChatGPTを使ってコード生成をしてみた

これらのポイントを押さえながら、実際にChatGPTにコードを書かせてみました。今回は、「何のコードを生成するか」のアイデア出しからChatGPT(GPT-3.5を使用)に任せています。

chatgpt-code-generation2

出してもらったアイデアの中から1つを選んでコード生成を指示すると、さっそくコードブロック上にそれらしきコードが出力されます。

chatgpt-code-generation3

ただ、これだけではゲームとしてすぐに機能しなかったため、どのような実行結果になったかやエラーメッセージを伝え、コードの改善を重ねました。下記はそのやりとりの一部です。

chatgpt-code-generation4

chatgpt-code-generation5

複数回の追加指示を経て出来上がったコードが次の通りです。簡易的ではありますが、自然言語(日本語)による指示だけでミニゲームが完成しました。

import pygame
from pygame.locals import *
import os

# クイズの質問と回答データ
questions = [
    {
        "question": "日本の首都はどこですか?",
        "choices": ["A. 東京", "B. 大阪", "C. 京都", "D. 福岡"],
        "answer": "A"
    },
    {
        "question": "世界で最も高い山は何ですか?",
        "choices": ["A. エベレスト", "B. キリマンジャロ", "C. マッキンリー", "D. モンブラン"],
        "answer": "A"
    },
    {
        "question": "太陽系で最も大きな惑星は何ですか?",
        "choices": ["A. 地球", "B. 木星", "C. 火星", "D. 金星"],
        "answer": "B"
    },
    {
        "question": "日本で最も高い山は何ですか?",
        "choices": ["A. 富士山", "B. 北岳", "C. 焼岳", "D. 羊蹄山"],
        "answer": "A"
    },
    {
        "question": "世界で最も人口の多い国はどこですか?",
        "choices": ["A. 中国", "B. インド", "C. アメリカ", "D. インドネシア"],
        "answer": "A"
    }
]

# 初期設定
pygame.init()
clock = pygame.time.Clock()
window_width, window_height = 800, 600
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("クイズゲーム")

# フォントファイルが格納されているディレクトリの絶対パスを取得
font_directory = "C:/Users/Admin/Documents/SourceHanSansJ/OTF/Japanese/"
font_path = os.path.join(font_directory, "SourceHanSans-Medium.otf")

pygame.font.init()
font = pygame.font.Font(font_path, 32)

num_questions = len(questions)
current_question_index = -1  # クイズが始まる前は-1
score = 0

def show_welcome_screen():
    window.fill((245, 245, 245))

    # 「クイズへようこそ」の表示
    welcome_text = "クイズへようこそ"
    welcome_surface = font.render(welcome_text, True, (38, 82, 156))
    welcome_rect = welcome_surface.get_rect(center=(window_width // 2, window_height // 2 - 50))
    window.blit(welcome_surface, welcome_rect)

    # 「スタート」ボタンの表示
    start_button_text = "スタート"
    start_button_rect = pygame.Rect(window_width // 2 - 100, window_height // 2 + 50, 200, 80)
    start_button_rect.inflate_ip(20, 10)  # マージンと余白を広げる
    pygame.draw.rect(window, (38, 82, 156), start_button_rect, border_radius=10)  # 丸みを持たせる

    text_surface = font.render(start_button_text, True, (255, 255, 255))
    text_rect = text_surface.get_rect(center=start_button_rect.center)
    window.blit(text_surface, text_rect)

    return start_button_rect

def show_question():
    question = questions[current_question_index]
    question_text = question["question"]
    choices = question["choices"]
    text_y = 200

    window.fill((245, 245, 245))

    # 問題番号の表示
    question_num_text = f"問題 {current_question_index + 1} / {num_questions}"
    question_num_surface = font.render(question_num_text, True, (38, 82, 156))
    question_num_rect = question_num_surface.get_rect(center=(window_width // 2, 50))
    window.blit(question_num_surface, question_num_rect)

    # 問題文の表示
    question_surface = font.render(question_text, True, (38, 82, 156))
    question_rect = question_surface.get_rect(center=(window_width // 2, 100))
    window.blit(question_surface, question_rect)

    # 選択肢の表示
    for choice in choices:
        choice_surface = font.render(choice, True, (38, 82, 156))
        choice_rect = choice_surface.get_rect(center=(window_width // 2, text_y))
        window.blit(choice_surface, choice_rect)
        text_y += 50

def check_answer(selected_choice):
    global current_question_index, score

    question = questions[current_question_index]
    answer = question["answer"]

    if selected_choice == answer:
        score += 1

    current_question_index += 1

    if current_question_index >= num_questions:
        show_result()
    else:
        show_question()

def show_result():
    window.fill((245, 245, 245))

    result_text = f"クイズ終了! 正解数: {score}/{num_questions}"
    result_surface = font.render(result_text, True, (38, 82, 156))
    result_rect = result_surface.get_rect(center=(window_width // 2, window_height // 2))
    window.blit(result_surface, result_rect)

# クイズ開始前のページの表示
start_button_rect = show_welcome_screen()

# ゲームループ
running = True
while running:
    pygame.event.pump()

    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False
        elif event.type == MOUSEBUTTONDOWN:
            mouse_x, mouse_y = pygame.mouse.get_pos()

            # スタートボタンがクリックされた場合、クイズを開始
            if start_button_rect.collidepoint(mouse_x, mouse_y) and current_question_index == -1:
                current_question_index = 0
                show_question()

            # 選択肢がクリックされた場合、回答をチェック
            if current_question_index >= 0:
                selected_choice = None

                if 100 <= mouse_x <= 400:
                    if 200 <= mouse_y <= 250:
                        selected_choice = "A"
                    elif 250 <= mouse_y <= 300:
                        selected_choice = "B"
                    elif 300 <= mouse_y <= 350:
                        selected_choice = "C"
                    elif 350 <= mouse_y <= 400:
                        selected_choice = "D"

                if selected_choice is not None:
                    check_answer(selected_choice)

    pygame.display.update()
    clock.tick(60)

pygame.quit()

実行後のゲーム画面のイメージです。

chatgpt-code-generation6

chatgpt-code-generation7

続きはHakkyへ

AIカテゴリの最新記事