こんにちは。テクマトリックスの長久保です。

プライベートでは大活躍してくれているChatGPTですが、今回ツールを作成する際に利用し、使い勝手の良さに感動したのでブログに起こしてみました。

なお、こちらの内容は2023/4/25時点の内容をもとに記載しております。

はじめに

今回開発言語としてVBAを利用した理由は以下の4つです。

  • 今までVBAのコードは書いたことがなく、必要に迫られることはおそらく今後もないはず。経験として触ってみるいい機会。
  • Excelは利用できる環境にあるので、すぐに開発環境が整う。
  • もし作ったものを配るとしても相手側もExcelがあれば実行できる。
  • コードの書き方自体の情報はは検索すれば簡単に手に入る。

ChatGPTを使ったコードの生成は多少触ったことがあったため、VBAの実装も何とかなるだろうと思っていました。結論から言うと想定よりも遥かに簡単に作ることができました。

今回は文章チェックツールを作ってみます。
入力した文章をChatGPTのAPIで送り、チェックしてもらった結果を表示するシンプルなツールです。

設計

設計と言うほどのものではありませんが、以下の内容を考えました。

  • 「対象」シートのA1とA2に入力された文字列を取得し、文字列を結合してChatGPTのAPIに送信する。
  • 送信する文字列の上限は1000文字として、上限を超えていた場合エラーにする。
  • 念のためAPIのタイムアウトを1分にする。
  • ChatGPTから受け取った結果を「対象」シートのA3に転記する。

細かいところは無視して要点だけ記載し、そのままChatGPTに聞いてみます。

以下のシステムを作りたいので、VBAのソースコードを書いてください。
・「対象」シートのA1とA2に入力された文字列を取得し、文字列を結合してChatGPTのAPIに送信したいです。
・文字列の上限は1000文字として、上限を超えていた場合「文字が長すぎます。1000文字以下で入力してください」とエラーにしてください。
・APIのタイムアウトを1分にしてください。
・ChatGPTから受け取った結果を「対象」シートのA3に転記します。

コード全てを転記すると長くなってしまうので割愛しますが、質問の内容を読み取り、コードを書いてくれました。
最後には以下のように注釈も記載してくれています。

簡単なツールを作成する場合の設計はこの程度の内容で問題なさそうです。

開発

一見動きそうなコードを生成してくれました。しかし、私はVBAの初心者です。そもそもどのようにこのコードを実行するのかがわからないので、これも聞いてみます。

とても丁寧に教えてくれました。
言われた通りの手順でコードを貼り付け実行します。ただ、ChatGPTからの回答に記載されていたJsonConverter.basはChatGPTが書いてくれたリンク先(https://github.com/VBA-tools/VBA-Web)になかったため、https://github.com/VBA-tools/VBA-JSONから取得しました。

しかし、指示通り貼り付けて実行してもうまくいかないのは開発の常です。
実行するとコンパイルエラーになりました。

おそらく今回インポートしたJsonConverter.basが利用しているモジュールを参照できないといったことだとは思うのですが、これもChatGPTに聞いてみます。

指示通り、「Microsoft Scripting Runtime」と「Microsoft XML, v6.0」を確認してみるとチェックが入っておらず、チェックを入れるとこの問題は解消しました。
「コンパイルエラーになりました」という問いかけだけでにこれだけ明確な回答が得られるのは驚きです。これはJsonConverter.basを利用するときによくある問題なのでしょうか。問題切り分けの難易度としてはどうなのか気になるところです。

一つ問題を解消するとまた新しい問題が発生しました。

再度実行すると実行時エラーが表示されました。また同じようにChatGPTに確認します。

何度かこの実行内容についてはChatGPTとやり取りしながら修正を試みたのですが、ここについては指示通り修正しても実行はできませんでした。

{
    "error": {
        "message": "The model: `davinci-codex` does not exist",
        "type": "invalid_request_error",
        "param": null,
        "code": "model_not_found"
    }
}

レスポンスの中身を見ると上記の様に「davinci-codex」モデルがないことがわかりました。今利用しているChatGPTの講師データが2021年9月までのデータをもとに作成されているとのことなので、最新のAPIの呼び出し方とは異なっていたのでしょう。

現在利用可能なモデルの呼び出し方法について質問を繰り返しましたが、原因と対応方法は教えてくれるものの、実行できる情報を得ることはできませんでした。

提示はしてくれますが、実行はできませんでした。

ここは素直にOpenAIのAPIのページを参照しながら修正します。
ただ、その際もVBAのダブルコーテーションのエスケープ処理や、コードに組み込む部分はChatGPTに書いてもらいました。

さっと修正してくれます。

その後も以下のような調べないと分からないことを随時ChatGPTに確認しながら書いていくと、ある程度動くものができました。

  • APIに送信するときの改行コードなどの置換・エスケープ処理
  • VBAでの文字列結合の実装方法
  • VBAでのif文の書き方

以下に実行例を記載します。

入力内容
その後、私は仕事に行くことができましたが、脳みそが働かなくて、たたくさんのミスをしてしまいました。ノートパソコンを持っていかなかったので、大切なしょ類を印刷することができませんでした。そして、打ち合わせに遅刻してしまい、同僚たちに怒られてしまいました。

出力内容
その後、私は仕事に行くことができましたが、脳みそが働かなくて、たくさんのミスをしてしまいました。ノートパソコンを持っていかなかったので、大切な書類を印刷することができませんでした。そして、打ち合わせに遅刻してしまい、同僚たちに怒られてしまいました。
【変更点】
「しょ類」 → 「書類」
「たたく」 → 「たく」

テスト

ChatGPTはコードの生成だけでなく、テストの生成でも有用だと感じました。

テストケースの生成


ChatGPTの出力結果がテストケースとして十分か、過不足はないかといった確認は必要ではあるものの、テストケースを作成してくれました。

そして、このテストケースに対応するテストコードも生成してくれます。今回の様に簡単なツール作成程度であれば十分有用かと思います。

テストデータの作成

今回の場合、テスト用の文章をいくつか用意する必要があります。
しかし、わざと間違った文章を作成するのは手間なので作成してもらいます。

テスト用の文章1
テスト用の文章2

このように有用なテストデータを作成してくれました。

まとめ

以下のシステムを作りたいので、VBAのソースコードを書いてください。
・「対象」シートのA1とA2に入力された文字列を取得し、文字列を結合してChatGPTのAPIに送信したいです。
・文字列の上限は1000文字として、上限を超えていた場合「文字が長すぎます。1000文字以下で入力してください」とエラーにしてください。
・APIのタイムアウトを1分にしてください。
・ChatGPTから受け取った結果を「対象」シートのA3に転記します。

この程度の指示で動くものを作成してくれたのにはとても驚きました。
APIの連携とJSONのパース部分や、モデルが古かったことによるAPI呼び出し等の修正は必要だったものの、それ以外の大部分は作成してくれたコードのまま実行することができました。

今後もChatGPTのモデルの改善や処理速度も上がっていくでしょうし、一度に扱えるトークン量も増えていくかと思います。現時点でも十分活用できるので、これからもとても楽しみです。
コードを生成するという点ではGitHub Copilotも興味があるので、機会を見つけて少し触ってみたいと思います。

By nagakubo

主にCI環境構築をメインで担当しています。 Certified CloudBees Jenkins Engineer (CCJE)