Notes開発者のためのXPagesデザインレシピ

簡単でCoolなXPagesアプリケーションを作るための情報を発信していきます

Notesクライアント 生成AI

NotesクライアントからChatGPTに質問してみよう(前編)

はじめに

 生成AIがブームですが、今回はNotesクライアントからLotusScriptを使ってChatGPTへの問合せをしてみようと思います。「ChatGPTはブラウザで使えるんだからNotesクライアントから使う意味ってある?」って話はありますが、Notesクライアントから呼び出すことによって下記のメリットが得られると思います。

  1. 問合せの記録を残すことで社内情報の漏洩リスクを下げることができる。
  2. 問合せ結果を事実確認・検証・評価した結果を残すことができる。
  3. 別のユーザーが問い合わせた結果を知見として共有できる。

 今回は左に入力した質問、得られた回答、事実確認結果などを表示し、右に自分が残した回答を時系列で表示する画面構成にします。回答結果はすぐに保存するのではなく、気に入った回答、意味がある回答のみ「残す」ボタンを使って文書として保存する形にします。

【完成イメージ】

 ChatGPTへの問合せはLotusScriptを使ってNotesクライアントから直接行うため、ブラウザを使ってホームページを参照する場合と同じ経路を使ってHTTPS通信が行われます。

【ネットワーク図】

※今回のLotusScriptではNotesJSONクラスを利用しているためNotesV10以上のNotesクライアントが必要です。

前準備:OpenAIのアカウント登録とAPIキー発行

 プログラムを使ってChatGPTへの問合せを行うにはOpenAIのホームページにアカウントを登録し、APIキーを取得する必要があります。

  1. OpenAIへのホームページに行き、「GetStarted」ボタンからアカウントを登録する。

  2. 左ナビゲーションから「API Keys」を選択し、「Create new secret key」をクリックする。

  3. キーに対して適当な名前を付ける。

  4. 発行されたキーをコピーする。

 これでAPIキーは発行されました。問合せを行うにはAPIを利用するための金額をチャージする必要があります。最低チャージ金額は5ドルですので下記の手順でチャージします。(2024/3/15時点のレートでは755円でした。)

  1. 左ナビゲーションから「Settings>Billing」をを選択し、「Add payment details」をクリックする。

  2. 会社で行う場合は「Company」、個人で行う場合は「Individual」をクリックする。

  3. (個人の場合)クレジットカード番号を入力する。(デビットカードでも問題ないようです。)

  4. チャージ金額を入力し、「Continue」ボタンをクリックする。

  5. 確認画面で「Confirm Payment」をクリックする。

LotusScriptでChatGPTに問合せする

 いよいよLotusScriptを使ってChatGPTに問合せを行います。フォームには「問合せを入力するフィールド(編集可能)」と「問合せ結果を入力するフィールド(作成時の計算結果)」「問合せを行うボタン」を作成します。(下記の画面では赤矢印部分)

【入力フォーム-frmChatInput】

 ChatGPTへの問合せは下記のようなJSONフォーマットが最低限必要です。今回は「content」部分にフィールドから入力した質問を書き込み、問合せを行います。

【問合せJSONフォーマット】

{
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": "滋賀のおいしいイタリアンを5店舗リストアップしてください。"
        }
    ]
}

 「送信」ボタンに書き込むLotusScriptは下記のようになります。このコードで「質問」フィールドに入力した値を送信し、レスポンスを「回答」フィールドに書き込みます。(エラーコード判定のために念のためHTTPレスポンスコードもフィールドに書き込んでいます。 )

【LotusScriptコード】

Sub Click(Source As Button)
	'---------- ---------- ---------- ---------- ---------- 
	'OpenAI APIから取得したレスポンスを書込み
	'
	'---------- ---------- ---------- ---------- ---------- 	
	Const APIURL = "https://api.openai.com/v1/chat/completions"
	Const APIKEY = "(取得したAPIKEY)"
	Const MODEL = "gpt-3.5-turbo"
	
	'クラス・変数宣言	
	Dim ws				As New NotesUIWorkspace
	Dim uidoc			As NotesUIDocument
	Dim doc			As NotesDocument
	Dim session		As New NotesSession
	Dim jsonNav		As NotesJSONNavigator
	
	Dim vXml			As Variant					'XMLオブジェクト
	Dim sUrl			As String					'送信するURL	
	Dim sRequest		As String					'入力した質問
	Dim sBodyJson		As String					'送信するJSON文字列
	Dim sContent		As String					'回答本文
	
	'クラス・変数セット
	Set uidoc		= ws.CurrentDocument
	Set doc		= uidoc.Document
	
	'実行確認
	sRequest		= doc.Request(0)
	If sRequest = "" Then
		Msgbox "質問を入力して下さい。"
		Exit Sub
	End If
	
	'Getリクエストを実行し、結果を取得
	Set vXml = CreateObject("MSXML2.XMLHTTP")	
	vXml.Open "POST", APIURL, False
	vXml.setRequestHeader "Content-Type", "application/json"
	vXml.setRequestHeader "Authorization", "Bearer " & APIKEY
	
	sBodyJson		= |{"model":"| & MODEL & |", "messages":[ {"role":"user", "content":"| & sRequest & |"} ] }|	
	vXml.send sBodyJson
	
	'エラーレスポンスチェック
	If vXml.Status <> 200 Then
		Msgbox  vXml.responseText , 16 , "Error : " & Cstr(vXml.Status)
		Exit Sub
	End If
	
	'レスポンスから回答を抽出
	Set jsonNav	= session.CreateJSONNavigator(vXml.responseText)
	sContent		= jsonNav.GetElementByPointer("/choices/0/message/content").Value
	
	'回答をフォームに書込み
	doc.HttpStatus	= vXml.Status
	doc.Response	= sContent
	
	
End Sub

【実行結果】

※画像をクリックするとアニメgifが再生されます。

次回予告

 これで問合せすることができるようになりました。しかし、質問に改行を入れると下記のようなエラーが表示されます。次回はこの問題の解決から行っていきます。