0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI導入の費用対効果を確認工数まで測る:SheetsとGASで続ける・直す・止めるを判定する

0
Posted at

生成AIの導入効果を「一件あたり何分短くなったか」だけで報告すると、確認担当者へ移った作業を見落とします。下書きの確認、例外からの復旧、元の手順へ戻る時間も、業務の費用対効果に含める必要があります。

この記事では、GoogleスプレッドシートとGASで、AI導入前の基準時間と導入後のAI処理時間・人間確認時間・例外復旧時間を記録し、少数の実績から継続判断を作る最小構成を実装します。AI APIの呼び出し、顧客への自動送信、続行・停止の最終決定は扱いません。

作るもの

AI導入の効果を確認工数まで測るための既存承認済み図解

AI_EFFECT_LOG シートの1行目を次の列にします。

case_id,work_name,measured_at,baseline_minutes,ai_minutes,review_minutes,exception_minutes,exception_flag,decision,reason,next_review_at

decision は次の3値だけにします。

CONTINUE  // 通常ケースで効果があり、確認負荷も許容できる
ADJUST    // 効果はあるが、例外・確認条件・入力を直す
STOP      // 影響が大きい、復旧できない、確認者がいない

CONTINUE を自動で付けるのではなく、GASは集計と候補の提示までを担当します。業務責任者が記録を読み、理由と次回確認日を確定します。

4つの時間を分けて記録する

基準時間を baseline_minutes に置き、導入後の時間を三つに分けます。

項目 意味 記録上の注意
基準時間 AIを使わない時の一件の目安 過去の平均なら測定期間を残す
AI処理時間 分類・下書きなどに要した時間 APIの待ち時間だけに限定しない
確認時間 人が読み、直し、根拠を確認した時間 未計測を0にしない
例外復旧時間 停止後に元手順や別担当へ戻す時間 例外がなければ0、未計測は空欄以外の状態で残す

例として10件を次のように記録します。

基準時間: 12分
通常8件: AI 3分 + 確認 4分
例外2件: AI 3分 + 確認 4分 + 復旧 10分

AI導入後の合計は90分、平均は9分です。見かけの短縮は3分ですが、例外を除いて計算したり、確認時間を落としたりすると、実際より良く見えます。件数が少ない間は「効果が証明された」と書かず、「次に確認する条件が見えた」と扱います。

設定をコードの外へ出す

業務ごとに許容する確認負荷は異なるため、基準を設定値として変更できるようにします。

const EFFECT_CONFIG = Object.freeze({
  sheetName: 'AI_EFFECT_LOG',
  minSamples: 10,
  maxAverageMinutes: 10,
  maxExceptionRate: 0.2,
  decisionColumn: 'decision',
  allowedDecisions: ['CONTINUE', 'ADJUST', 'STOP'],
});

maxAverageMinutes と maxExceptionRate は性能保証ではなく、レビューを始める境界です。契約・料金・返金・苦情・個人情報に関係する業務は、数値がよくても自動継続の対象にしません。

ヘッダー名で安全に読み込む

列番号を直接使うと、シートへ列を追加した時に別の項目を書き換える恐れがあります。ヘッダー名から行をオブジェクトにします。

function readEffectLog_() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName(EFFECT_CONFIG.sheetName);
  if (!sheet) throw new Error(`${EFFECT_CONFIG.sheetName} sheet is missing`);

  const values = sheet.getDataRange().getValues();
  if (values.length === 0) return { sheet, headers: [], rows: [] };

  const headers = values[0].map(String);
  const rows = values.slice(1).map((valuesInRow, index) => {
    const row = { _rowNumber: index + 2 };
    headers.forEach((header, column) => {
      row[header] = valuesInRow[column];
    });
    return row;
  });
  return { sheet, headers, rows };
}

効果を集計する

未計測の時間を勝手に0として扱わないため、数値の妥当性を確認してから集計します。

function summarizeEffect() {
  const { rows } = readEffectLog_();
  const measured = rows.filter((row) =>
    Number.isFinite(Number(row.baseline_minutes)) &&
    Number.isFinite(Number(row.ai_minutes)) &&
    Number.isFinite(Number(row.review_minutes)) &&
    Number.isFinite(Number(row.exception_minutes))
  );

  if (measured.length < EFFECT_CONFIG.minSamples) {
    return {
      status: 'INSUFFICIENT_SAMPLE',
      sampleCount: measured.length,
      required: EFFECT_CONFIG.minSamples,
    };
  }

  const total = measured.reduce((sum, row) => sum +
    Number(row.ai_minutes) +
    Number(row.review_minutes) +
    Number(row.exception_minutes), 0);
  const baseline = measured.reduce((sum, row) =>
    sum + Number(row.baseline_minutes), 0);
  const exceptions = measured.filter((row) => row.exception_flag === true ||
    String(row.exception_flag).toUpperCase() === 'TRUE').length;
  const averageMinutes = total / measured.length;
  const exceptionRate = exceptions / measured.length;

  return {
    status: 'READY_FOR_REVIEW',
    sampleCount: measured.length,
    baselineAverageMinutes: baseline / measured.length,
    actualAverageMinutes: averageMinutes,
    savedAverageMinutes: baseline / measured.length - averageMinutes,
    exceptionRate,
    suggestedDecision: exceptionRate > EFFECT_CONFIG.maxExceptionRate
      ? 'ADJUST'
      : averageMinutes <= EFFECT_CONFIG.maxAverageMinutes
        ? 'CONTINUE'
        : 'ADJUST',
  };
}

実運用では、同じ業務でも通常・境界・停止ケースを混ぜて記録し、入力条件も残します。例外率が高い時にサンプルから例外を外して再集計するのは、改善ではなく指標の隠蔽になり得ます。

判断ログへ戻す

集計結果をそのまま承認欄へ書き込まず、次の項目を人が確認します。

  • どの業務と入力条件を測ったか
  • 基準時間はいつの手順を基準にしたか
  • 確認時間に根拠確認や差し戻しを含めたか
  • 例外時に元の手順へ戻れたか
  • 次に直す場所はフォーム、FAQ、CRM、承認ルールのどこか
  • 次回レビュー日と責任者は誰か

suggestedDecision はあくまで候補です。STOP は、重大な影響、復旧不能、確認者不在などの理由を優先して人が記録します。

運用チェックリスト

  • 基準時間とAI導入後の時間を同じ業務単位で測っている
  • AI処理・人間確認・例外復旧を別の列にしている
  • 未計測を0として平均に入れていない
  • 通常・境界・停止ケースを混ぜている
  • 少ない件数の結果を性能保証として説明していない
  • 集計結果は人の継続・修正・停止判断へ戻している
  • 顧客本文、氏名、メールアドレス、認証情報をログへ複製していない

費用対効果は、AIが何件処理したかだけでは決まりません。減った時間の隣に、確認する人の時間、例外から戻る時間、見直しのための時間を置くことで、次に続ける条件を説明できます。Miraigentでは、AIへ任せる範囲を広げる前に、確認できる量と止める条件を業務ログへ固定します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?