AIの業務活用

AIが作成した業務メールを送信前に確認する方法

AIが作成した業務メールを元の情報と照合し、事実、数値、日付、宛先、文体、約束表現を確認します。小さな例を使って、人が送信前に確認すべきポイントを整理します。

目次を表示

この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English

対象読者AIチャットアシスタントで業務メールの下書きを作成し、送信前に一定の手順で確認したい実務担当者向けです。

準備するもの
  • Python 3.12
  • テキストエディタとターミナル

01AIメールにも最終確認が必要な理由

AIチャットアシスタントはメモから自然な業務メールをすばやく作成できますが、文章が流暢でも内容が正しいとは限りません。数量が変わったり、2つの日付の意味が入れ替わったり、別の相手向けの内容になったり、単なる依頼が確定した約束のように書かれたりすることがあります。

以下は合成した例です。重要なのは、文章作成と確認を分けることです。AIには文章を整えさせ、送信前には元の情報と自分で照合します。

02まず確認済みの事実を書き出す

架空の仕入先にサンプル部品を依頼するメールを送るとします。AIに下書きを依頼する前に、変更してはいけない事実を整理します。

項目確認済みの元情報
宛先Mina Park
会社Example Parts
サンプル数量24 units
単価$18.50
計算した合計$444.00
希望納期October 7, 2026
社内確認日October 9, 2026
確定状況October 7 is requested, not confirmed

計算は24 × $18.50 = $444.00です。October 7は仕入先への希望納期で、October 9は社内確認日です。元のメモには、支払時期、今後の注文、承認、納期保証を約束してよいという情報はありません。

03不足情報を推測しないようAIに依頼する

使いやすいプロンプトには確認済みの事実を入れ、不明な情報を勝手に補わないよう明示します。

典型的なAI回答は次のようになります。'Hello Mina, We would like to request 24 sample units at $18.50 per unit, for a total of $444.00. If possible, please arrange delivery by October 7, 2026, as our internal review is scheduled for October 9. Please let us know whether this delivery date is feasible. Best regards.' 文面としては自然でも、送信前の確認は必要です。

04事実、数値、日付、宛先、文体、約束を確認する

  1. 事実:氏名、会社名、製品説明、プロジェクト名などを元の資料と照合します。
  2. 数値:数量、価格、合計、割合、寸法などの重要な値は、下書きを信用せず自分で再計算します。
  3. 日付:日付そのものだけでなく、その日付が何を意味するかも確認します。希望日と確定日は同じではありません。
  4. 宛先:氏名、所属、実際のメールアドレスを確認し、CCやBCCに本当に必要な相手だけが入っているか見直します。
  5. 文体:必要以上に強い表現、曖昧な表現、くだけすぎた表現、根拠以上に確信を示す表現を修正します。
  6. 約束:guarantee、definitely、confirmed、approved、will pay、will deliverなど、権限のない確約と受け取られる表現を確認します。

この合成例では、24 units、$18.50、$444.00、October 7、October 9が元情報と一致しています。また、'if possible'と書き、納期が可能か確認しているため、October 7がすでに確定済みとは表現していません。

05Pythonで繰り返せる一次チェックを行う

次の標準ライブラリだけを使うスクリプトはdraft_email.txtを読み込み、合成例で必要な情報が含まれているか確認し、合計金額を再計算し、注意が必要な約束表現を検索します。結果はoutputs/email_check_report.txtに保存します。元の下書きは変更せず、outputsフォルダがすでに存在する場合は既存結果を上書きせず停止します。

python
from pathlib import Path
from decimal import Decimal
import sys

DRAFT_PATH = Path("draft_email.txt")
OUTPUT_DIR = Path("outputs")
REPORT_PATH = OUTPUT_DIR / "email_check_report.txt"

if not DRAFT_PATH.is_file():
    sys.exit("Missing input file: draft_email.txt")

if OUTPUT_DIR.exists():
    sys.exit("Stop: outputs folder already exists. Remove or rename it manually first.")

recipient = "Mina Park"
company = "Example Parts"
quantity = 24
unit_price = Decimal("18.50")
expected_total = Decimal(quantity) * unit_price
requested_date = "October 7, 2026"
review_date = "October 9, 2026"

required_text = {
    "recipient": recipient,
    "company": company,
    "quantity": "24",
    "unit price": "$18.50",
    "total": f"${expected_total:.2f}",
    "requested delivery date": requested_date,
    "internal review date": review_date,
}

risky_phrases = [
    "guarantee",
    "guaranteed",
    "definitely",
    "delivery is confirmed",
    "we confirm payment",
    "we will place future orders",
]

