ダビンチにアクセスするマクロを書いてみた

記事
IT・テクノロジー
ChatGPTのAPIは近日公開という情報があり、OpenAIのサイトにてウェイティングリストに登録はしてみたものの、

OpenAIでは既にAPIを提供していて、言語処理を行うGPT-3は有償サービスだけれど、3か月までは18ドル分無料でアクセスできるそうです。

GPT-3は4つのデータモデルを持っているが、もっとも精度が高いのがダビンチで、1000トークンあたり2セントという価格になっています。となると、3か月で90万トークンまで無料で使えるという計算になります。なお1000トークンはおよそ750ワードに相当するそうです。

他に画像を作成するDaleは検証用で現時点では無料、プログラミングコードを生成するCode-Xもベータ版で現時点では無料。

早速アクセスするためのAPIキーを取得し、APIにて質問を送信し、回答を取得するマクロを書いてみました。

APIのメッセージはJson形式で送ることになっていて、Pythonやnodes.jsには公式ライブラリが提供されています。

Curlで直接HTTPプロトコルで送ることもできるので、その例を参考に、Excelのマクロを組んでみました。
スクリーンショット 2023-02-26 214245.png

HTTP通信には、XMLHTTPRequestを使います。
    Dim objHTTP As Object
    Send = Null
    Set objHTTP = CreateObject("msxml2.xmlhttp")
    objHTTP.Open "POST", APIHost, False
    objHTTP.setRequestHeader "Content-Type", "application/json"
    objHTTP.setRequestHeader "Authorization", "Bearer " & APIKey
    objHTTP.Send Msg
APIHostにはopenaiのURL、APIKeyには取得したAPIキー(テキストファイルに保存し、読みだす形)、MsgにはJson形式に加工したリクエスト文字列を予め格納します。

JsonメッセージをExcelマクロで作成するには、VBA-JSONなるBASプログラムがGitHubで公開されているようなのですが、

リクエストの階層が1つとシンプルなので、文字列を&などでつなげて加工するやり方にしました。

HTTPのレスポンスはStatusをチェックしてOK(200)ならレスポンスのJsonメッセージを取り出します。
    ' レスポンスコード(正常)
    If objHTTP.Status = 200 Then
        Debug.Print objHTTP.responseText
        Send = GetAnswer(objHTTP.responseText)
    Else
        MsgBox objHTTP.Status
    End If

Jsonによるレスポンスは、以下のような階層になるようなのですが、
choice.png
取得したいのはchoice下のtextになるので、正規表現を使って取り出すように、即席で作りました。
Public Function GetAnswer(responseText)
    Const Pattern = "(""choices"":\[\{""text"":"")([^""]+)("")"
    Dim matches As Object, i, results

    Set matches = com_RegExpMatch(Pattern, responseText)
    results = ""
    For i = 0 To matches.Count - 1
        results = results & Replace(matches.Item(i).submatches(1), "\n", "") & "/"
    Next
    GetAnswer = results
End Function

com_RegExpMatchは正規表現内の()で囲まれたパーツを取り出すためにmatchオブジェクトを返します。
Public Function com_RegExpMatch(ptn, text, Optional g = True, Optional ic = True) As Object
    Dim matches As Object

    With CreateObject("VBScript.RegExp")
        .Global = g
        .IgnoreCase = ic
        .Pattern = ptn
        Set matches = .Execute(text)
    End With
    Set com_RegExpMatch = matches
End Function

QuestionとAnswerという列をシートに作り、Questionに質問を記述し、Answer列に移動したときに、AIへ質問を送信、回答をAnswer列に書き出すように作成し、
chatGPT.png

マイChapGPT Excel版ができました。

得意分野のフィギュアスケートや登山に関する質問しましたが、ほとんどの回答がFALSEです。

以下、独り言です。

日本で3番目に高いのの間ノ岳と奥穂高岳です。3190mという高さは合っていますが。

Biden Beset by Balloonsの日本語訳は、”バイデン大統領、気球に悩まされる”という感じでは?

伊藤みどりさんは、4回転ジャンプを試合でトライしたこともありません。トリプルアクセルを最初に成功したのは、カナダの男子選手テイラーです。

一番笑えたのは、羽生結弦選手がいつの間にか、平昌オリンピック金メダルから銀メダルに降格されていました。それ以外の情報もFALSEだらけです。
HanyuYuzuru.png

やはり、情報収集という意味では今の所GoogleやWikipediaの方が勝っている感じです。

AIエンジンは、インターネットと接続しているというわけではなく、ある時点での情報をベースに、言語化していて、正確な情報というより、どれだけ人間と会話しているかのような言語ニュアンスが出せるかにフォーカスしている感じはします。

ChapGPTのAPIは、複数のモデルが組み合わさったものなのか

?????
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す