ChatGPT HAKADORI Script開発

ExcelでChatGPTを動かしてみた

2023.04.18 火

こんにちは、CMBの藤田です。

2022年11月、米国カリフォルニア州サンフランシスコの人工知能研究企業OpenAI社よりChatGPTがリリースされました。ChatGPTは大規模言語モデル(LLM: Large Language Model)上で構築されたウェブブラウザ用チャットボットで、多くの知識領域にわたる詳細な応答や明確な回答を人工知能(AI)がおこないます。

ChatGPT

ChatGPT

ChatGPTはリリースからわずか2か月後の2023年1月にはアクティブなユーザー数が1億人に達し、史上最も急速に成長したWebアプリとなりました。
今回はそんなChatGPTをExcel上で動かすという実験をしてみました。

 

GPTとは

ChatGPTの GPT とは Generative Pre-trained Transformer の略で、直訳すると 生成的事前学習トランスフォーマー という意味です。かんたんに言うと、大量の言語・知識をあらかじめ学習し文章を自動で生成できるような機能を提供するという意味です。

GPTはGenerative Pre-trained Transformerの略

 

APIをつかってみる

チャットボットであるがゆえにウェブブラウザ上で使うものだと思われがちですが、2023年3月1日 OpenAI社はChatGPT APIを公開しました。APIを利用することで開発者はチャット機能にアクセスできるようになります。APIはチャット機能以外にも画像生成機能や音声テキスト変換機能も利用することが可能です。

Chat:チャット以外にも、
Image generation:画像生成、
Speech to text:音声テキスト変換があります。

APIの使用には、まずAPI keysの取得が必要です。また、モデルによってタイプや使用料が異なります。今回は執筆時点最新版 gpt-4 の次のモデルである gpt-3.5-turbo を試してみました。

 

Excel上でセルに入力した文字列をChatGPT APIに送ってみる

ChatGPT APIは方法によってプログラムの書き方も変わってきます。今回は同じように動作する Excel + ChatGPT API 実行スクリプトを4つ作成してみました。
Excel上のセルC2に入力した質問(プロンプト)をChatGPT APIに送り、その返答をセルC3に反映するというプログラムです。

ExcelセルC2に質問を入力

 

AppleScript

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

property apiKey : "<OPENAI_API_KEY>"

on run
	tell application "Microsoft Excel"
		activate
		tell active workbook
			tell active sheet
				set myPrompt to string value of cell 3 of row 2
				set theReponse to getChatResponse(myPrompt) of me
				set value of cell 3 of row 3 to theReponse
			end tell
		end tell
	end tell
end run

