トピック

ChatGPTの「Code Interpreter」のスゴさ ノーコードでデータ分析&画像生成

ChatGPTに「Code Interpreter」という新機能が追加されました。その名の通りプログラミングコードの生成・実行が可能になるものです。プログラミングになじみのない人には縁遠いように思われるかもしれませんが、ユーザー自身がコードを書く必要はないので、むしろプログラミングがわからない人にこそ使ってほしい機能です。

今回は、Code Interpreterを利用することでどんなことができるのか、プログラミングがわからない人がどう活用できそうかなど、いくつか例を挙げながら解説していきたいと思います。

Code Interpreterとは?

初めにCode Interpreterがどういうものなのか簡単に説明しましょう。

Code InterpreterはChatGPTの有償サービス「ChatGPT Plus」(月額20ドル)登録ユーザー向けに提供されている機能です。2023年8月現在は、設定画面の「Beta features」から同機能をオンにすることで、GPT-4によるチャットを新規に開始するときに利用できます。

設定画面の「Beta features」にある「Code interpreter」をオンに
「GPT-4」を選び、「Code Interpreter」をクリックして新規チャットを開始する

Code Interpreterを有効にした状態でチャットで質問・指示すると、これまで通りGPT-4を用いた自然言語による回答を得ることができます。しかし回答にプログラミングによる処理が必要と判断されたときは、そのプログラムコードと処理内容の解説、さらにはそのコードを実行したときの処理結果まで表示してくれます。

質問の回答にプログラム処理が必要なときは、コードと解説が表示され、必要に応じて実行結果も表示する

生成されるコードはPython言語で、サーバー上の仮想的なPython実行環境でそのコードが処理され、チャット画面に結果表示する仕組みです。そのため、ユーザーの端末にPythonや関連するライブラリなどがインストールされている必要はありません。誰でもPythonによるプログラムをお手軽かつ安全に生成・実行できるわけです。

ドラッグ&ドロップで質問に関連するファイルをアップロードすることも可能

また、チャット画面に任意のファイルをアップロードでき、そのファイル内のデータを処理するコードの生成も可能になっています。たとえば何らかのログデータが含まれたCSVファイルをアップロードして、中身を処理するPythonコードを生成し、ログ分析の結果を出力するようなこともできます。

以上、Code Interpreterでできること、メリットを改めて整理すると以下の通りです。

  • Python実行環境がなくてもコードの生成・実行が可能
  • ファイルのアップロードと、そのファイルを対象にした処理が行なえる
  • コードに加えて解説も表示されるため、Python学習者の役に立つ
  • コード内で各種ライブラリを利用できるため処理できる範囲が広い

一方で制約もあります。特に気を付けておきたいのは、コード内からインターネットにアクセスできないことです。たとえばWebサイトにアクセスしてそのページデータを元に何らかの処理をしたり、Web上のファイルをダウンロードしたり、といったようなコードは生成できても実行はされません(もしくは実行に失敗します)。

ライブラリが内部的にインターネットにアクセスしてデータを取得するようなケースもこれに該当します。それに伴い、一部のライブラリでは日本語の処理ができない場合もあります。Code InterpreterのPython実行環境は、ネットにつながっていないスタンドアロンなコンピューター上にあるもの、と理解しておくと良いでしょう。

インターネットへのアクセスが必要な処理は実行できない

なお、Code Interpreterをフルに使えるのは現在のところWeb版のみとなります。iOSアプリやAndroidアプリでは新規にチャットを開始するときにCode Interpreterを選ぶことができません。Web版で作成したチャットの続きから利用することは可能ですが、ファイルのアップロードには対応しないこと、セッションタイムアウトまでの時間が短く、タイムアウトするとアップロードしたファイルやチャットの文脈が保持されないことに注意してください。

アプリから新規でCode Interpreterを開始することはできないが、Web版からの続きを利用することは可能

Code Interpreterのいろいろな使い方

では、Code Interpreterを使うことでどんなことができるのか、いくつか例示してみたいと思います。

実現したい処理やアルゴリズムのコードを生成する

最もシンプルな使い方として考えられるのは、ユーザーの欲しいプログラミングコードや処理結果を得るというものです。たとえば円周率を求めるアルゴリズムを知りたいときは下記のように質問します。回答内容は質問するごとに変わる場合があります。

円周率を求めるアルゴリズムを要求したときの画面
質問

100桁までの円周率を求めるアルゴリズムを生成し、実行してください

ChatGPTの回答(抜粋)

円周率を計算するためのさまざまな方法がありますが、ここでは特に有名で効率的なアルゴリズムである「ベイリー–ボロウィン–プラウフェッカーの公式(BBP公式)」を使用します。


