いまからわかる!ChatGPT活用プログラミング

ChatGPTのおさらいと、プログラミングに活用するための第一歩

はじめに

こんにちは! 逆瀬川@gyakuseです! 今日から数回にわたって連載していきます。

この連載では、OpenAIが提供しているChatGPTや、それらのAPIを用いてプログラミングに活かすことを目的とした内容を取り扱っていきます。これからChatGPTを使おうと思っている人、ChatGPTでサービスを作ってみたい人などの助けになればと思います。

ChatGPTとは?

はじめに、ChatGPTについておさらいをしていきましょう。

ChatGPTとはOpenAIが2022年11月にリリースしたGPT-3 (またはGPT-4) という言語モデルを使ったチャットサービスです。GPTは「Generative Pre-trained Transformer」の略であり、日本語で無理解釈すると、生成事前学習済みトランスフォーマーモデルのことを指しています。これだけだとあんまり言語モデル感はありません。しかし、最近のGPT-4のマルチモーダル化(画像などを解釈する能力の付与)を見ると、GPTという語には任意の表現を受け取り、新たな表現を生成するといった野心を感じさせられます。

なお、Transformerは2017年に発表されたAttention Is All You Needという機械翻訳タスクのための論文で登場し、以降、言語や画像など多くの分野で活用されています。

GPT-3やGPT-4は、なにでできているの?

GPT-3はCommon Crawlという大規模Webクロールテキストなどからできています。Common Crawlはトレーニング時の重みとして実に60%を占めています。このうち各言語の含有率は英語が50%程度であり、日本語は5%です。