draft = DRAFT_PATH.read_text(encoding="utf-8")
draft_lower = draft.lower()

lines = []
lines.append("AI EMAIL DRAFT CHECK")
lines.append("====================")
lines.append(f"Calculated total: {quantity} x ${unit_price:.2f} = ${expected_total:.2f}")
lines.append("")
lines.append("Required details:")

for label, value in required_text.items():
    status = "PASS" if value.lower() in draft_lower else "CHECK"
    lines.append(f"{status}: {label} -> {value}")

lines.append("")
lines.append("Risky promise phrases:")
found_risk = False

for phrase in risky_phrases:
    if phrase in draft_lower:
        found_risk = True
        lines.append(f"CHECK: found phrase -> {phrase}")

if not found_risk:
    lines.append("PASS: none of the listed phrases were found")

lines.append("")
lines.append("Manual checks still required:")
lines.append("- Verify the actual To, CC, and BCC addresses in the mail client.")
lines.append("- Confirm that October 7 is presented as requested, not guaranteed.")
lines.append("- Confirm tone and context against the original conversation.")
lines.append("- Check for commitments not covered by this phrase list.")
lines.append("- Verify attachments before sending.")

OUTPUT_DIR.mkdir()
REPORT_PATH.write_text("\n".join(lines) + "\n", encoding="utf-8")
print(f"Created: {REPORT_PATH}")

下書きをdraft_email.txt、スクリプトをemail_check.pyとして保存し、python email_check.pyを実行します。PASSは必要な文字列が見つかった、または登録した注意表現が見つからなかったという意味にすぎません。メールが承認済み、またはそのまま送信して安全という意味ではありません。

06よくあるミスを確認する

  • 会話の別の場所に25という数字があるため、数量が24から25に変わってしまいます。
  • 単価は正しいのに、合計金額が誤って転記または計算されます。
  • October 9が社内確認日ではなく、仕入先の納期として書かれます。
  • October 7までの納品が可能か確認する依頼が、October 7納品確定という表現に変わります。
  • 元のメモにない支払時期、承認、今後の購入数量などの約束をAIが追加します。
  • 本文ではMina Parkと正しく書かれていても、To欄には似た名前の別の相手が入力されています。

キーワードによる確認には明確な限界があります。'$444.00'が含まれていても誤った文脈で使われている可能性があります。また、注意表現の一覧にない別の言い回しで約束を作ってしまうこともあります。自動チェックは単純な不一致を見つける補助であり、最終的に人が読む作業の代わりにはなりません。

07送信前に最終チェックリストを使う

  1. 元のメモや記録を下書きの横に開きます。
  2. すべての氏名、会社、製品、数量、金額、日付を確認します。
  3. 重要な計算は独立して再計算します。
  4. 日付が書かれているかだけでなく、それぞれの日付の意味も確認します。
  5. 約束、承認、保証、確定表現がないかを目的を決めて読み直します。
  6. 実際のTo、CC、BCC、添付ファイルを確認します。
  7. 送信前に受信者の立場から最終文面を一度読みます。

実務では、AIには文章作成を補助させ、事実確認と組織として何を約束できるかの判断は人が行うよう役割を分けるのが適切です。契約、法的義務、機密情報、規制対象の判断、安全上の問題、大きな金額が関わるメールでは、この簡易チェックだけに頼らず、組織の正式な確認・承認手順に従ってください。

実行・検証の記録

2026-09-21 · hand-checked example · Python 3.12

  • 24 × $18.50 = $444.00であることを手計算で確認しました。
  • October 7, 2026が希望納期で、October 9, 2026が社内確認日であることを確認しました。
  • 例の下書きがOctober 7を確定済みと書かず、対応可能か確認する表現になっていることを確認しました。
  • スクリプトがdraft_email.txtを変更せず読み取るだけであることを確認しました。
  • 生成されるファイルがoutputs/email_check_report.txtだけであることを確認しました。
  • outputsフォルダがすでに存在する場合にスクリプトが停止する構成であることを確認しました。
  • スクリプトがPython 3.12の標準ライブラリだけを使用することを確認しました。
検証範囲の限界
  • コードは確認し、小さな例は手作業で計算しましたが、コード自体は実行していません。
  • 単純な文字列検索だけでは、文章が事実として正しいことを証明できません。
  • 注意表現の一覧だけでは、すべての約束、保証、承認、確約を検出できません。
  • スクリプトでは実際のTo、CC、BCCのアドレス、添付ファイル、組織内の権限、メールスレッド全体の文脈を確認できません。
  • 法務、契約、財務、安全、機密、規制対象の連絡では、組織が定める正式な確認手順を使用してください。

サイト全体の執筆・検証方針

参考資料

説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。