def compute_pi(precision):
decimal.getcontext().prec = precision + 2 # increase precision to account for intermediate calculations
decimal.getcontext().Emax = 999999999
decimal.getcontext().Emin = -999999999
decimal.getcontext().rounding = decimal.ROUND_DOWN
one = decimal.Decimal(1)
sixteen = decimal.Decimal(16)


円周率の最初の100桁の近似値は以下の通りです:
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170675

Pythonには円周率を高速に求めるためのライブラリが用意されており、Code Interpreterではそれを利用したコードの生成・実行もできます。が、上記のように基本的なアルゴリズムを理解して原理的なところを学ぶ、といったような使い方も便利です。

CSVデータを読み込んでグラフ化する

Code Interpreterの最大の特徴の1つが、ファイルをアップロードできることです。これはChatGPTの通常のチャットにない機能で、応用次第でChatGPT自体の活用範囲が広げられる面白いポイントと言えます。

ファイルアップロード機能のよくある使い道としては、CSVファイルなどの構造化データを読み込んで集計・統計処理を行なうものです。下記画像の例は、筆者がスマート体組成計で数年間記録してきたヘルスデータのCSVファイルをアップロードし、週平均の体重の推移をグラフ化したものです。

ヘルスデータのCSVファイルをアップロードしてグラフ化する例

CSVファイルに含まれる体重のデータをきちんと認識し、グラフ表示してくれました。グラフ化するだけならMicrosoft Excelなどの表計算ソフトでも難しくはありませんが、今回のように「週平均」を算出しながら見やすいグラフにするにはそれなりに手間がかかります。他人に見せる資料として作るのではなく、とりあえず自分だけが把握できればいいというような場面で、手早くグラフ作成してくれるCode Interpreterはうってつけです。

ちなみに、グラフ内の文字は標準で日本語に対応していないため、そのままでは文字化けすることがあります。これを防ぐには別途Google Fontsなどからフォントファイルをダウンロードし、CSVファイルと同じようにアップロードしてグラフ描画にそのフォントを使うように指示します。

場合によってはグラフ内の日本語が文字化けすることがある
そのときはGoogle Fontsなどからフォントをダウンロード
ChatGPTにアップロードして新しいフォントを使うように指示すれば文字化けを解消できる

XML/JSON形式のデータを読み取んでグラフ化、または統計データにする

CSV形式をはじめ、XML形式やJSON形式などの構造化データを読み取って処理するのはCode Interpreterの得意とするところです。

下記1つ目の例は、とあるベンチマークソフトから出力されたXMLファイルをアップロードし、その中の「~score」という要素の値だけを抽出して横向きのグラフで表示したものです。そのためにはどういったライブラリを使用するのか、といったことも解説してくれるので、今後プログラムでXMLデータを扱うときの参考にもなります。

ベンチマークソフトから出力されたXMLファイルをもとにグラフを生成する例

2つ目の例はJSON形式のデータを扱う例です。ただし、適切なJSONデータが手元になかったため、ここではその元となるJSONデータ自体をCode Interpreterで生成するところから始めてみました。とりあえず架空の個人情報を生成してみます。

質問

架空の個人情報データを10人分生成し、JSON形式のデータで表現してください

ChatGPTの回答(抜粋)

以下に、10人分の架空の個人情報をJSON形式で生成した結果を示します:

[
{
"name": "岡田 幹",
"age": 67,
"email": "hiroshishimizu@hotmail.com",
"address": "富山県鴨川市雷門17丁目27番8号 松石ハイツ716"
},


{
"name": "長谷川 直子",
"age": 49,
"email": "sayuri67@yahoo.com",
"address": "徳島県中央区丸の内JPタワー16丁目17番11号"
}
]

架空の個人情報を生成するにあたっては、普通にChatGPTに指示して名前、年齢、住所などを列挙してもらう方法もあります。ただ、その場合はランダム性が低く、「それっぽくない」データになってしまう場合があります。

従来の方法でChatGPTに架空の個人情報を生成してもらった場合。一郎、二郎、三郎のように、名前が単純なパターンになっている
Code Interpreterで架空の個人情報を生成してもらった場合。ランダム性の高い名前などになっている

Code Interpreterを利用したデータ生成では、「Faker」というPythonライブラリを使用しており、それによってもっともらしいダミーデータになっています。架空の情報とはいえ名前と性別、名前とメールアドレスが一致していない感じはありますが、このあたりは質問時に条件として追加することで改善されるでしょう。

次に、このJSON形式のデータをいったんローカルにファイル保存し、それをCode Interpreterにアップロードして統計情報を得たいと思います。

質問

このデータを元に、年齢、性別の統計を表であらわしてください
添付ファイル:people.json

ChatGPTの回答(抜粋)

データに基づいて、以下の統計を得ました:

年齢の統計:
サンプル数: 10
平均年齢: 37.5歳
標準偏差: 13.79
最小年齢: 24歳
25パーセンタイル(下側四分位数): 25歳
中央値(50パーセンタイル): 35.5歳
75パーセンタイル(上側四分位数): 48歳
最大年齢: 59歳

性別の統計:
女性の数: 7
男性の数: 3

生成された個人情報をもとに統計情報を出力してもらった例

JSON形式のデータが問題なく処理され、統計情報を得ることができました。Code Interpreterであればアップロードしたデータ形式がCSVでも、XMLでも、JSONでも、自動的に認識して適切に処理するコードを提示してくれます。簡易的なデータ分析もその場で完結してしまうので、わざわざExcelを駆使するようなこともなくなるかもしれません。

PDFファイルの内容を要約する

Code Interpreterでアップロードできるファイルはテキスト形式のデータに限りません。PDFのようなバイナリデータももちろんアップロードし、処理できます。たとえば中身がテキストデータメインのPDFファイルから文章だけを抽出して、その要約を作ってもらうところまで自動化することも可能です。

質問

PDFMinerを使って、4ページ目までのテキストを抽出してください
添付ファイル:baitai2307c.pdf

ChatGPTの回答(抜粋)

了解しました。PDFMinerを用いて、PDFファイルから4ページ目までのテキストを抽出します。ただし、PDFの構造やフォーマットによっては、完全に正確な抽出が難しいこともあります。それでは、コードを実行してみましょう。


Impress Watchシリーズ
「YouTubeチャンネル」開設のご案内

Impress AD Guide
[Consumer Media]

2つの専門YouTubeチャンネル、始めました!

PDFからテキスト抽出してもらった例
質問

その内容を300文字程度で要約してください

ChatGPTの回答(抜粋)

このPDFは、Impress Watchシリーズが2つの専門YouTubeチャンネルを開設し、それぞれのチャンネルが特化した内容を動画で発信していくことを案内しています。また、同シリーズでは、月間約2億78万PV、月間3,200万UU超のオーディエンスデータを活用した広告メニューが提供されています。さらに、動画広告の提供が新たに開始され、再生保証を含む広告プランが提供されています。また、ネイティブアド(誘導枠)の提供も開始され、オウンドメディア等への誘導が可能になっています。

ここではImpress Watchの媒体資料を対象に処理してみました。最初に「PDFMiner」というライブラリを使うように指示していますが、これは単に「テキストデータを抽出してください」としただけでは他のライブラリが使われ、正しく読み込めないことがあったためです。

また、最初に「要約してください」とだけ指示した場合も期待通りの結果にならないことがあり、要約の生成を別途要求しています。うまくいかないときは似た質問を何度か繰り返したり、要望を段階的に追加していくことで解決策を見い出せることもあります。

そんなわけで、指示の仕方に若干コツが必要とはいえ、日本語PDFの内容もしっかり読み込むことができました。PDFでもらった資料や論文などの内容をできるだけ短時間で把握したいときにも、Code Interpreterは役に立ちそうです。また、コードに少し手を加えてローカルで実行できるようにすれば、大量のPDF資料を一括で要約するのも簡単でしょう。

画像データからテキストをOCRで抽出する

テキストベースのデータだけでなく、画像内にある文字を認識してテキストデータとして抽出することもできます。いわゆるOCRと呼ばれる手法ですが、PythonにはOCR用のライブラリも用意されているため実現は容易です。ここでは試しに実体が画像の領収証PDFファイルをアップロードし、日時や金額を抽出してみます。

質問

これは領収書画像のPDFファイルです。この中から購入日時、支払額、支払い先をテキストで抽出してください
添付ファイル:sample_receipt.pdf

ChatGPTの回答(抜粋)

PDFファイルからテキストを抽出するためには、PythonのライブラリであるPyPDF2やPDFMinerなどを使用します。しかし、PDFが画像ベースである場合(つまり、テキストが直接読み取れない場合)は、OCR(光学式文字認識)を使用する必要があります。Pythonのpytesseractライブラリはこの目的によく使用されます。


抽出した結果は以下の通りです:

購入日時: 2023年4月7日 10:17
支払額: 各パターンにマッチしたものは '¥191', '¥17', '¥191' ですが、これはおそらくノイズや抽出の誤りでしょう。領収書の支払い総額を示す部分が正しくOCRできていない可能性があります。
電話番号: '03-xxxx-xxxx' この番号が支払い先の連絡先である可能性があります。

画像ベースのPDFをOCRでテキスト抽出する例。日本語に対応するのは不可能なようだ

この例ではあまりうまくいきませんでした。現在はCode Interpreterで扱うOCRライブラリが日本語に対応できない状況のため、認識精度がことさら低下している可能性があります。今のところ日本のユーザーにとっては、Code Interpreterを用いたOCRは実用性が乏しいように思われます。

