ChatGPT(GPT-4o)のプログラミング能力検証

May 19, 2024 20:55 · 3617 words · 8 minute read AI ChatGPT

ChatGPTのGPT-4oが公開されました。GPT-4oを絶賛する記事で溢れているので、どのくらい進化したのか試してみます。 比較対象は丁度1年前に書いたこちらの記事。

ChatGPTにChrome拡張を作ってもらった · kapieciiのブログ

今回もChatGPTにちょっとしたプログラムを作成してもらいます。

目次

今回作るプログラム: Scrapboxのデータをmarkdownに変換する

今回はScrapboxから exportしたjsonをMarkdown形式に変換するプログラムを作成してみます。

私はScrapboxとObsidianを使っています。 雑に書いて思考と情報を整理するのは、複数端末で使いやすいScrapbox。 ある程度整理されたデータを記録する場合には、Markdownファイルとして手元でデータを管理できるObsidianを使っています。 以前から「Scrapboxに書いた内容をObsidianに移行するツールが欲しいな」と考えていたので、今回も自分が欲しいツールをAIに作ってもらう作戦です。

AIを使ったプログラム開発については、先日聞いたPodcastでも言及されていました。

EMFMの「技術力」って何?というエピソードが面白かった · kapieciiのブログ

「AIというリソースを使うことで、自分だけのリソースでは到達不可能な、一騎当千級の成果を出せるエンジニアになれる可能性があるかも?」という内容です。 AIによるアウトプットの質と量は特定の分野では既に人間を凌駕していますが、プログラミングの分野においてはどうなのでしょうか。

AIが得意なことと苦手なこと

AIにプログラムを作成してもらう前に、AIが得意なことと苦手なことを整理します。 得意な部分を活かし、苦手な部分は人間がサポートすることで、効率的にAIに働いてもらいます。

得意なこと: データの変換

AIはデータの変換が得意です。 例えば特定のプログラミング言語で書かれたプログラムを別のプログラミング言語に変換したり、日本語を英語に変換するといった処理です。

得意なこと: 教師データから法則性を読み取る

通常のプログラミングの場合、目的の処理を事細かにプログラミング言語でコンピュータに指示する必要があります。 しかしAIの場合は、大まかな指示内容とともに手本となるデータをいくつか与えることで、手本となるデータから法則性を読み取ってくれます。 人間が事細かに指示しなくても、ある程度人間の意図を読み取って対応してくれるようなイメージでしょうか。

苦手なこと: 複雑な処理

AIに複雑な処理を頼むとミスする可能性が高まります。 そのため、複雑な処理はできるだけシンプルな処理に分解してAIに依頼します。 複雑な処理を依頼する場合に細かな単位で返答を求めたり、返答に至った論理を説明してもらうのも良いらしいです。

シンプルな処理に分割する

今回AIに依頼したい内容を下記の2つに分割しました。

  • jsonファイルからtextファイルを作成する
  • Scrapbox記法のtextファイルをMarkdown記法に変換する

AIに入力したプロンプト

下記のプロンプトを作成し、AIにPythonスクリプトを作ってもらいました。

jsonファイルからtextファイルを作成する

export-testpj.jsonをuploadし、下記のプロンプトを入力しました。 こちらは特に問題なく1発で成功。


export-testpj.jsonのpages要素を解析し、txtファイルに分割するpythonスクリプトを作成してください。

  • 作成したtxtファイルはoutputディレクトリに保存してください。outputディレクトリがない場合は作成してください。
  • pages要素毎に1つのtxtファイルを作成してください。
  • txtファイルのファイル名はpages要素のtitle部分です。title部分に半角スペースや全角スペースが含まれる場合は、スペースを削除してください。
  • txtファイルの内容はpages要素のlines部分です。linesでは、1行分のデータがjsonの1要素として記録されています。jsonの1要素を1行としてtxtファイルに出力してください。ただし、linesの要素の1つめはtitleと重複しています。1つめの要素はtxtファイルに含めないでください。

Scrapbox記法のtextファイルをMarkdown記法に変換する

自分がよく使うScrapbox記法を変換するPythonスクリプトを作成してもらいました。 何度かプロンプトを調整したり、細かく修正依頼のやり取りをしたのですが、残念ながら完成には至っていません。 途中から「自分で書けばすぐ終わるのに、なんでChatGPTに頼んでるんだっけ?」という気持ちになっていました😇