表1 GPT-3の構成要素(出典:Language Models are Few-Shot Learners
データセット データセットの規模(トークン) データセットの寄与度
Common Crawl(filtered) 410 billion 60%
WebText2 19 billion 22%
Books1 12 billion 8%
Books2 55 billion 8%
Wikipedia 3 billion 3%

大量の文章から学習することで、多言語を取り扱う能力だけでなく、高度な推論能力まで手に入れました。

GPT-3.5、とりわけその初期モデルのCodexはGitHubに存在する5400万の公開リポジトリから採取された159GBのPythonコードでGPT-3をfine-tuning(微調整)することで生まれました。ChatGPTがとりわけPythonが得意なのはここから来ています。

ChatGPTの学習データを考えることはその能力を発揮させるときに極めて有効です。質問時も以下のように、⁠涼宮ハルヒの憂鬱』というライトノベル作品について日本語で聞いたときはSOS団の略称を間違えるなどしますが、英語ではほぼ期待通りの回答を見せます。

図1 『ハルヒの憂鬱』について日本語で聞いた場合の回答
「涼宮ハルヒの憂鬱について教えて」「涼宮ハルヒの憂鬱(英:The Melancholy of Haruhi Suzumiya)は、日本のライトノベルシリーズで谷川流著、いとうのいぢによるイラストです。2003年から2009年まで、角川スニーカー文庫から刊行されました。シリーズは、中学生の涼宮ハルヒが、キョンという男子高校生と会い、彼の助けを借りて、SOS団(スペース・オペラ・サポート団)という部活を設立するところから始まります。」
図2 『ハルヒの憂鬱』について英語で聞いた場合の回答
「Tell me about The Melancholy of Haruhi Suzumiya.」「"The Melancholy of Haruhi Suzumiya" (涼宮ハルヒの憂鬱, Suzumiya Haruhi no Yūutsu) is a Japanese light novel series written by Nagaru Tanigawa and illustrated by Noizi Ito. The series was first published in June 2003 and has since been adapted into various media formats, including anime, manga, and video games. The story follows the high school life of a seemingly ordinary student, Kyon, who becomes involved with the eccentric Haruhi Suzumiya. Haruhi is a bright and energetic girl with a fervent interest in supernatural phenomena, such as aliens, time travelers, and espers (individuals with psychic abilities). To indulge her curiosities, she forms the SOS Brigade, a school club that seeks to discover and interact with supernatural entities.」

知ったかぶりをするChatGPT

ところで、ChatGPT(GPT-4)にChatGPTのことを聞いてみると、やっぱり分かりやすい文章が返ってきます。なお、ここで用いるGPT-4は2023年3月現在は有料会員であるChatGPT Plusでのみ利用可能となっています。

図3 ChatGPTについてChatGPTに聞いてみた結果
「ChatGPTってなに?」「ChatGPTは、OpenAIによって開発された大規模な言語モデルです。GPTは「Generative
Pre-trained Transformer」の路で、自然言語処理タスクで高い性能を発揮するために設計された深層学習アーキテクチャです。これは、インターネット上で入手可能な大量のテキストデータを利用して事前学習され、その後特定のタスクに適用するためにファインチューニングされます。ChatGRTは、自然言語の理解と生成に優れており、ユーザーとの対話を通じて質問に答えたり、アドバイスを提供したりすることができます。ただし、ChatGPTの知識は2021年9月までのものであり、それ以降の出来事や情報に関しては知らないことに注意してください。また、ChatGPTはAIであるため、常に正確であるとは限らず、場合によっては誤った情報や不適切な回答を提供することがあります。」

ChatGPTが答えてくれたように、ChatGPTに使われているGPT-4やGPT-3.5は2021年9月までしか知識がありません。しかし、ChatGPTという2022年11月にリリースされたサービスについて知っているように答えます。そこで、以下のように問い詰めてみました。

図4 ChatGPTのリリース日について
「ChatGPTはいつリリースされましたか?」「ChatGPTは、2021年に最初にリリースされました。2021年の初めに、OpenAlはGPT-3モデルをベースにしたAPIを一部の開発者や企業に向けて提供し始めました。その後、同年後半には、より広範囲のユーザー向けにアクセスが拡大されました。私が使っているモデルは、このGPT-3モデルをベースにしています。ただし、この回答は2021年9月までの情報に基づいていますので、その後のリリースやアップデートについてはわかりません。」

どうやら「ChatGPT」をGPT-3と混同しているようです。この返答から分かるように、ChatGPTは「知ったかぶり」をします。嘘をつく、とよく言われますが、どちらかというとこの「知ったかぶり」という言い方のほうが彼らの振る舞いとしてうまく表現できている気がします。こうした知ったかぶり能力はhallucination (幻覚) と呼ばれます。GPT-4においてはその低減により注力してモデルのトレーニングが行われ、以下の図に見られるように事実性の評価指標で高い精度を実現しましたが、それでも完全なものとは言えません。

図5 GPT-4と以前のモデルとの正確性の比較(事実性評価。出典:GPT-4 Technical Report
図5

一方で、先の質問・回答に見られたように、一定以上の賢さをもっています。この、人間らしく考えられる能力を持ったAIをどのように活用していくかを考えるのは、これから先エンジニアとして活動する上でも必要不可欠になってくるでしょう。

プロンプトエンジニアリング

ChatGPTに問い合わせをするときの文章を「プロンプト」と言います。プロンプトエンジニアリングは、プロンプトを構築するための技術です。日本語でこれを体系づけて説明した資料は残念ながら少ないのですが、英語資料としてはPrompt Engineering GuideLearn Promptingのような優れたものがあります。

ここでは軽く、すぐ使える便利な技法を紹介しておきます。

「あなたは○○です」

awesome-chatgpt-promptsで紹介されている技法です。たとえばUI/UXリサーチャーとしての意見を貰いたい場合は以下のようなプロンプトを最初に投げかけます。

UX/UI開発者として活躍してほしい。アプリ、ウェブサイト、その他のデジタル製品のデザインについて詳細を説明します。ユーザー エクスペリエンスを向上させるための創造的な方法を考え出すのがあなたの仕事です。これには、プロトタイピング プロトタイプの作成、さまざまな設計のテスト、最適な設計に関するフィードバックの提供が含まれる場合があります。私の最初のリクエストは、「新しいモバイル アプリケーション用の直感的なナビゲーション システムの設計を手伝ってほしい」です。

Zero-Shot CoT

CoT (Chain-of-Thought) とは中間の推論ステップを用いて推論能力を向上させるための仕組みです。Zero-Shot CoTは質問文章に「Let's think step by step.(段階的に考えてください⁠⁠」を追加するだけで推論能力が向上することを示しました。この手法はとても強力かつシンプルで、いますぐ使えます。また、⁠段階的にかつ論理的に考えてください」とすることで、より論理性が増します。

X-Prompt

特定の概念に変数を定義して呼び出す手法です。論文で言及されているように、画像生成におけるTextual Inversion技法と似ています。最近のプロンプトデザイン等でもこの派生系が使われています。

ChatGPTがプログラミングでできること

次に、プログラミングの際にChatGPTを活用することを考えてみます。

ChatGPTのオプトアウト

まずはじめに、業務でもしChatGPTを使う場合はOpenAIのフォームからプロンプト(質問)のオプトアウトを申請する必要があります。

APIはデフォルトでオプトアウトですが、ChatGPT自体はデフォルトがオプトイン(学習対象であり、かつ会話が確認されうることを理解しておきましょう。DeepLのフリー版なども含め、機械学習系のプロダクトは機密情報をうっかり入れると学習されてしまいます。

どのように使うか

主要な使い方は以前わたしがQiitaに掲載したChatGPT使い方総まとめを参考にしてください。また、いくつかのプロダクトの原型も記事にしていますので、そちらも参照してみてください。

エンジニアがChatGPTを使うときは大きく分けて以下の用途があり得るでしょう。

  • 実装理解
    • 実装説明生成
    • アルゴリズム解説
  • 設計
    • 仕様書作成
    • DB設計作成
    • アーキテクチャ図生成
  • 実装
    • コード生成
    • テスト生成
  • ドキュメント
    • コメント生成
    • ドキュメント生成
  • サービスへの活用
    • インターフェースとしての対話システム導入
    • モジュールとしての文章生成・要約・選択処理

設計、実装、ドキュメント等ではすでに優れた記事が出てきているので他に譲り、ここでは特に有用である実装理解とサービス活用についてフォーカスして説明します。

実装理解

ChatGPTの能力のうち、実装の理解補助がもっともエンジニアの助けになるものだと思います。

たとえば、わたしは以前英語のYouTube動画に日本語字幕を自動でつけてみる!という記事をQiitaに掲載しました。このシステムでの実装はじめてMoviePyを触る人にとっては分かりづらいです。わたしも今回改めて読んでみてナニコレ状態になりました(記憶が消滅しやすいので……⁠⁠。そこで、この実装におけるMoviePyを用いた字幕生成部分についてChatGPTに聞いてみましょう。

あなたは優秀なソフトウェアエンジニアです。
以下のコードについて段階的にかつ論理的に考えて、実装の内容を説明してください。

```
from moviepy import editor
from moviepy.video.io.VideoFileClip import VideoFileClip
import budoux

def generate_subtitle(vid, transcribe, max_line_length = 14, max_lines = 2):
    input_file_name = video_folder + f"{vid}.mp4"
    output_file_name = video_folder + f"{vid}_subtitle.mp4"
    video = VideoFileClip(input_file_name)
    annotated_clips = []
    last_end = 0
    for segment in transcribe['segments']:
        seg_start_sec = int(segment['start'])
        seg_end_sec = int(segment['end'])
        seg_text = segment['text']
        result = translator(seg_text)
        seg_text = result[0]['translation_text']
        if last_end != seg_start_sec:
            print("skip: %s to %s" % (last_end, seg_start_sec))
            annotate_seg = video.subclip(last_end, seg_start_sec)
            annotated_clips.append(annotate_seg)

        seg_all_sec = seg_end_sec - seg_start_sec
        parsed_text_list = sentence_parse_and_line_parse(seg_text, max_line_length, max_lines)
        section_per_sec = int(seg_all_sec / len(parsed_text_list))
        print("jimaku: %s to %s" % (seg_start_sec, seg_end_sec))
        if section_per_sec == 0:
            section_per_sec = 1
        for i, parsed_text in enumerate(parsed_text_list):
            section_start_sec = seg_start_sec + section_per_sec * i
            section_end_sec = seg_start_sec + section_per_sec * (i + 1)
            if i == (len(parsed_text_list) - 1):
                section_end_sec = seg_end_sec
                print("    ketsu: %s" % section_end_sec)
            if section_end_sec >= video.duration:
                section_end_sec = None
            annotate_seg = annotate(video.subclip(section_start_sec, section_end_sec), parsed_text)
            print("    section start: %s, end: %s, text: %s" % (section_start_sec, section_end_sec, parsed_text))
            annotated_clips.append(annotate_seg)

        last_end = seg_end_sec
        print(last_end)
    
    print(f"last_end is {last_end} and video.duration is {video.duration}")
    if last_end != None and video.duration >= last_end:
        print("skip: %s to %s" % (last_end, video.duration))
        annotate_seg = video.subclip(last_end, None)
        annotated_clips.append(annotate_seg)
    final_clip = editor.concatenate_videoclips(annotated_clips)
    final_clip.write_videofile(output_file_name, audio_codec="aac")
```

これをChatGPT(GPT-4)に聞いてみると以下のように返答してくれます。

このコードは、与えられた動画ファイルに字幕を追加するPythonプログラムです。具体的には、次の手順で処理が行われます。

  1. 必要なライブラリとモジュールをインポートする。
  2. generate_subtitle関数を定義する。この関数は、以下の引数を受け取ります。
    • vid: 入力動画ファイルの名前(拡張子.mp4を除く)
    • transcribe: 字幕の情報が入った辞書型データ
    • max_line_length: 1行の字幕の最大文字数
    • max_lines: 1つのセクションに表示する最大行数
  3. 入力ファイル名と出力ファイル名を生成します。
  4. 入力ファイルからVideoFileClipオブジェクトを作成します。
  5. トランスクリプトの各セグメントについて、字幕を付け加えたクリップを作成し、annotated_clipsリストに追加します。
  6. 最後のセグメントの終わりから動画の終わりまでの区間があれば、その部分のクリップもannotated_clipsリストに追加します。
  7. annotated_clipsリストに格納されたクリップを連結して、最終的な動画を作成します。
  8. 作成した動画を出力ファイル名で保存します。

このプログラムは、moviepyライブラリを使用して動画を操作し、budouxライブラリを使用してテキストの改行処理を行っています。また、このコードは、与えられたトランスクリプトデータtranscribeから字幕を生成し、動画に追加する部分のみを示しています。実際に動作させるためには、トランスクリプトデータを生成する関数や、テキストを翻訳・改行するための関数、動画に字幕を追加する関数annotateなどが必要です。

この威力を見ると、ドキュメントの未来も見えてきます。いままでわたしたちは老化していくドキュメントに悩まされていましたが[1]、これからはおそらくpull-request時にドキュメントは自動で更新され、それを確認し必要な箇所を修正するだけで良いというフローが生まれてくるでしょう。

サービスへの活用

ChatGPTを活用したサービスは無数に考えられます。特に、サービスのフローにおいて「人が介入している部分(人が入力する場所を自動化するなど⁠⁠」の自動化や「人が介入する部分に対する言語補助(要約等でわかりやすく表示するなど⁠⁠」を意識すると、アイデアが思いつきやすいです。

また、awesome-chatgpt-promptsで見られるように、ChatGPTはなりきりチャットが得意です。そのため、アドバイザーやコンサルのような領域では専門家に相談する前の簡易相談相手として活躍してくれるでしょう。

さらにMakeやZapierなどのIPaaS系のサービスと連携して、モジュールとして活用するとより真価を発揮できます。アイデアに困ったら、Makeなどの対応モジュール一覧を眺めてみるのも良いでしょう。

まとめ

今回は、次の事柄を取り上げました。

  • ChatGPTは大量のテキストを学習した言語モデル
  • データセットにおいては英語が多く、またPythonのコードを大量に学習している
  • エンジニアの活用手段としては実装理解の補助がとても強力
  • サービス活用においては「人間がいままで作業していた部分」の置き換えを意識するとアイデアが出やすい

次回以降は、実際のサービス開発などを題材にしてChatGPTの活用の具体例を示していければと思います。また、参考文献を以下に示します。歴史順に並んでいるので、なぜ言語モデルがここまで上手くいっているのかもっと知りたいかたはぜひ読んでみてください。

参考文献

おすすめ記事

記事・ニュース一覧