2023/5/7 温度指定、文字列のエスケープ処理を追加
社会現象にもなっているopenAI社のChatGPT、Webサイトでブラウザから使用することができますし、プログラミングができればAPIを使って自作のシステムに組み込むこともできます。
だけど、もっと身近に使いたいんですよね。そう、いつも使っているExcel上で。
ということで、Excelのワークシート関数を使用する感覚でChatGPTを利用できるマクロを作成したので公開します。ExcelVBAでChatGPTのAPIをコールして質問をリクエスト、返ってくる回答文字列を取得するユーザー定義関数「ChatGPT」です。マクロと言ってもChatGPT関数を数式として入力するだけなので、実行ボタンなど押す必要もなく、vlookupなど通常の関数のように使用することができます。最新の大規模言語モデルAIを関数だけでワークシートに埋め込めるのですから、その使い方の可能性は無限大と言ってもよいでしょう。
さて、openAI社のChatGPT、2023年3月に最新のGPT-4が公開されましたが、今のところ利用は有償となるようです。無償でAPIを使えるモデルは「gpt-3.5-turbo」が最新、従来の3より高機能となり、目に見える機能差としては会話全体の役割を指示できるようになったことが挙げられます。具体的にはmessagesパラメータに新たなroleプロパティが追加されていて、role:systemとして、質問とは別に会話全体の役割を指定できるようになったのです。今回はこの最新版3.5-turboをExcelワークシートから使えるようにします。この「役割指示」が結構便利で、Excelワークシートでの使用と親和性が高いと思っており、その辺りは使用実例でお見せしたいと思いますが、まずはコードから。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
Option Explicit '------------------------------------------------------------- '指定した質問文字列をChatGPTにリクエストし回答文字列を取得する ' 第一引数:質問文字列 ' 第二引数:会話全体の指示(省略可能) ' 第三引数:Temperature(省略可能)厳密さ指定(0~2)指定されなかった場合は0.2 ' Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic) '2023/04/02 リリース '2023/05/07 文字列のエスケープ処理追加 '------------------------------------------------------------- Function ChatGPT(strText As String, Optional strSystem As String, Optional Temperature As Double = 0.2) As String Dim objHttp As Object Dim strAPIKey As String, strModel As String, strURL As String, MaxTokens As Long Dim strRequest As String, strRspns As String, strTemp As String Dim p1 As Long, p2 As Long 'ChatGPTの設定 strAPIKey = "ここにAPIkeyを入力" MaxTokens = 1000 strModel = "gpt-3.5-turbo" strURL = "https://api.openai.com/v1/chat/completions" '文字列内のエスケープ strText = Replace(Replace(Replace(strText, vbLf, ""), Chr(34), Chr(39)), "\", "\\") strSystem = Replace(Replace(Replace(strSystem, vbLf, ""), Chr(34), Chr(39)), "\", "\\") Set objHttp = CreateObject("MSXML2.XMLHTTP") With objHttp 'ヘッダー設定 .Open "POST", strURL, False .SetRequestHeader "Content-Type", "application/json" .SetRequestHeader "Authorization", "Bearer " & strAPIKey 'リクエスト strRequest = "{""model"":""" & strModel & """, ""messages"":[{""role"":""system"",""content"":""" & strSystem & """},{""role"":""user"",""content"":""" & strText & """}] , ""max_tokens"":" & MaxTokens & ", ""temperature"":" & Temperature & ", ""top_p"":1}" Debug.Print strRequest 'リクエスト文字列をイミディエイトウインドウに出力 .Send strRequest Debug.Print .ResponseText '返ってきた文字列全文をイミディエイトウインドウに出力 strRspns = .ResponseText End With 'Jsonからテキストを取得 p1 = InStr(strRspns, "content"":") + 10 p2 = InStr(p1, strRspns, "},") - p1 - 1 strTemp = Mid(strRspns, p1, p2) strTemp = Replace(Replace(strTemp, "\n\n", vbLf), "\n", vbLf) 'バックスラッシュのエスケープ strTemp = Replace(Replace(strTemp, "\""", """"), "\\", "\") ChatGPT = strTemp DoEvents End Function |
使用するには、ワークブックにモジュールを一つ挿入して、そこに上記コードをペタッと張り付ければOKです。マクロを有効にするとChatGPT関数が使用できます。(事前にopenAIのWebサイトからAPIKeyを取得、コードの strAPIKey = “” に記述してください。)
使い方は簡単、=ChatGpt(B$2,$A3)のようにセルに数式として入力し使用します。この場合、B2セルに質問内容を入力、A3セルに会話全体の役割を指示します。次の使用例を見ていただければ、イメージいただけると思います。

会話全体の指示どおり、ChatGPTが回答してくれています。実際の数式はこんな感じです。他のセルの数式も、この数式をコピーするだけです。

他の役割事例も紹介しましょう。これまた指示どおり、役割を演じて回答してくれていますね。

いやはや、ChatGPT、すごいです・・・。
次に、表計算ワークシートならではのChatGPT活用方法もご紹介しましょう。都道府県別の様々な代表物を取得する例ですが、このように対象単位に何かしらの情報を一覧で取得したい際に非常に有効です。

このようなマトリクスを作り、縦横のタイトル文字列を参照して質問文を生成、この場合「北海道の代表的な花を一つ教えてください」という質問をChatGPTに投げていることになりますが、セルの絶対参照をうまく使うことで、この数式をそのまま他のセルにコピーして使いまわせるわけです。
でも、回答は文章で返ってくるので長いんですよね。もっと端的にデータベースっぽいのを作りたい場合にも、ChatGPT関数の第二引数「会話全体の役割指示」が役立ちます。次のように指定することで、望んでいる結果に近い回答文字列が得られるようになります。B2セルにひたすら指示を書き込み、それをChatGPT関数の第二引数に指定しています。

まあ、完璧に言うことを聞いてくれるわけではないのですが、指定するのとしないのとでは雲泥の差があり、この指定の仕方、いわゆる「AIプロンプト作成力」が問われる時代が来ている気もします。また、ChatGPTの回答内容が正しいかどうかは不明であり、虚偽の情報が含まれている可能性が多分にあることを理解したうえで活用する必要があることは言うまでもありません。
最後に使用上の注意点を。このようにChatGPT関数は、ワークシート上で自在にChatGPTを使用できて便利なのですが、計算する際にはAPIコールによるネット通信が発生します。よって結果が返ってくるまでに、それなりの時間がかかるため、一覧表など複数のセルでChatGPT関数を使用する場合はExcelの設定を手動計算にしておき、数式の入力が完了した後「F9」キーで一気に再計算!という使用方法がよいかもしれません。
【2023/04/18 追記】
窓の杜さんで、本マクロの使用方法を詳細に解説いただきました!

またその後、当ブログで追加記事をエントリーしていますので、こちらもご参考ください
それでは良いVBAライフを!
コメント