to getChatResponse(myPrompt)
	set cmd to {}
	set end of cmd to "curl"
	set end of cmd to "-k https://api.openai.com/v1/chat/completions"
	set end of cmd to "-H \"Authorization: Bearer " & apiKey & "\""
	set end of cmd to "-H \"Content-Type: application/json\""
	set end of cmd to "-d '{\"model\": \"gpt-3.5-turbo\",\n\"messages\": [{\"role\": \"user\", \"content\": \"" & myPrompt & "\"}],\n\"temperature\": 0.7}'"
	
	set originDelimiter to AppleScript's text item delimiters
	set AppleScript's text item delimiters to (character id 32)
	set sRes to do shell script (cmd as text)
	set AppleScript's text item delimiters to originDelimiter
	
	set jsonString to current application's NSString's stringWithString:sRes
	set jsonData to jsonString's dataUsingEncoding:(current application's NSUTF8StringEncoding)
	set aRes to current application's NSJSONSerialization's JSONObjectWithData:jsonData options:0 |error|:(missing value)
	set chatRes to (aRes's valueForKeyPath:"choices.message.content")
	return (chatRes's firstObject()) as text
end getChatResponse

AppleScriptではプロンプトを入れたAPIリクエストをcurlで送信します。戻り値はJSON形式でかえってくるのでAppleScriptObjCでJSONパースした結果をExcelのセルに反映しています。
AppleScriptですのでmacOSでのみ動作します。

AppleScriptでExcelを操作したところ

AppleScriptでExcelを操作したところ

curlのリクエストおよびJSONのパースはぴよまるソフトウェアさんの記事を参考にしました。ありがとうございます!

 

 

 

VBA

Option Explicit

Sub ChatGptAPI()
    Dim ObjHTTP As Object
    Dim StrURL As String
    Dim StrBody As String
    Dim StrResponse As String
    Dim Prompt As String
    Dim Response As String
    Dim APIKey As String
    Dim Stream As Object
    Dim JsonObj As Object
    Prompt = ActiveWorkbook.ActiveSheet.Cells(2, 3).Value

    ' OpenAI APIキーを設定
    APIKey = "Bearer " & "<OPENAI_API_KEY>"

    ' APIエンドポイントを設定
    StrURL = "https://api.openai.com/v1/chat/completions"

    ' POSTリクエストのボディを設定
    StrBody = "{""model"": ""gpt-3.5-turbo"",""messages"": [{""role"": ""user"", ""content"": """ & Prompt & """}],""temperature"": 0.7}"

    ' WinHttpRequestオブジェクトを作成
    Set ObjHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")

    With ObjHTTP
        ' タイムアウトを設定(オプション)
        .SetTimeouts 100000, 100000, 100000, 100000

        ' POSTリクエストを送信
        .Open "POST", strURL, False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Authorization", APIKey
        .send strBody

        ' ADODB.Streamオブジェクトを作成してバイナリデータをUTF-8でデコード
        Set Stream = CreateObject("ADODB.Stream")
        With Stream
            .Type = 1 ' Binary
            .Open
            .Write objHTTP.responseBody
            .Position = 0
            .Type = 2 ' Text
            .Charset = "UTF-8"
            strResponse = .ReadText
            .Close
        End With
    End With
    
    Set JsonObj = JsonConverter.ParseJson(strResponse)
    
    ' レスポンスを表示
    Response = JsonObj("choices")(1)("message")("content")
    
    ActiveWorkbook.ActiveSheet.Cells(3, 3).Value = Response

    'おかたづけ
    Set Stream = Nothing
    Set JsonObj = Nothing
    Set ObjHTTP = Nothing
End Sub

プログラムを作成するのがいちばん面倒だったのはVBAでした。プロンプトを入れたAPIリクエストをWinHttpRequestで送信します。戻り値はJSON形式でかえってくるのですがVBAは標準だとJSONパースがむずかしいため、JsonConverter.basをダウンロードしてマクロ有効ブック(*.xlms)にモジュールをインポート、さらにMicrosoft Scripting Runtime の参照設定をしています。しかも、戻り値のテキストをUTF-8にデコードしないと文字化けしてしまうためADODB.StreamオブジェクトでUTF-8に対応するというかませ技大会になってしまいました。
ADODB.Streamを使用していますのでWindowsでのみ動作します。

VBAでExcelを操作したところ

VBAでExcelを操作したところ

 

Office製品であれば Microsoft 365 Copilot がリリースされましたが基本的な仕組みは同じです。

 

 

GoogleAppsScript

// API Key
const apiKey = '<OPENAI_API_KEY>'

// スプレッドシート表示の際に呼出し
function onOpen() {
  // シート
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  //スプレッドシートのメニューにカスタムメニュー「ChatGPT > 実行」を作成
  var subMenus = [];
  subMenus.push({
    name: "実行",
    functionName: "getChatResponse"  //実行で呼び出す関数を指定
  });
  ss.addMenu("ChatGPT", subMenus);
}

function getChatResponse(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheets()[0];
    
  var prompt = sh.getRange(2,3).getValue();

  var url = 'https://api.openai.com/v1/chat/completions';

  const headers = {
    'Content-type': 'application/json',
    'Authorization': 'Bearer ' + apiKey
  }

  const data = {
    'model': 'gpt-3.5-turbo',
    'messages': [{'role': 'user', 'content': prompt}],
    'temperature' : 0.7
  }

  const options = {
    'muteHttpExceptions' : true,
    'headers': headers,
    'method': 'post',
    'payload': JSON.stringify(data)
  };
  const response = JSON.parse(UrlFetchApp.fetch(url, options).getContentText());
  var answer = (response.choices[0].message.content).trim();

  sh.getRange(3,3).setValue(answer);
}

ExcelではありませんがGoogleAppsScriptであればGoogleスプレッドシートを操作できます。プログラムを作成するのがいちばん楽だったのはGASでした。
プロンプトを含むデータ(とオプション)のAPIリクエストをUrlFetchAppで送信します。戻り値のJSONは JSON.parse() でパースします。

上記のサンプルではGoogleスプレッドシートの右上に「ChatGPT」というメニューを付けて実行するコマンドを登録しました。
GoogleスプレッドシートですのでOSに関係なく動作可能です。

GoogleAppsScriptでGoogleスプレッドシートを操作したところ

GoogleAppsScriptでGoogleスプレッドシートを操作したところ

Googleスプレッドシート(とドキュメント)であればすでにGPT for Sheets™ and Docs™という拡張機能がありますが基本的な仕組みは同じです。

 

 

 

Python

import openai
import openpyxl

# APIキー
openai.api_key = "<OPENAI_API_KEY>"
xlsx = 'chatGptAPI.xlsx'

def getChatResponse(prompt):
  response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[{"role": "user", "content": prompt}],
  temperature = 0.7
  )
  return response.choices[0].message.content

wb = openpyxl.load_workbook(xlsx)
active_sheet = wb.active
prompt = active_sheet['C2'].value
active_sheet['C3'] = getChatResponse(prompt)
wb.save(xlsx)

Pythonは openai というモジュールが用意されておりプログラムのコードもいちばんシンプルになりました。ただしExcelを openpyxl で操作しているのでブックが開かれているとロックされてしまいます。そのためブックを閉じないとセル入力が反映されないという仕様です。

上記のコードを実行する場合は最初の実行時に各種モジュールをインストールしてください。
パスの指定のみOSに依存しますがmacOSでもWindowsでも動作します。

PythonでExcelを操作したところ

 

ChatGPT APIの可能性

今回はChatGPT APIをExcelで動かしてみましたがあくまでAPIのテストという感じでした。この使い方で応用するとしても課題(質問)をセルごとに列記したExcelにかたっぱしから回答してもらうとかExcelのデータをもとにアイデア出しをサポートしてもらうぐらいしか思いつきません。次回は、そのあたりもっと深堀りして実用的なChatGPT APIの使い方を追求してみようと思います。

-ChatGPT, HAKADORI, Script開発
-, , , , ,