📮

VBAでChatGPT API(gpt-3.5-turbo)を活用:文脈を理解した会話システムと履歴保存機能の実現

2023/03/19に公開

1. はじめに

この記事を読んでいただき、ありがとうございます!!もしもこの記事が「役に立つ」「ちょっと気になる」と感じたら、ぜひ「いいね」ボタンを押していただけると大変励みになります!!

実は、これが私のはじめての技術記事です。公開初日に早速2つの「いいね」をいただけて、とても嬉しい気持ちでいっぱいです!!現行のChatGPT APIの最新モデルはgpt-3.5-turboですが、もしGPT-4 APIが利用可能になったら、VBAでの利用方法を記事にまとめたいと考えています。どうぞお楽しみにお待ちください!!

1.1. この記事を読んで得られるメリット

今回の記事では、「ChatGPT会話システム for Excel」を紹介します。
「Excel上でChatGPTと会話ができ、会話履歴をExcelに保存できる」という点に大きなメリットがあると思います。「ChatGPT会話システム for Excel」は、普通のChatGPTチャットとくらべて以下のようなメリットを持っています。
※コピペ時のメリットについては「ChatGPT APIのメリットの補足」という章で記載しています。

項目 ChatGPTチャット ChatGPT API
AI学習に使われる? ❌ 使われる ⭕ 使われない
社内の人はアカウント登録必要? ❌ それぞれ登録必要 ⭕ 登録不要
費用は? ❌ 月20ドル。無料は限界ある ⭕ 使った分だけ(安い)
回答記録はどこに残る? △ GhatGPT内に180日ほど残る(コピペが必要) ⭕ 任意に設定できる(Excelに残せる)
コピペ時「# 見出し」 ❌ コピペ不可 ⭕ コピペできる
コピペ時「`バッククオート」 ❌ コピペ不可 ⭕ コピペできる
コピペ時「- 箇条書き」 ❌ コピペ不可 ⭕ コピペできる
コピペ時「1. 数字箇条書き」 ❌ コピペ不可 ⭕ コピペできる
回答が途中で止まる? ❌ 止めるので途中で「続きを書いて」が必要 ⭕ 1回で回答してくれる(トークン上限あるが)

1.2. ChatGPTとは

ChatGPTとは、OpenAIが開発した自然言語処理の技術の1つであり、大規模なトレーニングデータを用いて学習された言語モデルです。ChatGPTは、人工知能として、文章の生成や応答生成、文章の要約、文章の翻訳など、多様な自然言語処理のタスクに利用されます。
私を含め、実際にChatGPTを使用して感動した人は多いでしょう。とにかくなんでも答えてくれるすごいやつです。

ちなみに私は有料プラン(20ドル)に加入し、毎日ヘビーにChatGPTを利用しています。

1.3. ChatGPT APIとは

一方、ChatGPT APIは、外部アプリケーションやサービスからChatGPTを利用するためのWeb APIです。自由度が高く、さまざまな用途に応じてChatGPTをカスタマイズすることができるため、多くの開発者から注目されています。ChatGPT APIを使えば、好みのアプリケーション(今回はExcel)にChatGPT機能をつけることができます。

なお、ChatGPT APIの利用には料金が発生しますが、無料枠で約$18.00分が提供されるため、その範囲内で十分な研究やテストが可能です。
料金に関する情報については、以下の動画が分かりやすく解説しています。ぜひご覧ください。
https://youtu.be/3OYovkNNrdQ

私自身もさまざまなテストを行っていますが、$18.00のうちわずか$2.33しか使用していません。さらに、このうち$2はWhisper(音声を解析し文字起こしをするAI)のテストで消費されたため、純粋にChatGPT APIにかかった費用はたったの$0.33程度です。このことからも、ChatGPT APIは非常にコスト効率の良いことがわかります。

2. 手っ取り早く使いたい人へ

2.1. 使用イメージGIF

GPTとの会話の様子がわかります。
ChatGPTへ質問したい内容をユーザーメッセージのセルに入力することで、ChatGPTとの会話できます。
会話はExcelシート上で整理され、自分の質問内容と、ChatGPTからの回答内容が、セルに保存されます。
GIFではしりとりを行っており、これは文脈に沿った会話ができているかをテストしています(たとえば、「ごりら」という突然の質問でも、前の文脈がなければ意味不明となるでしょう)。

※GIF

※画像

2.2. 完成品ダウンロードと基本的な使い方

コードや技術的な詳細が不要で、手軽にExcel上でChatGPTと会話したい方向けに、以下に完成品と設定方法をご紹介します。VBAやJSONなどの技術的な知識は必要ありませんので、どなたでもお手軽にお試しいただけます。

2.2.1. APIキーを入手

ChatGPT APIを利用するためにはAPIキーが必要です。

下記ページにアクセスして、APIキーを取得しましょう。
ログインするアカウントは、ChatGPTチャットと同じアカウントです。
https://platform.openai.com/overview

2.2.2. 以下のURLより完成品をダウンロードしてください

Dropboxの登録ウィンドウが出ますが、登録しないでもダウンロードできます。
※念のため過去バージョンもフォルダに入れています。新しいバージョンをご使用ください。
https://www.dropbox.com/s/6qhfowwckq1u1bi/ChatGPT会話システム for Excel.zip?dl=0

2.2.3. ダウンロードしたExcelについて、セキュリティの許可をする

  1. Excelを右クリック
  2. 「プロパティ」をクリック
  3. 「セキュリティ」>「許可する」のチェックを入れる
  4. 「OK」をクリック
    WebからダウンロードしたExcelマクロは以下の設定をしないとマクロが動きません。

2.2.4. ダウンロードしたExcelを開き、APIキーの設定する

  1. ダウンロードしたExcelを開く
  2. セルに「sk-」から始まる入手したAPIキーを設定する(画像参照)

2.2.5. ChatGPTと会話してみる

  1. セルにユーザーメッセージを入力する(セル内改行はAlt+Enterで可能です。)
  2. Enterを押下し、セルから離れる
  3. 自動でマクロが実行される
  4. 「以下のユーザーメッセージで実行してもよろしいですか?」と確認メッセージが出るので「はい」をクリックする




2.3. APIパラメーターをカスタマイズして使ってみる

細かくAPIのパラメーターを指定するできるのは、APIを利用する醍醐味です。
今回のシステムでは、システム指示(system)温度(temperature)返答トークン数(max_tokens)の3つのパラメーターを、セル上で簡単に変更できるようになっています。
なお、APIパラメーターについて詳しく知りたい方は下記APIレファレンスをご参照ください。

https://platform.openai.com/docs/api-reference/chat

2.3.1. システム指示(system)

私が設定したデフォルト : You are a helpful assistant.
ChatGPTに全体的な指示を出すことができます。
デフォルトの例You are a helpful assistant.だと、ヘルプアシスタントとしてChatGPTに振る舞ってもらっています。
※英語で書いている理由は、トークンの節約のためです。

systemを工夫すれば同じ「こんにちわ」でも以下のように異なる返答をもらうことができます。

"You are a helpful assistant. 語尾に「にゃー」とつけて会話します。"
こんにちは→にゃー、こんにちはにゃー!何かお手伝いできることはありますかにゃー?

"エクセル関数に詳しくて、どんな質問もエクセル関数で回答します。"
こんにちは→こんにちは!何かエクセル関数に関する質問がありますか?

"ユーザーから日本語の文章がきたら、それを翻訳して英語で返答します。"
こんにちは→Hello.

2.3.2. 温度(temperature)

私が設定したデフォルト : 0.2
値は0~2の間で設定できますが、0~1での設定をオススメします。
数字が大きいほど、出力はランダム(独創的)になり、数字が小さいほど真面目で硬い出力になります。

使い分けとしては、「独創的なアイデアがほしいときは数字を2に近づけ、決まりきった事実がほしいときは数字を0に近づける」のが良いと思います。
ちなみに、2だとおかしな回答になることが多いので、1ぐらいを上限にすると良いです。

公式レファレンス
https://platform.openai.com/docs/api-reference/chat/create#chat/create-temperature
temperature number Optional Defaults to 1
What sampling temperature to use, between 0 and 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.
We generally recommend altering this or top_p but not both.

2.3.3. 返答トークン数(max_tokens)

私が設定したデフォルト : 1024

ChatGPTが返すトークンの最大数です。概ね英語は1文字1トークン、日本語は1文字1-3トークンと考えてもらえれば大丈夫です。
ChatGPTに渡されるすべての文字を含めて計算され、4096トークンを超えるとエラーが発生します。

過去の会話履歴やシステム設定に影響を受けることがありますが、通常は1024を設定するとバランスが良いと思います。

公式レファレンス
https://platform.openai.com/docs/api-reference/chat/create#chat/create-max_tokens
max_tokens integer Optional Defaults to inf
The maximum number of tokens to generate in the chat completion.
The total length of input tokens and generated tokens is limited by the model's context length.

3. コードの説明

3.1. モジュールやプロシージャの関係(フローチャート)

この図はMermaid記法により書かれています。
ChatGPTに「以下の文章の説明をフローチャートにして。記載はMermaid記法を使用すること。」というと書いてくれるので、知っておくと便利です。

以下のフローチャートは、コードの全体像を把握するためのものです。濃い紫の角丸の要素は、SubプロシージャやFunctionプロシージャの開始時点を表しています。まずはフローチャートを参照してコードの概要を理解し、その後、コメント付きのコードを確認し、最後にF8のステップイン実行で実際に動作を確認することで、コード内容を効果的に把握できます。

全体像

以下は、GenerateTextWithOptions関数とEscapeJson関数との関係です。
VBA-JSONであるJsonConverterモジュールのParseJson関数の詳細は割愛します。

`GenerateTextWithOptions`関数と`EscapeJson`関数との関係

3.2. VBAコード

3.2.1. 参照設定やVBA-JSONについて

ダウンロードしたExcelをそのまま使う場合は、下記手順は必要ないです。

  1. VBA-JSON(JsonConverter.bas)を入手する
    1. https://github.com/VBA-tools/VBA-JSON にアクセス
    2. VBA-JSON-master.zipをダウンロードして解凍する
    3. 解凍したフォルダ内にあるJsonConverter.basを探す
  2. ExcelにVBA-JSON(JsonConverter.bas)を追加する
    1. 新しくExcelを新規作成し、拡張子を「.xlsm」で保存する。
    2. VBAエディタ (Alt + F11) を起動します
    3. プロジェクトエクスプローラーにてVBAProject(Book1)を右クリックし、「ファイルをインポート」を選択します。
    4. さきほど入手したJsonConverter.basを選択する
    5. モジュールにJsonConverterが追加されました
  3. 必要なライブラリを参照設定する
    1. VBAエディタで、「ツール」>「参照設定」をクリック
    2. Microsoft Scripting Runtimeを探し、チェックを入れる
    3. Microsoft XML, v6.0を探し、チェックを入れる
    4. OKをクリックする

プロジェクトエクスプローラーは以下のような画像の状態になっております。

3.2.2. 標準モジュールに記載されているコード

下記アコーディオンをクリックすると、コードを閲覧できます。

宣言セクション
宣言セクション
Option Explicit
Public Enum eeRow 'Enumを使用し、シートの行の位置をプログラミングで扱いやすくする。
    setting = 1
    apiKey
    opt_system
    opt_temperature
    opt_maxTokens
    userMessage
    
    userOrAssistant = 8
    userOrAssistantData
End Enum
ChatWithAssistant
vba
Sub ChatWithAssistant()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.ActiveSheet ' 対象のシートを指定する
    
    ' sk-から始まるAPIキーがセットされているかチェックする
    If Left(ws.Cells(eeRow.apiKey, 2).Value, 3) = "sk-" Then
        ' 問題なくAPIキーがセットされている
    Else
        MsgBox "sk-から始まるAPIキーがセットされておりません。マクロを終了します。"
        End
    End If
    
    ' 最終行を取得する
    Dim lastRow  As Long
    lastRow = ws.Cells(Rows.Count, 2).End(xlUp).Row
    
    ' ユーザーからの入力をセルに保存する
    Dim userMessage As String
    userMessage = ws.Cells(eeRow.userMessage, 2).Value
    Call ShowMessageAndEndIfNo(userMessage) '本当に実行してもよいかユーザーに聞く
    ws.Cells(lastRow + 1, 2).Value = userMessage
    ws.Cells(lastRow + 1, 1).Value = "user"
    
    ' APIを使用し、アシスタントの応答を受け取る
    Dim assistantResponse As String
    assistantResponse = GenerateTextWithOptions( _
        ws.Cells(eeRow.apiKey, 2).Value _
        , ws.Cells(eeRow.opt_system, 2).Value _
        , ws.Cells(eeRow.opt_temperature, 2).Value _
        , ws.Cells(eeRow.opt_maxTokens, 2).Value _
        )
    
    ' アシスタントの応答をセルに保存する
    ws.Cells(lastRow + 2, 2).Value = assistantResponse
    ws.Cells(lastRow + 2, 1).Value = "assistant"
    MsgBox assistantResponse
    
    ' 次に入力しやすいようにセルを選択し、元の入力を消す
    ws.Cells(eeRow.userMessage, 2).Select
    ws.Cells(eeRow.userMessage, 2).Value = ""
End Sub
GenerateTextWithOptions
vba
'パラメーターを指定してChatGPTと会話する関数です。アシスタントメッセージを返します。
Function GenerateTextWithOptions( _
    ByVal apiKey As String _
    , ByVal opt_system As String _
    , ByVal opt_temperature As Double _
    , ByVal opt_maxTokens As Long _
                                                        ) As String
    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    Dim URL As String: URL = "https://api.openai.com/v1/chat/completions"
    Dim i As Long
    Dim lastRow  As Long
    lastRow = ws.Cells(Rows.Count, 2).End(xlUp).Row
 
    Dim http As MSXML2.XMLHTTP60
    Set http = New MSXML2.XMLHTTP60
    
    Dim p As String 'JSON Payloadを設定する。
    p = p & "{"
        p = p & """model"": ""gpt-3.5-turbo"","
        p = p & """messages"": ["
            'messages内を記載する
            'systemを記載
            p = p & "{""role"": ""system"", ""content"": """ & EscapeJson(opt_system) & """}"
            'userとassistantを記載(For文で過去の会話履歴を記載する)
            For i = eeRow.userOrAssistantData To lastRow
                ' セルから過去の会話を取得する
                Dim chatRole As String: chatRole = ws.Cells(i, 1).Value
                Dim chatContent As String: chatContent = ws.Cells(i, 2).Value
                If chatRole = "user" Then
                    p = p & ",{""role"": """ & "user" & """, ""content"": """ & EscapeJson(chatContent) & """}"
                ElseIf chatRole = "assistant" Then
                    p = p & ",{""role"": """ & "assistant" & """, ""content"": """ & EscapeJson(chatContent) & """}"
                End If
            Next i
        p = p & "]"
        p = p & ",""max_tokens"": " & opt_maxTokens
        p = p & ",""temperature"": " & opt_temperature
    p = p & "}"
    
    'HTTPリクエストを行う
    With http
        Call .Open("POST", URL, False)
        Call .setRequestHeader("Content-Type", "application/json")
        Call .setRequestHeader("Authorization", "Bearer " & apiKey)
        Call .send(p)
         
        Do
            If .readyState = 4 Then Exit Do
            DoEvents
        Loop
                 
        Dim responseJSON As Object
        Set responseJSON = JsonConverter.ParseJson(.responseText)
        
        Dim assistantResponse As String
        assistantResponse = responseJSON("choices")(1)("message")("content")
        
        Dim total_tokens As String
        total_tokens = responseJSON("usage")("total_tokens")
        
        'デバック出力
        Debug.Print "JSON Payload : "; vbCrLf; p
        Debug.Print "responseText : "; vbCrLf; .responseText
        Debug.Print "assistantResponse : "; vbCrLf; assistantResponse
        Debug.Print "total_tokens : "; vbCrLf; total_tokens
    End With
    
    ' 今回のアシスタントメッセージをリターンします
    GenerateTextWithOptions = assistantResponse
End Function
EscapeJson
vba
Function EscapeJson(ByVal s As String) As String
    ' 最初にバックスラッシュをエスケープすることが重要です。
    ' 他のエスケープシーケンスにもバックスラッシュが使用されているため、
    ' これを最初にエスケープしないと、後続のエスケープ処理で
    ' 誤って元の文字列のバックスラッシュが重複してエスケープされることがあります。
    s = Replace(s, "\", "\\")

    ' ダブルクォーテーションのエスケープ
    s = Replace(s, """", "\""")
    
    ' スラッシュのエスケープ
    s = Replace(s, "/", "\/")

    ' バックスペースのエスケープ
    s = Replace(s, Chr(8), "\b")

    ' フォームフィードのエスケープ
    s = Replace(s, Chr(12), "\f")

    ' 改行のエスケープ
    s = Replace(s, Chr(10), "\n")

    ' 復帰のエスケープ
    s = Replace(s, Chr(13), "\r")

    ' 水平タブのエスケープ
    s = Replace(s, Chr(9), "\t")
    
    ' エスケープ処理が終わった文字列をリターンします
    EscapeJson = s
End Function
ShowMessageAndEndIfNo
vba
Sub ShowMessageAndEndIfNo( _
    Optional ByVal addMessageText As String)
    Dim messageText As String
    messageText = messageText & "以下のユーザーメッセージで実行してもよろしいですか?"
    messageText = messageText & vbCrLf & vbCrLf & addMessageText
    
    Dim userResponse As VbMsgBoxResult
    userResponse = MsgBox(messageText, Buttons:=vbYesNo)
    If userResponse = vbNo Then End
End Sub

3.2.3. シートモジュールに記載されているコード

Worksheet_Change
vba
' Worksheet_Changeイベント: シート上のセルの内容が変更された際に実行されるイベント
Private Sub Worksheet_Change(ByVal Target As Range)

    ' Intersect関数を使って、変更されたセル(Target)がユーザーメッセージセルと交差しているかをチェック
    If Not Intersect(Target, Cells(eeRow.userMessage, 2)) Is Nothing Then
        ' ユーザーメッセージセルが、空のときは無視する
        If Cells(eeRow.userMessage, 2) <> "" Then
            Call ChatWithAssistant
        End If
    End If
End Sub
' Intersect関数について補足
' Intersect関数は、2つの範囲(この場合はTargetとRange("B6"))が重なる部分があるかどうかを判断するための関数です。
' このコードでは、Targetは変更されたセルを指し、
' Cells(eeRow.userMessage, 2)は、セルB6を指します。
' If Not Intersect(Target, Range("B6")) Is Nothing Thenの条件式では、
' Intersect関数の結果がNothing(交差している範囲が存在しない)でなければ真(True)となります。
' つまり、この条件式は、「変更されたセルがセルB6であるかどうか」を判断しています。

番外編 : たまに発生して悩んだエラーについて

こんなJSON Errorメッセージ

たまにHTTPリクエストが失敗し、http.responseText内が以下のような状態になることがありました(解決済み)。

{
    "error": {
        "message": "We could not parse the JSON body of your request. (HINT: This likely means you aren't using your HTTP library correctly. The OpenAI API expects a JSON payload, but what was sent was not valid JSON. If you have trouble figuring out how to fix this, please send an email to support@openai.com and include any relevant code you'd like help with.)",
        "type": "invalid_request_error",
        "param": null,
        "code": null
    }
}

messageが横に長いので、以下に元の英文と翻訳を記載します。

We could not parse the JSON body of your request. (HINT: This likely means you aren't using your HTTP library correctly. The OpenAI API expects a JSON payload, but what was sent was not valid JSON. If you have trouble figuring out how to fix this, please send an email to support@openai.com and include any relevant code you'd like help with.
リクエストのJSONボディをパースできませんでした。(ヒント: これは、HTTPライブラリが正しく使用されていないことを意味します。OpenAI APIはJSONペイロードを期待していますが、送信されたものは有効なJSONではありませんでした。もし、この問題を解決する方法がわからない場合は、support@openai.com までメールを送ってください。その際、助けてほしい関連するコードも一緒に送ってください。

3.3. 原因と解決方法

エラーの原因は、FunctionGenerateTextWithOptions内で、JSONペイロードが正しく作成されていないためです。もっと具体的にいうと、Dim p As Stringに格納されるJSONペイロード文字列の中に、JSON上の都合上含まれてほしくない特殊文字やダブルクォーテーションが含まれてしまっていることが原因です。

解決策として、ユーザー入力や過去の会話履歴をJSON文字列へ変換する前に、特殊文字やダブルクォーテーションをエスケープする関数を使用します。以下のEscapeJson関数をコードに追加し、コードを修正すればOKです。

ちなみにこのような特殊文字は、他のソフトウェアやファイルからデータをコピーしてExcelのセルに貼り付けたり、外部データのインポートを行った場合に含まれていることがあります。ChatGPTから返ってきたリクエストメッセージや自分で入力したユーザーメッセージの中に、このような特殊文字があったら適切にエスケープ処理する必要があるのです。

EscapeJson(ByVal s As String) As String
Function EscapeJson(ByVal s As String) As String
    ' 最初にバックスラッシュをエスケープすることが重要です。
    ' 他のエスケープシーケンスにもバックスラッシュが使用されているため、
    ' これを最初にエスケープしないと、後続のエスケープ処理で
    ' 誤って元の文字列のバックスラッシュが重複してエスケープされることがあります。
    s = Replace(s, "\", "\\")

    ' ダブルクォーテーションのエスケープ
    s = Replace(s, """", "\""")
    
    ' スラッシュのエスケープ
    s = Replace(s, "/", "\/")

    ' バックスペースのエスケープ
    s = Replace(s, Chr(8), "\b")

    ' フォームフィードのエスケープ
    s = Replace(s, Chr(12), "\f")

    ' 改行のエスケープ
    s = Replace(s, Chr(10), "\n")

    ' 復帰のエスケープ
    s = Replace(s, Chr(13), "\r")

    ' 水平タブのエスケープ
    s = Replace(s, Chr(9), "\t")
    
    EscapeJson = s
End Function

3.4. エラー対策のBeforeAfter

3.4.1. Before(エラー対策前)

違いとしてはEscapeJson関数によりエスケープ処理を実行していない点があります。

Before
GenerateTextWithOptions エラー対策前
    Dim p As String 'JSON Payloadを設定する。
    p = p & "{"
        p = p & """model"": ""gpt-3.5-turbo"","
        p = p & """messages"": ["
            'messages内を記載する
            'systemを記載
            p = p & "{""role"": ""system"", ""content"": """ & opt_system & """}"
            'userとassistantを記載(For文で過去の会話履歴を記載する)
            For i = LBound(conversationHistory) To UBound(conversationHistory) '1回目は[0 To -1]でスキップされる
                p = p & ",{""role"": """ & "user" & """, ""content"": """ & conversationHistory(i)(0) & """}"
                p = p & ",{""role"": """ & "assistant" & """, ""content"": """ & conversationHistory(i)(1) & """}"
            Next i
            'userを記載(新しい会話)
            p = p & ",{""role"": ""user"", ""content"": """ & opt_userMessage & """}"
        p = p & "]"
        p = p & ",""max_tokens"": " & opt_maxTokens
        p = p & ",""temperature"": " & opt_temperature
    p = p & "}"

3.4.2. After(エラー対策後)

After
EscapeJson関数の追加
Function EscapeJson(ByVal s As String) As String
    s = Replace(s, "\", "\\")
    s = Replace(s, """", "\""")
    s = Replace(s, "/", "\/")
    s = Replace(s, Chr(8), "\b")
    s = Replace(s, Chr(12), "\f")
    s = Replace(s, Chr(10), "\n")
    s = Replace(s, Chr(13), "\r")
    s = Replace(s, Chr(9), "\t")
    EscapeJson = s
End Function
EscapeJson関数を利用して、JSON Payloadを設定する
    Dim p As String 'JSON Payloadを設定する。
    p = p & "{"
        p = p & """model"": ""gpt-3.5-turbo"","
        p = p & """messages"": ["
            'messages内を記載する
            'systemを記載
            p = p & "{""role"": ""system"", ""content"": """ & opt_system & """}"
            'userとassistantを記載(For文で過去の会話履歴を記載する)
            For i = LBound(conversationHistory) To UBound(conversationHistory) '1回目は[0 To -1]でスキップされる
                p = p & ",{""role"": """ & "user" & """, ""content"": """ & conversationHistory(i)(0) & """}"
                p = p & ",{""role"": """ & "assistant" & """, ""content"": """ & conversationHistory(i)(1) & """}"
            Next i
            'userを記載(新しい会話)
            p = p & ",{""role"": ""user"", ""content"": """ & opt_userMessage & """}"
        p = p & "]"
        p = p & ",""max_tokens"": " & opt_maxTokens
        p = p & ",""temperature"": " & opt_temperature
    p = p & "}"

4. ChatGPT APIのメリットの補足

4.1. 「バッククオート囲み」や「箇条書き時の数字」

ChatGPTチャットだと、コピペできないものもありました。たとえば、「バッククオート囲み」や「箇条書き時の数字」などです。
結局残して置きたい質問内容はスクリーンショットに頼る必要がありなんとかしたかった。

ChatGPTチャットの画面
## 世界人口ランキング
以下は人口が多い国の`数字の箇条書き`の例です。
1. 中国 - 14億人以上
2. インド - 13億人以上
3. アメリカ合衆国 - 3億3千万人以上
4. インドネシア - 2億7千万人以上
5. ブラジル - 2億12千万人以上
ChatGPTチャットからコピペするとこうなる(Markdownが消える)
世界人口ランキング
以下は人口が多い国の数字の箇条書きの例です。
中国 - 14億人以上
インド - 13億人以上
アメリカ合衆国 - 3億3千万人以上
インドネシア - 2億7千万人以上
ブラジル - 2億12千万人以上

ChatGPT API経由だと、以下のように出力してくれて、そのままMarkdownをコピーできる。

ChatGPT API経由だとこのように出力してくれる1
## 世界人口ランキング
以下は人口が多い国の`数字の箇条書き`の例です。
1. 中国 - 14億人以上
2. インド - 13億人以上
3. アメリカ合衆国 - 3億3千万人以上
4. インドネシア - 2億7千万人以上
5. ブラジル - 2億12千万人以上

4.2. コードブロック

ChatGPTにコードのリファクタリングをお願いしたり、コメントを付けてもらったりする際、コードブロックに出力してもらうことがあると思います。
これもChatGPT API経由だと、Markdawnをそのままコピーできます。

ChatGPT API経由だとこのように出力してくれる2
VBAコードをリファクタリングしました。
```vba
Sub A()
    Dim vint As Long
    vint = 1
    vint = C(vint)
    Call B(vint)
