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に渡す前の事故受付CSVをNode.jsで止める最小パターン"

0
Posted at

事故受付や問い合わせ調査で、AIに読ませる前のCSVにメールアドレスや証券番号が残っていると、プロンプトを工夫しても遅いです。最初に止める場所は、AIの返答ではなく入力ファイルです。

ここでは、保険代理店の事故受付を例に、ローカルの架空データだけで「危ない列名や値があれば終了コード1で止める」小さなNode.jsチェックを書きます。Claude Codeの権限やsandboxは公式ドキュメントで確認しつつ、この記事では実装パターンだけに絞ります。

先に分けるフォルダ

原本とAI用コピーを同じフォルダに置かないのが前提です。

  • claim-raw/: 原本メール、証券PDF、診断書、写真、見積
  • claim-ai-work/: 匿名化済みCSV、分類表、メール下書き材料
  • claim-approved/: 人が承認した出力

Claude Codeの公式ドキュメントでは、permissionsとsandboxは別の層として扱われます。permissionsでtoolのアクセスを絞り、sandboxでBashと子プロセスのファイルアクセスを絞る、という考え方です。

確認した公式ページは、Claude Codeのpermissionsとsandboxです。permissionsはRead、Edit、Bashなどのtoolがどこへ触れるかを決めます。sandboxはBashコマンドと子プロセスにファイルシステムやネットワークの境界をかけます。どちらか片方で完了と見なさず、入力ファイルを減らしたうえで二重に止める形にします。

最小チェックコード

以下はコピペで動く検査例です。実データは使わず、通してよい架空CSVと止めたい架空CSVを配列に入れています。

const files = [
  {
    path: "claim-ai-work/intake-redacted.csv",
    text: "claim_id,case_type,redacted_summary\nC-001,auto_property,front bumper damage"
  },
  {
    path: "claim-ai-work/bad.csv",
    text: "claim_id,email,policy_number\nC-002,taro@example.com,AB1234567890"
  }
];

const blockedFieldNames = [
  "name",
  "email",
  "phone",
  "address",
  "policy_number",
  "vin",
  "diagnosis",
  "hospital",
  "counterparty"
];

const valuePatterns = [
  /[A-Z]{2}\d{10}/,
  /[\w.+-]+@[\w.-]+\.[A-Za-z]{2,}/,
  /\b\d{2,4}-\d{2,4}-\d{3,4}\b/
];

const findings = [];

for (const file of files) {
  const lower = file.text.toLowerCase();
  for (const field of blockedFieldNames) {
    if (lower.includes(field)) {
      findings.push({ path: file.path, type: "blocked field", field });
    }
  }
  for (const pattern of valuePatterns) {
    if (pattern.test(file.text)) {
      findings.push({ path: file.path, type: "blocked value", pattern: String(pattern) });
    }
  }
}

console.table(findings);
if (findings.length > 0) process.exitCode = 1;

実ファイルを読む版にする場合も、まずは架空データで「止まること」を確認します。止まるテストがない検査は、入力境界として信用しにくいです。

実ファイル版へ変える時

配列の files を実ファイル読み込みに変える時も、いきなり claim-raw/ を対象にしません。読む対象は claim-ai-work/ のみです。Node.jsなら fs.readdir で対象拡張子を .csv.json.md.txt に絞り、PDFや画像が来たら「未対応」として止めます。黙って通すより、対応外を明示して人の確認へ戻すほうが事故を減らせます。

終了コードも運用上の約束にします。process.exitCode = 1 ならClaude Codeへ渡さない、0 でも人が作業コピーを目視する、という2段階です。CIに入れるなら失敗時に検出値そのものを長く出さず、ファイル名、種類、項目名までに抑えます。ログへメールアドレスや証券番号を再掲すると、検査が新しい漏えい経路になります。

よくある失敗

一番多い失敗は、列名だけを見ることです。memo 列の中に住所や病名が残ると、列名検査では通ります。上のコードは値の正規表現も見ますが、PDF、画像、手書き、複数列を組み合わせた再識別までは見ません。

次の失敗は、検査を実データで試すことです。ターミナル履歴、スクリーンショット、CIログに値が残ります。許可サンプルも拒否サンプルも、架空の受付IDと架空のメールだけで作ります。

もう一つの注意点は、正規表現を増やしすぎて運用が止まることです。検出を細かくするほど誤検知も増えます。最初は「列名で止める」「メールや電話らしい値で止める」「未対応ファイルを止める」の3つに絞り、止まった件数と人の確認結果を見ながら足します。

運用に入れる時の境界

検査コードだけで安全とは言いません。実運用では、Claude Codeのpermissionsで claim-raw/ をdenyし、sandbox側でも同じ原本フォルダを読めないようにします。さらに、AIに渡すCSVは許可列方式にして、自由記述は短い伏せ字要約へ変えます。

公式情報は、Claude Codeのpermissionsとsandbox、金融庁の金融分野個人情報保護、個人情報保護委員会のクラウド注意喚起を確認してください。個別の法務判断は、自社の責任者や専門家が行う前提です。

まとめ

AI入力前チェックは、完璧な匿名化ツールではありません。それでも「明らかに渡してはいけない列や値が残っていたら止める」だけで、事故受付の初手はかなり変わります。大事なのは、原本フォルダ、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?