【実証・第5弾】「AIの嘘は、AIに論破させろ。」Gemini APIで構築する『自己修復型』全自動監査システム
こんにちは。
60代、現役会社員のいのちゃんです。
突然ですが、世間では「AIで業務効率化!」だの「これからはAIの時代!」だのと、まるでお祭り騒ぎですね。
しかし、毎朝スーツに身を包んでオフィスへ向かい、今なお最前線でシステムと向き合っている私に言わせれば、実務の現場はそこまでお気楽なものではありません。
「生成AIにトラブル報告を読ませたら、もっともらしい嘘(ハルシネーション)をつかれ、あやうく現場の機械を吹っ飛ばしかけた」
「APIを設定したのに、Googleの仕様変更のせいで翌朝にはエラーを吐いてシステムが黙り込んでいた」
……これ、AIを真面目に実務に組み込もうとした人なら、誰もが一度は直面する「冷や汗ルート」ですよね。
ここで「やっぱりAIは使えないな」と諦めて、せっせと手作業のコピペに戻る。あるいは、夜遅くに黒い画面(エディタ)と格闘して、ただでさえ愛おしい髪の毛と睡眠時間をすり減らす。
私は心からそう思いました。
「定年を控えた私の貴重な時間とエネルギーを、Googleの気まぐれに奪われてたまるか」
そもそも、一歩間違えれば機器の破損や火災、大きなトラブルに直面しかねない現場の意思決定を、1台のAIが吐き出した「様子を見ましょう」なんていう呑気な寝言に委ねられるわけがありません。
そこで今回は、AIの「甘い判断」を、もう1台の冷徹な「監査AI(レッドチーム)」が即座に呼び出し、木っ端微塵に論破して正しいアクションを強制する「ダブル・オーディット(AIによる二重検証)システム」を構築しました。
しかも、Googleがエラーを吐こうが、モデルを突然廃止しようが、システム自身が、
「おっと、あいつが駄目ならこのモデルで!」
と勝手に裏で代役を見つけて力技で処理を終わらせる「自己修復(フォールバック)機構」をGAS(Google Apps Script)に完全実装。
もう、中途半端なツールを導入して「人間がAIの尻拭いをする」という本末転倒な日々はおしまいです。
入力以外は人間が1ミリも触らなくていい、正真正銘の「完全自動化された実務システム」の作り方を、すべて公開します。
1. なぜ普通のAI自動化は現場で死ぬのか?
現場報告から初動案を作るシステムを組んだとします。
たとえば、現場でこんなケースを想定してみてほしい。
「オフィスの主配電盤からバチバチと異音がして、焦げ臭いにおいと発熱がある」という深刻なトラブルが発生しました。これに対して、前段のAIがこう回答したらどうでしょうか。
「要約:配電盤からの異音と発熱。リスク:機器の劣化。初動案:しばらく使用を控え、室温を下げて様子を見る」
一見、もっともらしく見えますが、これは致命的なハルシネーション(甘い判断)です。
配電盤からの異音と焦げ臭さは、トラッキング現象や漏電による「今すぐ火災に至る極めて高い初期兆候」です。
「様子を見る」なんていう甘い判断を真に受けたら、ビルごと燃え落ちかねません。
人間なら真っ青になってブレーカーを落とすリスクを、AIは平気でスルーします。
だからこそ、私たちは「生成するAI」の後ろに、「重箱の隅を突いて、前段AIを徹底的に批判・論破するためだけに訓練された冷徹な監査AI(レッドチーム)」を配置しなければならないのです。
2. 3分で完了するスプレッドシートの設計図
業務で使う以上、設定をコードの中に直接書き込むのは厳禁です。
APIキーの変更やモデルの調整のために、一般のユーザーがGASのコードエディタ(黒い画面)を開くこと自体が事故の元だからです。
そこで、スプレッドシートの中に「設定」と「現場報告」という2つのシート(タブ)を作成してください。
①「設定」シート(裏方・非公開)
APIキーを安全に管理するためのシートです。
A1セル: Gemini APIキー
B1セル: あなたのAPIキー(AIzaSy...で始まる文字列)
A2セル: 状態ステータス
B2セル: 自動取得中
💡 いのちゃんの実務ワンポイント:
B1セルの背景色を「薄い黄色」にしておきましょう。 人間は『色がついた枠』を見ると、本能的にそこが入力場所だと理解し、他のセルを誤ってぶっ壊すリスクを最小限に抑えられます。
②「現場報告」シート(メイン画面)
トラブル報告を入力し、AIが一気通貫で処理を行うメイン画面です。
A列に以下の「見出し」をあらかじめ入力しておきます。
A2(現場報告): (ここにトラブル内容を入力)
A3(要約): (前段AIが自動書き込み)
A4(リスク): (前段AIが自動書き込み)
A5(初動案): (前段AIが自動書き込み)
A6(監査判定): (★監査AIが自動で「承認」or「棄却」)
A7(強制アクション): (★監査AIが自動で具体的な指示を書き込み)
これで画面の準備は完了です。
3. 完全自動&自己修復型GASコード
ここからプログラムコードの紹介に入ります。
「うわ、英語だらけのコードだ……無理!」と画面を閉じそうになったあなた、ちょっと待ってください。
安心してください。コードの意味なんて、1ミリも理解できなくて大丈夫です。
GAS(Google Apps Script)を開いて、以下の文字列を「丸ごとコピーして貼り付ける」だけで動くように、私が裏側で「防弾処理」を完璧に施しておきました。
スプレッドシートの上部メニュー「拡張機能」>「Apps Script」を開き、もともと入っているコードをすべて消去して、以下をそのまま貼り付けてください。保存(Ctrl + S / Cmd + S)もお忘れなく。
JavaScript
/**
* 業務自動化:生成AI(前段) -> 監査AI(後段) を一気通貫で実行
*/
function executeBusinessPipeline() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const settings = ss.getSheetByName('設定');
if (!settings) {
SpreadsheetApp.getUi().alert("「設定」シートが見つかりません。");
return;
}
const apiKey = settings.getRange('B1').getValue();
const inputData = sheet.getRange(2, 2).getValue();
if (!inputData) {
SpreadsheetApp.getUi().alert("B2セル(現場報告)が空です。トラブル内容を入力してください。");
return;
}
// --- 1. 前段AI:要約・リスク・初動案の生成 ---
const genPrompt = `以下の現場報告を分析し、必ずJSONのみで返せ。
{"summary": "要約", "risk": "リスク", "action": "初動案"}
現場報告: ${inputData}`;
const genResult = callGeminiApi(genPrompt, apiKey);
if (!genResult) {
sheet.getRange(6, 2).setValue("⚠️ 生成AIエラー(通信失敗)");
return;
}
// B3-B5へ自動書き込み
sheet.getRange(3, 2).setValue(genResult.summary);
sheet.getRange(4, 2).setValue(genResult.risk);
sheet.getRange(5, 2).setValue(genResult.action);
// --- 2. 後段AI:監査(レッドチーム)による二重チェック ---
const auditPrompt = `あなたは監査役です。以下の内容を論理的に精査し、機器破損や安全リスクを見逃している場合は必ず「棄却」せよ。特に様子を見るなどの甘い対応は許さない。
要約:${genResult.summary}
リスク:${genResult.risk}
初動案:${genResult.action}
必ずJSONのみで返せ。{"decision": "判定", "forcedAction": "強制アクションまたは承認理由"}`;
const auditResult = callGeminiApi(auditPrompt, apiKey);
if (!auditResult) {
sheet.getRange(6, 2).setValue("⚠️ 監査AIエラー(通信失敗)");
return;
}
// B6-B7へ自動書き込み
sheet.getRange(6, 2).setValue(auditResult.decision);
sheet.getRange(7, 2).setValue(auditResult.forcedAction);
}
/**
* フォールバック機能付きAPI通信関数(Googleの仕様変更・クォータ制限を無効化)
*/
function callGeminiApi(prompt, apiKey) {
// 優先的に試すモデルのリスト(どれかが死んでも他が自動でカバーする)
const models = ['gemini-2.5-flash', 'gemini-2.0-flash', 'gemini-2.5-pro'];
for (const model of models) {
try {
const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`;
const payload = {
"contents": [{ "parts": [{"text": prompt}] }],
"generationConfig": { "temperature": 0.2 }
};
const res = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
if (res.getResponseCode() === 200) {
const jsonResponse = JSON.parse(res.getContentText());
const text = jsonResponse.candidates[0].content.parts[0].text;
// JSON部分のみを強引に抽出してパースする防弾処理
return JSON.parse(text.match(/\{[\s\S]*\}/)[0]);
}
} catch (e) {
continue; // エラーが発生した場合は、自動的に次のモデルで再試行
}
}
return null; // すべてのモデルが全滅した場合のみnullを返す
}4. 実際の動作画面(スクショ)
私が実際にB2セルに、適当で中途半端な報告(「エアコンがおかしい」程度)を書き込んで実行した際の、「現場報告」シートの実際の画面がこちらです。

前段AIの「様子を見ましょう」というヌルい回答に対し、後ろに控える監査AIが「棄却」を叩き込み、冷徹に「ただちに停止せよ」と強制アクションを出しているのが一目瞭然です。
人間がサボればサボるほど、AIが真顔で引き戻してくれる極めて頼もしい設計です。
5. このシステムが「業務品質」を名乗る2つの理由
普通の技術ブログに載っている「とりあえず動いた!」レベルのコードと、今回のシステムには、実務における戦闘力に決定的な差があります。
①「ダブル・オーディット(多重監査)」の完全同期自動化
前段のAIが考えた「要約・リスク・初動案(B3〜B5)」を、人間が一度もコピペすることなく、同じプログラムの処理の中で、後段の「監査AI(B6〜B7)」へと一撃で受け渡します。
B2にトラブルを入力して実行ボタンを押すだけで、システム内部でAI同士が「生成 ➔ 検問」のディベートを繰り広げ、コンマ数秒で最も安全な結論がシートに書き込まれます。
② エラーをその場でねじ伏せる「自己修復(フォールバック)」
APIを使った業務システムが最もよく死ぬ原因は、Googleの「無料枠の上限(Quota Limit)」や「モデル名の突然の廃止・変更」です。
このコードは、最初に指定した gemini-2.5-flash が「クォータ制限で動かない」と判断した瞬間、即座に次の 2.0-flash、さらに 2.5-pro へと、プログラム自身が裏で代替ルートを勝手に模索して、何事もなかったかのように処理を完了させます。
管理者が真夜中にエラー通知で叩き起こされることはもうありません。
おわりに:中途半端なツールから、本物の業務システムへ
AIを活用して業務を楽にするはずが、いつの間にか「AIのエラーを直す作業」に追われていませんか?
それはシステムが、外部要因に依存しきったデリケートな作りのままだからです。
「エラーが出たら、システム自身に代役を見つけさせる」
「AIが嘘をつくなら、もう1台のAIに論破させる」
この思想こそが、現場を本当に救うB2Bレベルの設計であり、私の note で一貫して追求している「現場で本当に役立つ実用性」の本質です。
ぜひあなたのスプレッドシートにコピペして、その圧倒的な堅牢性と、一気通貫で処理が終わる快感を体感してください。
実務の現場からのフィードバックや、動作報告、コメントをお待ちしています。
そして——
「自社の現場にこういう仕組みを入れたいが、自分では組めない」という方は、声をかけてほしい。
現場を知る60代の実務家として、一緒に考えます。
