こんにちは、デジタル事業本部の藤田です。
2022年11月、米国カリフォルニア州サンフランシスコの人工知能研究企業OpenAI社よりChatGPTがリリースされました。ChatGPTは大規模言語モデル(LLM: Large Language Model)上で構築されたウェブブラウザ用チャットボットで、多くの知識領域にわたる詳細な応答や明確な回答を人工知能(AI)がおこないます。
ChatGPTはリリースからわずか2か月後の2023年1月にはアクティブなユーザー数が1億人に達し、史上最も急速に成長したWebアプリとなりました。
今回はそんなChatGPTをExcel上で動かすという実験をしてみました。
目次
GPTとは
ChatGPTの GPT とは Generative Pre-trained Transformer の略で、直訳すると 生成的事前学習トランスフォーマー という意味です。かんたんに言うと、大量の言語・知識をあらかじめ学習し文章を自動で生成できるような機能を提供するという意味です。
APIをつかってみる
チャットボットであるがゆえにウェブブラウザ上で使うものだと思われがちですが、2023年3月1日 OpenAI社はOpenAI APIを公開しました。APIを利用することで開発者はチャット機能にアクセスできるようになります。APIはチャット機能以外にも画像生成機能や音声テキスト変換機能も利用することが可能です。
APIの使用には、まずAPI keysの取得が必要です。また、モデルによってタイプや使用料が異なります。今回は執筆時点最新版 gpt-4 の次のモデルである gpt-3.5-turbo を試してみました。
Excel上でセルに入力した文字列をChatGPT APIに送ってみる
ChatGPT APIは方法によってプログラムの書き方も変わってきます。今回は同じように動作する Excel + ChatGPT API 実行スクリプトを4つ作成してみました。
Excel上のセルC2に入力した質問(プロンプト)をChatGPT APIに送り、その返答をセルC3に反映するというプログラムです。
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でのみ動作します。
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でのみ動作します。
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に関係なく動作可能です。
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でも動作します。
ChatGPT APIの可能性
今回はChatGPT APIをExcelで動かしてみましたがあくまでAPIのテストという感じでした。この使い方で応用するとしても課題(質問)をセルごとに列記したExcelにかたっぱしから回答してもらうとかExcelのデータをもとにアイデア出しをサポートしてもらうぐらいしか思いつきません。次回は、そのあたりもっと深堀りして実用的なChatGPT APIの使い方を追求してみようと思います。