生成AIのAPI(OpenAI・Google・Anthropic)を業務システムに組み込むときの費用と安全の設計。トークンの上限、ログ、個人情報のマスキング、障害時の代替
OpenAI・Google・Anthropicの
この
問い合わせの
呼び出しを1か所に集め、そこに上限・ログ・置き換え・代替を持たせる
生成AIの
| 呼び出し口が |
中身 |
|---|---|
| 鍵の管理 | APIの |
| 上限 | 1回の |
| 置き換え | 送る |
| 呼び出し | 使う |
| 再試行と |
エラーの |
| 記録 | トークン数、 |
各機能は
OpenAI が
費用の上限は、1回・1日・1か月の3段で持つ
費用の
| 段 | どこで |
設定の例 | 超えた |
|---|---|---|---|
| 1回 | 呼び出し口 | 入力のmax_tokens、max_output_tokens、maxOutputTokens) |
入力が |
| 1日 | 呼び出し口と、 |
利用者ごと、 |
その |
| 1か月 | 各社の |
組織や |
各社の |
1か月の
出力のstop_reason が max_tokens、finishReason が MAX_TOKENS など)、
使った
送った内容の学習利用と保存を、会社ごとに確かめて記録する
APIに
| 会社 | 公式の |
|---|---|
| OpenAI | APIで |
| Anthropic | 商用の |
| Google |
無料の |
この
この
個人情報は、送る前に記号へ置き換え、対応表はサーバーに残す
業務の
置き換えの
- そもそも
送らない 業務システムの項目を 決める。 表から 文を 組み立てる ときに、 名前や 住所の 列を 入れない。 いちばん確実な 置き換えは、 送らない こと - 自由に
書かれた 電話番号、文の 中は、 型の ある 情報から 置き換える。 メールアドレス、 郵便番号のように 形が 決まった 情報は、 正規表現で 見つけやすい - 戻すための
対応表は、 サーバーの 中だけに 持つ。 「[電話1] =実際の 番号」の 対応は、 生成AIには 送らない
置き換えの
type Masked = { text: string; table: Map<string, string> };
const patterns: [label: string, re: RegExp][] = [
["メール", /[\w.+-]+@[\w-]+(\.[\w-]+)+/g],
["電話", /0\d{1,4}-?\d{1,4}-?\d{3,4}/g],
["郵便番号", /〒?\d{3}-\d{4}/g],
];
export function mask(input: string, knownNames: string[] = []): Masked {
const table = new Map<string, string>();
let text = input;
let n = 0;
const replace = (label: string, value: string) => {
const key = `[${label}${++n}]`;
table.set(key, value);
return key;
};
// 業務システムが知っている名前(顧客・社員)は、文字どおりに置き換える
for (const name of knownNames) {
if (name) text = text.split(name).join(replace("名前", name));
}
for (const [label, re] of patterns) {
text = text.replace(re, (m) => replace(label, m));
}
return { text, table };
}名前は、
Amazon Bedrock
ログには、本文ではなく数と識別子を残す
呼び出しの
| 残す項目 | 使い道 | 本文を |
|---|---|---|
| 日時、 |
誰が |
名前ではなく |
| 会社と |
モデルを |
なし |
| 入力と |
費用を |
なし |
| かかった |
遅さや |
なし |
各社のrequest-id など) |
障害を |
なし |
| 置き換えた |
置き換えが |
置き換えた |
本文を
障害のときは、エラーの種類で再試行と代替を分ける
生成AIの
| エラーの |
例 | 呼び出し口の |
|---|---|---|
| 一時的な |
429 |
retry-after が |
| 利用額の |
各社の |
再試行しない。 |
| 要求の誤り | 400、401、403、413 | 再試行しない。 |
| 時間切れ | 応答が |
決めた |
利用額のretry-after が
代わりの
- 別の
モデル・別の ただし、会社へ回す。 回す先でも 送った 内容の 学習利用と 保存の 条件が 同じである こと、 普段の 質問の セットで 出力を 確かめてある ことが 条件 - AIを
使わずに 下業務を 続ける。 書きの 機能なら 空の 入力欄を 出す、 分類の 機能なら 「未分類」として 人の 確認待ちに 入れる
業務システムに
外部サービスとの
組み込む前のチェックリスト
- APIの
呼び出しが、 システムの 中の 1か所に 集まっているか - APIの
鍵が、 画面の 側や リポジトリに 出ていないか - 本番と
検証で、 プロジェクトか ワークスペースが 分かれているか - 1回・1日・1か月の
上限が、 それぞれ設定されているか - 出力が
上限で 切れた ときに、 正常な 結果と して 扱っていないか - 使う
会社ごとに、 学習利用と 保存の 条件を 確かめた 日が 記録されているか - 送る
項目が 絞られ、 個人情報の 置き換えが 入っているか - 呼び出しの
記録に、 本文が 入っていないか - 利用額の
上限に よる 拒否を、 再試行の 対象から 外しているか - AIが
使えない ときに、 業務が 止まらない 道が あるか
既存の
各社のドキュメント(確認は2026年10月3日)
APIの
- OpenAI「Data controls in the OpenAI platform」:学習利用の
有無、 監視用の 記録の 保持、 削除まで 残る 機能 - OpenAI の
本番環境向けの :鍵の手引き 置き場所、 プロジェクトの 分け方、 利用額の 通知と 上限 - OpenAI「Error codes」:送る
速さに よる 429と、 残高・利用額の 上限に よる 429の 違い、 再試行の 待ち方 - Anthropic
「Is my data used for model training?」 :商用の(Privacy Center) 製品での 学習利用 - Anthropic「Rate limits」:利用額の
上限、 ワークスペースごとの 上限、 retry-after - Anthropic「Errors」:エラーの
種類、 529、 要求の 識別子 - Google「Gemini API Additional Terms of Service」:無料と
有料の 範囲での データの 扱い - Google
「Rate limits」 :レートの(Gemini API) 上限と、 段階ごとの 利用額の 上限 - AWS
「Remove PII from conversations by using sensitive information filters」 :個人情報の(Amazon Bedrock) フィルター、 呼び出しの 記録に 元の 文が 残る こと - AWS「Languages supported by Amazon Bedrock Guardrails」:機微な
情報の フィルターの 日本語への 対応 - 生成AIサービスに
関する :個人データを事業者向けの 注意喚起 (2023年6月2日、 個人情報保護委員会) 渡す ときに 事業者が 確かめる こと
よくある質問
APIの利用料が想定を超えないようにするには、何から設定すればよいですか?
まず
個人情報をマスキングすれば、生成AIのAPIに顧客のデータを送っても問題ありませんか?
マスキングは
1社のAPIが止まったとき、別の会社のAPIに自動で切り替えてもよいですか?
切り