End Sub
```

5. 今後の記事アップデート予定

  • たまに起こるExcelが固まる問題を解決する(原因不明)
  • コードの可読性を高める
  • ✔ コードをもっと簡単なしくみにする
  • 解説事項を追加する
    • ✔ ChatGPT APIで使用できる各種パラメーターの説明
    • ✔ 各種パラメーターをGenerateTextWithOptionsの引数で任意に設定できることの説明→セルで設定できるようにした
  • 追加機能の案
    • ✔ 改行付きのInputBox(ユーザーフォームで作成する)→ セルを利用して改行できるようにした。
    • トークン上限対策
      • 4000トークン近くなってきたら前の会話を削除する仕組み(難しい)
      • 会話履歴はX回までという制限をかける仕組み(簡単)
    • 別ワークシートに保存
    • ✔ 過去の会話履歴を読み込んで会話をスタートできる →セルを読み取ることで可能になった
  • 別記事の案
    • Accessで構築しデータベースにChatGPT会話を保存する
    • そもそものAPIやVBA-JSONの使用方法

現在(2023-03-20)のChatGPT APIの最新モデルはgpt-3.5-turboですが、GPT-4 APIが利用できるようになったら早速VBAでの利用方法も記事にしたいと思います!!お楽しみに!!
もちろんGPT-4 API waitlistにも2023-03-15時点で並んでいます。楽しみですね!!

Discussion