ロゴマークなど単純な画像を生成する

なんと、Code Interpreterでは画像生成も可能です。あくまでもPython自体や一般的なライブラリが対応可能な範囲での画像生成となるため、昨今の画像生成AIのような緻密なグラフィックを描き出すことはできません。が、図形や文字を組み合わせたロゴくらいなら問題なくこなせます。

質問

あなたの考えるカッコいいChatGPTのロゴを描画してください。丸い背景の上に「ChatGPT」という文字で構成されるカッコいい画像をお願いします。標準フォントで、全体の配色はお任せします

ChatGPTの回答(抜粋)

私はAIであるため、アートやデザインの主観的な価値を評価する能力は持っていませんが、指定された要件に基づいてシンプルなロゴを生成することはできます。以下にPythonのmatplotlibとPILライブラリを使用して描画します。ただし、専門的なグラフィックデザインツールを使用したプロフェッショナルなロゴデザインには及ばないことをご了承ください。

以上の画像は、「ChatGPT」の文字を含むシンプルなロゴです。ライトブルーの円形の背景の上に、黒い標準フォントで「ChatGPT」の文字が配置されています。このロゴはあくまで例示であり、よりプロフェッショナルなデザインが必要な場合は、専門的なグラフィックデザイナーに依頼することをお勧めします。

このように複雑ではない画像の生成は可能ですが、反対に画像の内容を認識することはできません。たとえば人物写真をアップロードして「表情から感情を推測して」などと指示しても処理は不可能ですし、ごくシンプルな日本地図をアップロードしてもそれが何であるかは理解できません(ファイル名がjapan.pngであれば「日本(の地図)」であると勝手に判断しますが、日本地図をusa.pngというファイル名にすると米国の地図と誤認識します)。

国土地理院の日本地図をアップロードし、東京にマークしてもらおうとした例。画像内容は解析できないため単純に中央にプロットされた
「usa.png」というファイルをアップロードしているが、実体は上記の日本地図の画像。ファイル名に引っ張られて米国地図と思われてしまった

圧縮ファイルをアップロードして処理する

ここまでチャットで質問するごとに1ファイルずつアップロードしてきましたが、複数ファイルを一度にまとめてアップロードすることもできます。手順は、複数のファイルをZIP形式などで1つに圧縮し、その圧縮ファイルをアップロードするだけです。

最初のCSVファイルをアップロードする例では、一度グラフを描画し、文字化けしていたときはさらにフォントファイルをアップロードして再描画していました。でも、CSVとフォントを1つのファイルに圧縮してアップロードすれば、少ない手間で文字化けのない(見栄えのいい)グラフが得られます。

質問

このアーカイブに含まれるCSVファイルをもとに、1週間ごとの体重の平均をグラフにしてください。グラフ内の文字表示にはこのアーカイブ内にあるフォントファイルを使ってください。
添付ファイル:body.zip

ChatGPTの回答(抜粋)

了解しました。まず、アーカイブを解凍し、その内容を確認しましょう。


bodyフォルダ内には以下のファイルがあります:

CSVファイル:BodyComposition_201901-202307.csv
フォントファイル:NotoSansJP-VariableFont_wght.ttf


今回は「測定日」と「体重(kg)」のデータを使用して、1週間ごとの体重の平均を計算し、グラフを描きます。まず、測定日を日付型に変換し、週ごとにデータをグループ化しましょう。その後、各週の平均体重を計算します。また、指定されたフォントをmatplotlibで使えるように設定します。

圧縮ファイルでまとめてアップロードし、日本語でグラフ描画してもらった例

コードは意識せずプログラムの実行結果を得る目的に使うのもアリ

具体的なPythonコードを示すとともに、あらゆる形式のデータ処理に加えて画像生成も可能なCode Interpreterは、趣味や業務でプログラミングしている人の助けになることは間違いありません。

コード部分は意識せず、要求した結果だけを確認する使い方でも全く問題ないので、プログラミングに苦手意識のある人にとっても便利に活用できるはずです。用途によっては日本語対応がまだ不十分に感じられる部分はありますが、常に進化し続けているChatGPTですから、今後もどんどん改善して使いやすくなっていくことでしょう。

日沼諭史

Web媒体記者、IT系広告代理店などを経て、フリーランスのライターとして執筆・編集業を営む。AV機器、モバイル機器、IoT機器のほか、オンラインサービス、エンタープライズ向けソリューション、オートバイを含むオートモーティブ分野から旅行まで、幅広いジャンルで活動中。著書に「できるGoProスタート→活用 完全ガイド」(インプレス)、「はじめての今さら聞けないGoPro入門」(秀和システム)、「今すぐ使えるかんたんPLUS+Androidアプリ 完全大事典」シリーズ(技術評論社)など。Footprint Technologies株式会社 代表取締役。