やったこと
Excelで、質問に対する回答をAIのChatGPTに答えてもらう関数を作ってみました。
応用すれば、セルに貼った文章の要約、ポジネガ判定、キーワード抽出も自由自在にできそう。精度の問題はあれども。
手順
【注意!】本記事の手順でAPIを大量に実行すると、お金がかかります。(2023年1月19日現在、18$分の無料枠があります)
(準備)ChatGPTのAPIのキーを取得する
ChatGPTのAPIを利用できるように、ChatGPTのサイトでユーザー登録して、
APIのキーをもらう。
手順はこちら↓
https://qiita.com/k1morikawa@github/items/5482939eb49fb70207a5
準備ができたら新しいExcelファイルでVBA編集画面に移ります。
VBAマクロの基本的な作り方
このあたりを参照してください。
https://www.sejuku.net/blog/73163
VBAの参照設定
APIとやり取りするために、以下の参照設定を行います。
参照設定については、このあたりを見てください。
https://www.sejuku.net/blog/76520
参照するライブラリは、以下の2つです。
・Microsoft Scripting Runtime
・Microsoft Forms 2.0 Object Library
ChatGPTとJsonでやりとりするために、JsonConverterをダウンロードして読み込む
ChatGPTのAPIとやり取りするためには、
質問文などのデータをJSON形式に変換してやり取りする必要があります。
そこでデータをJSON形式に変換(Convert)してくれるVBAパッケージ、
JsonConverterを利用します。
手順はこちら↓
VBAでJSON形式のデータを扱うに便利なVBA-JSON
https://javeo.jp/vba-json/
このようにJsonConveterが標準モジュール内に入れば成功です。
VBAコード(gpt-3.5-turboバージョン)
(2023年3月追記、より新しいgpt-3.5-turboのAPIが公開されたので、追加しました。)
VBAコードは以下のとおりです。もっと良い書き方があればご指摘ください。
コード内の{API_KEY}は、「準備」で取得したAPIキーに置き換えてください。(sk-で始まる文字列)
Function gpt(mytext)
Application.Volatile False
'入力テキストが無ければ終了
If mytext = "" Then
gpt = "何かテキストを入力してください。"
Exit Function
End If
'APIとやり取りするためのデータをDictionary型で作る(後でJSONに変換)
Dim JsonObject As Object
Set JsonObject = New Dictionary
Dim JsonObject_mini As Object
Set JsonObject_mini = New Dictionary
JsonObject.Add "model", "gpt-3.5-turbo"
JsonObject_mini.Add "role", "user"
JsonObject_mini.Add "content", mytext
JsonObject.Add "messages", Array(JsonObject_mini)
'API実行
Dim objHTTP As Object
Dim res As Object
'API実行
Set objHTTP = CreateObject("msxml2.xmlhttp")
objHTTP.Open "POST", "https://api.openai.com/v1/chat/completions", False
objHTTP.setRequestHeader "Content-Type", "application/json"
'■■■■■API_KEYを置き換える必要あり■■■■■
objHTTP.setRequestHeader "Authorization", "Bearer " & "{API_KEY}"
objHTTP.send JsonConverter.ConvertToJson(JsonObject)
'レスポンスコードのチェック(正常)
If objHTTP.Status <> 200 Then
gpt = "error"
Exit Function
End If
'レスポンスJSONを辞書型に変換する
Set res = ParseJson(objHTTP.responseText)
'レスポンスの中から質問への回答を取り出して、戻り値とする
gpt = Replace(Trim(res("choices")(1)("message")("content")), vbCrLf, "")
End Function
使い方
Excelのセル上で、例えば
=gpt("幸せってなんですか")
感想
ChatGPTはジャンルによっては嘘をつくので、怖いです。
またAPIの実行速度も1件5~10秒ほどかかるため、実用には工夫が必要です。
あと、ChatGPTは連続的に会話してなんぼ、という面もあるので、1件だけのやり取りでは本領が発揮できていない気もしました。
過去ログ
VBAコード(text-davinci-003バージョン)
(2023年3月追記、より新しいgpt-3.5-turboのAPIが公開されたので、こちらは古いバージョンです。)
VBAコードは以下のとおりです。もっと良い書き方があればご指摘ください。
コード内の{API_KEY}は、「準備」で取得したAPIキーに置き換えてください。(sk-で始まる文字列)
Function chatgpt(mytext)
'入力テキストが無ければ終了
If mytext = "" Then
chatgpt = "何かテキストを入力してください。"
Exit Function
End If
'APIとやり取りするためのデータをDictionary型で作る(後でJSONに変換)
Dim JsonObject As Object
Set JsonObject = New Dictionary
JsonObject.Add "model", "text-davinci-003"
JsonObject.Add "prompt", mytext
JsonObject.Add "temperature", 0
JsonObject.Add "max_tokens", 2048
Dim objHTTP As Object
Dim res As Object
'API実行
Set objHTTP = CreateObject("msxml2.xmlhttp")
objHTTP.Open "POST", "https://api.openai.com/v1/completions", False
objHTTP.setRequestHeader "Content-Type", "application/json"
'■■■■■API_KEYを置き換える必要あり■■■■■
objHTTP.setRequestHeader "Authorization", "Bearer " & "{API_KEY}"
objHTTP.send JsonConverter.ConvertToJson(JsonObject)
'レスポンスコードのチェック(正常)
If objHTTP.Status = 200 Then
response = objHTTP.responseText
Else
chatgpt = "error"
Exit Function
End If
'レスポンスJSONを辞書型に変換する
Set res = ParseJson(response)
'レスポンスの中から質問への回答を取り出して、戻り値とする
Set Choices = res("choices")
chatgpt = Replace(Trim(res("choices")(1)("text")), vbCrLf, "")
End Function
おわり
おわりです。お疲れ様でした。