outputディレクトリ以下に複数のtxtファイルがあります。txtの内容を下記のルールでmarkdownに変換するpythonスクリプトを作成してください。 変換前の形式から変換後の形式に変換してください。 変換後のmdファイルはconverted_outputディレクトリに保存してください。

  • table

変換前のtableは、行頭にtableという文字列があります。 行頭にtableという文字列が出現した後、table構造が続き限り行頭に半角スペースが入っています。 行頭の半角スペースが終了したらtable構造が終了です。

変換前

table: test table
 -	no1	no2	no3
 item	1	2	3
 item2	aaaaa	bbbbb	ccccc

変換後

|-|no1|no2|no3|
|:-:|:-:|:-:|:-:|
|item|1|2|3|
|item2|aaaaa|bbbbb|ccccc|
  • code snippet

変換前のcodeは、行頭に半角スペースが入っています。 行頭の半角スペースが続く限り、codeの行が続きます。 「code:」の後に続く文字列はデータの形式を表しています。 「```」の後ろにデータの形式をつけてください。

変換前1

code: html
 <html>
   <head></head>
 </html> 

変換後1

<html>
  <head></head>
</html> 

変換前2

code: shell
 echo "testtest" >> test.txt
 cat test.txt

変換後2

echo "testtest" >> test.txt
cat test.txt

変換前3

code: python
 a = 1
 b = 2
 c = a+b

変換後3

a = 1
b = 2
c = a+b
  • h1~h5

変換前 –> 変換後

[***** h1] --> # h1
[**** h2] --> ## h2
[*** h3] --> ### h3
[** h4] --> #### h4
[* h5] --> ##### h5
  • 取り消し線、Itaric

変換前 –> 変換後

[- 取り消し] --> ~~取り消し~~
[/ test] --> *test*
  • image

変換前

[https://gyazo.com/4a30d4fe6afb55c27817bdac4c7aaaaa]

変換後

 ![image](https://gyazo.com/4a30d4fe6afb55c27817bdac4c7aaaaa.png)
  • 外部リンク

行内に出現する[]で囲われた中に、半角スペース区切りで文字列をURLが含まれている部分が外部リンクです。 外部リンクは必ず行頭にあるわけではありません。行内の任意の場所に出現します。

変換前 –> 変換後

[google https://www.google.com/] --> [google](https://www.google.com/)
外部リンクです。[google https://www.google.com/] --> 外部リンクです。[google](https://www.google.com/)
文字列。[google https://www.google.com/] --> 文字列。[google](https://www.google.com/)
  • 内部リンク

行内に出現する[]で囲われた中に文字列が含まれる形式が内部リンクです。 ただし、[]で囲まれる形式は様々な形式があるため、他の形式に合致しない場合内部リンクとして変換します。 内部リンクは必ず行頭にあるわけではありません。行内の任意の場所に出現します。

変換前 –> 変換後

[title1] --> [[title1]]
内部リンクです。[title1] --> 内部リンクです。[[title1]]
文字列。[title1] --> 文字列。[[title1]]
  • list

行頭のtabでlistとlistの入れ子構造を表現しています。 変換後のlistでは、行頭の空白は削除してください。

変換前

 	item1
 	item2
 		item2-1
 			item2-1-1
 			item2-1-2
 		item2-2
 	item3

変換後

- item1
- item2
	- item2-1
		- item2-1-1
		- item2-1-2
	- item2-2
- item3

検証結果

何度もプロンプトを修正したり修正依頼のコメントをしましたが、完成する前に余暇時間が終わりました。 何とか自分でコードを書かずに完成までたどり着けるか挑戦しましたが、今回は時間切れです。無念。

色々とプロンプトを修正した感覚として、AIは7-8割くらいはプログラムを作ってくれますが、AIだけで完成させるのはまだ難しいですね。 正規表現の微妙な修正などをプロンプトで調整するのが難しく、自分でコードを直す方が早かったです。

2023年5月にChatGPTにChrome拡張を作ってもらう検証をしてから丸1年。 AIの進歩は目覚ましいですが、プログラミングにおいてはまだかゆい所に手が届かないですね。

とはいえ7-8割作ってくれるのはとてもありがたいです。 7-8割作ってもらった上で自分で細かな部分を調整することで、ゼロから自分で書くよりも早く目的のプログラムを作成できると思います。 AIと人間が協力して、お互いの強みを活かすのが現時点の最適解ですね。

tweet Share