AIに問い合わせ返信の下書きを作らせる場合、回答文だけ保存しても「どのFAQや規程を参照したか」「その情報はいつ確認したか」が後から分かりません。料金や受付条件が変わった後に、古い根拠で作った下書きを送る危険があります。
この記事では、GoogleスプレッドシートとGASで、返信下書きに参照元のID・版・確認日時を紐づけ、根拠が古い場合は HUMAN_REVIEW へ戻す最小構成を実装します。AI APIの呼び出しと顧客への自動送信は扱いません。
作るもの
REPLY_DRAFTS と EVIDENCE_SNAPSHOTS の2シートを使います。
REPLY_DRAFTS: draft_id / inquiry_id / draft_text / evidence_status / next_action
EVIDENCE_SNAPSHOTS: snapshot_id / draft_id / source_id / source_version / checked_at / checked_by
source_id はFAQや規程の識別子です。本文をスナップショット表へ複製せず、正本への参照と版だけを記録します。
判定ルール
根拠がない、版が空、または確認から30日を超えた下書きは送信候補にしません。
const MAX_EVIDENCE_AGE_DAYS = 30;
function evaluateEvidence(draft, snapshot, now = new Date()) {
if (!snapshot || !snapshot.sourceId || !snapshot.sourceVersion) {
return { status: 'HUMAN_REVIEW', reason: 'evidence_missing' };
}
const ageDays = (now - new Date(snapshot.checkedAt)) / 86400000;
if (!Number.isFinite(ageDays) || ageDays > MAX_EVIDENCE_AGE_DAYS) {
return { status: 'HUMAN_REVIEW', reason: 'evidence_stale' };
}
return { status: 'READY_FOR_REVIEW', reason: 'evidence_current' };
}
ここで READY_FOR_REVIEW は自動送信の許可ではありません。人が本文、宛先、約束、例外条件を確認する前の「確認材料がそろった」状態です。
シートへ結果を記録する
function writeEvidenceDecision(sheet, row, result) {
sheet.getRange(row, 4, 1, 2).setValues([
[result.status, result.reason]
]);
}
実運用では、同じ draft_id と source_version の組み合わせを重複登録しないキーにします。根拠が更新された場合は既存行を上書きせず、新しいスナップショットを追加して履歴を残します。
自動化してよい範囲
- AI出力から参照元IDの候補を抽出する
- 参照元の版と確認日時を照合する
- 期限切れ、根拠不足、照合不能をキューへ出す
- 人が確認する未処理件数を一覧化する
次は自動化しません。
- 根拠が似ているという理由だけで正しいと確定する
- 契約、料金、返金、苦情、個人情報を自動送信する
- 期限切れの根拠を最新扱いにする
- FAQ本文や顧客情報をログへ複製する
公開前チェックリスト
-
下書きごとに
source_idとsource_versionがある -
checked_atと確認者を記録している - 根拠不足・期限切れ・照合不能を人間レビューへ戻す
-
READY_FOR_REVIEWを自動送信許可と解釈していない - 個人情報や認証情報をスナップショット表へ複製していない
- FAQ・規程の更新時に再確認できる
AI返信の品質を数値だけで測ると、古い情報をもっともらしく説明する問題を見落とします。参照元の版と確認時点を一緒に残せば、次の担当者が「この下書きは何を根拠に作られたか」を確認できます。Miraigentでは、AIに任せる前に根拠の正本と人間確認の境界を小さく固定します。
