
アドベントカレンダー2023 #14 : OpenAI APIを使った予算差異分析
はじめに
予算差異分析は、予算執行管理の重要な部分を占めています。この分析を通じて、予定された予算と実際の支出や収入の差異を明らかにし、その背後にある事業計画の進捗状況を理解することができます。このプロセスは、日々の変動するデータに素早く対応する必要がありますが、あらゆる角度での差異分析やすう勢確認など自動化すべき作業が多い。OpenAIのAPIを使用して、予算差異分析の一部でも自動化し効率化できると嬉しい。
OpenAI APIの基本概要
OpenAIのAPIは、機械学習モデルを活用しデータ分析タスクを実行できる強力なツールです。このAPIを利用することで、予算差異分析のような複雑な数表の確認を効率的に処理することが可能になります。ブラウザからの利用と同じようにAPIでも、プロンプトを送ることで結果が返ってくる仕組みです。GoogleAppsScriptでの実装も可能なので、すぐに作れました。

OpenAI APIと予算差異分析の組み合わせ
基本的な予算差異分析は、予算差異表(各種シートにデータとして保管)とAIのプロンプトを組み合わせれば、自動分析をすることが可能になります。分析結果は、分析というより要約に近いかな。どこを調べればよいかあたりをつけれくれる程度ですが、無いよりは楽。
OpenAIを呼び出す処理の作成
AIチャットボットから呼び出されるプロセスにおいても、上記図の各種シート(Sheetsの中にある3シート)は、非同期に自動更新されます。AIチャットボット(Agent)から、GASが呼ばれた際には、これらのシートを用いて、OpenAIのAPIをコールし分析を実行します。
APIの実行結果を、GASのレスポンス、最終的には、AIチャットボットのレスポンスとする方法を採用してみる。
まずは、スプレッドシートからのAPIコールを、実装してみました。
プログラム
設定シートに各種パラメータを設定し、それに従ってプログラムが実行する仕様です。
function callOpenAI() {
// 1. 設定シートからプロンプトを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('設定');
// OpenAIのAPI設定
var apiKey = sheet.getRange('B1').getValue(); // APIキーを入力
var endpoint = sheet.getRange('B2').getValue(); // チャットエンドポイント
var gptModel = sheet.getRange('B3').getValue(); // 使用するモデル
var promptCell = sheet.getRange('B4').getValue(); // プロンプトを入力するセル
var responsCell = sheet.getRange('B5').getValue(); // 回答を記載するセル
var promptText = sheet.getRange(promptCell).getValue(); // プロンプト文字列
// シート内容をプロンプトに追加する
var targetSheetName = sheet.getRange('B6').getValue(); //対象の表を記載したシート名
var targetRange = sheet.getRange('B7').getValue(); //対象の表の範囲
// 指定されたシートと範囲から表データを取得
var targetSheet = ss.getSheetByName(targetSheetName);
var dataRange = targetSheet.getRange(targetRange);
var dataValues = dataRange.getValues();
// 表データをプロンプト文字列として整形
var dataString = "";
for (var i = 0; i < dataValues.length; i++) {
dataString += dataValues[i].join("\t") + "\n";
}
// プロンプトにデータを追加
promptText += "\n\n" + dataString;
// OpenAIのAPI(リクエスト内容)
var payload = {
'model': gptModel, // モデルパラメータを追加
'messages': [
{
'role': 'user',
'content': promptText
}
]
};
var options = {
'method' : 'post',
'headers' : {
'Authorization': 'Bearer ' + apiKey,
'Content-Type': 'application/json'
},
'payload' : JSON.stringify(payload),
'muteHttpExceptions': true
};
// 2. APIを呼び出し、応答を取得
try {
var response = UrlFetchApp.fetch(endpoint, options);
var jsonResponse = JSON.parse(response.getContentText());
// APIの応答をログに出力
Logger.log(jsonResponse);
// 3. 応答を設定シートのセルB3に記載
if (jsonResponse.choices && jsonResponse.choices[0] && jsonResponse.choices[0].message) {
var assistantResponse = jsonResponse.choices[0].message.content;
sheet.getRange(responsCell).setValue(assistantResponse);
} else {
sheet.getRange(responsCell).setValue("APIからの応答が不正です。");
}
} catch (error) {
// エラー処理
Logger.log(error);
sheet.getRange(responsCell).setValue("APIリクエスト中にエラーが発生しました: " + error.message);
}
}
設定シートとデータシート
以下の図のように、apiKeyからpromptまでを、設定シートにパラメータを設定し動作させる仕様です。(B6、B7のセルは、分析対象となる売上予算差異表のシート名とRangeを表しています。)


まとめ
今日は、GoogleスプレッドシートでOpenAIのAPIを実行するためのGoogle Apps Script(GAS)のコードを作成しました。このプログラムは、設定シートとデータシートの2つから構成されており、doPost()メソッドを利用してAPIを実行する機能を備えれば、そのままの形で利用できるようにしています。このようなツールを使えば、予算差異分析をより効率的に行うことができそうです。