IT技術ブログ

生成AIのAPI(OpenAI・Google・Anthropic)を業務システムに組み込むときの費用と安全の設計。トークンの上限、ログ、個人情報のマスキング、障害時の代替

OpenAI・Google・Anthropicの生成AIのAPIを業務システムに組み込むときの、費用と安全の設計をまとめます。呼び出しを1か所に集める構成、3段の上限、ログに残す項目、個人情報の置き換え、障害時の再試行と代替まで。

この記事の結論:生成AIのAPIを業務システムに組み込むときは、各機能から直接APIを呼ばず、呼び出しを1か所(AIの呼び出し口)に集めて、そこに費用と安全の決まりをまとめて持たせます。持たせるのは、①1回・1日・1か月の3段の上限、②本文ではなく件数とトークン数と識別子を中心にしたログ、③送る前の個人情報の置き換え、④エラーの種類ごとの再試行と、AIなしでも業務が止まらない代わりの道、の4つです。OpenAI・Google・Anthropicのどれを使っても、この形は変わりません。

問い合わせの下書き、文書の要約、入力の分類といった機能を、自社の業務システムに生成AIのAPIで足そうとしている情報システムの担当の方と開発者を読み手に想定しています。どの業務にAIを使うかの選び方や、社員がチャットの画面で使うときのルールは扱わず、システムに組み込む側の設計に絞ります。

呼び出しを1か所に集め、そこに上限・ログ・置き換え・代替を持たせる

生成AIのAPIを呼ぶ処理は、機能ごとに書かず、システムの中の1つの呼び出し口に集めます。上限やログや置き換えを機能ごとに書くと、新しい機能を足すたびに、どれかが抜けるからです。

呼び出し口が受け持つこと 中身
鍵の管理 APIの鍵はサーバーの秘密の置き場所から読み、画面の側には渡さない
上限 1回の入力と出力の上限、利用者と機能ごとの1日の上限を確かめる
置き換え 送る前に、個人情報を記号に置き換える
呼び出し 使う会社とモデルを、設定で切り替えられるようにする
再試行と代替 エラーの種類を見て、待って再試行するか、代わりに回すかを決める
記録 トークン数、かかった時間、結果の種類、各社の要求の識別子を残す

各機能は「どの機能から、誰が、何を頼むか」だけを呼び出し口に渡します。会社やモデルの名前を各機能に書かないでおくと、後からモデルを変えるときに直す場所が1つで済みます。

OpenAI が公開している本番向けの運用の手引きでも、APIの鍵をコードや公開のリポジトリに置かず、環境変数や秘密の管理の仕組みに置くこと、本番と検証で別のプロジェクトを分けることが勧められています。プロジェクトを分けておくと、検証の呼び出しが本番の上限を食いつぶすことも防げます。

費用の上限は、1回・1日・1か月の3段で持つ

費用の上限は、1か所だけに頼らず、1回の呼び出し、1日の使い方、1か月の請求の3段で持ちます。どこか1段の設定を誤っても、次の段で止まるようにするためです。

段 どこで持つか 設定の例 超えたときの動き
1回 呼び出し口 入力の文字数の上限と、出力のトークンの上限(max_tokens、max_output_tokens、maxOutputTokens) 入力が長すぎれば送らずに断る。出力が上限で切れたら、その旨を記録する
1日 呼び出し口と、使った量の集計の表 利用者ごと、機能ごとの1日のトークン数 その日はAIを使わない動きに切り替え、担当者へ知らせる
1か月 各社の管理画面 組織やプロジェクト、ワークスペースの利用額の上限と通知 各社の側で呼び出しが止まる

1か月の段は、各社とも管理画面で設定できます。Anthropic のドキュメントでは、組織の利用額の上限を自分で下げて設定でき、ワークスペースごとにも利用額とレートの上限を持てる、とあります。OpenAI では、利用額が一定を超えたら通知する設定と、超えたら呼び出しを止める上限(hard spend limit)を案内しています。Google の Gemini API でも、支払いの実績で決まる段階ごとに利用額の上限が設けられています。

出力のトークンの上限は、費用だけでなく、応答の速さにも効きます。ただ、上限で切れた出力は、文の途中で終わったり、JSONが閉じていなかったりします。各社とも、上限で切れたことを応答の中で知らせるので(Anthropic なら stop_reason が max_tokens、Google なら finishReason が MAX_TOKENS など)、呼び出し口でその値を見て、切れた出力を正常な結果として後ろの処理に渡さないようにします。

使った量は、応答に含まれる入力と出力のトークン数を、機能と利用者ごとに集計の表へ足していきます。月の途中で「どの機能がどれだけ使っているか」が見えていれば、上限に近づく前にモデルや入力の長さを見直せます。

送った内容の学習利用と保存を、会社ごとに確かめて記録する

APIに送った内容がモデルの学習に使われるか、どこにどれだけ残るかは、会社と契約の種類によって違います。組み込む前に公式の資料で確かめ、確かめた日と一緒に設計の記録に残します。

会社 公式の資料で確かめられたこと
OpenAI APIで受けたデータは、利用者が共有を選ばなければ学習に使わない。悪用の見張りのための記録は最大30日。会話や保存したファイルなど、消すまで残る機能もある
Anthropic 商用の製品(APIを含む)の入力と出力は、標準の設定ではモデルの学習に使わない
Google(Gemini API) 無料の範囲では、送った内容と応答が製品の改善に使われ、人が読むことがある。有料の範囲では、改善には使わない

この表で特に気をつけたいのは、Gemini API の無料の範囲です。Google の利用規約は、無料の範囲には機密の情報や個人情報を送らないよう求めています。検証で無料の範囲を使い、本番で有料に切り替える場合は、検証の段階で業務のデータを使わないようにします。

この表を作る作業は、個人情報保護委員会が2023年6月に事業者へ向けて出した注意喚起への備えでもあります。同意のない個人データを生成AIに渡し、返答のため以外に使われれば法令違反になりうるので、提供元の扱いを先に確認せよ、という内容です。

個人情報は、送る前に記号へ置き換え、対応表はサーバーに残す

業務のデータを生成AIに送るときは、答えを作るのに要らない個人情報を、送る前に記号へ置き換えます。顧客の名前や電話番号がなくても、問い合わせの要約や返信の下書きは作れることが多いからです。

置き換えの考え方は、次の3つです。

  • そもそも送らない項目を決める。 業務システムの表から文を組み立てるときに、名前や住所の列を入れない。いちばん確実な置き換えは、送らないこと
  • 自由に書かれた文の中は、型のある情報から置き換える。 電話番号、メールアドレス、郵便番号のように形が決まった情報は、正規表現で見つけやすい
  • 戻すための対応表は、サーバーの中だけに持つ。 「[電話1]=実際の番号」の対応は、生成AIには送らない

置き換えの処理の例です(TypeScript)。

ts
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(AWS)を経由して使う場合は、Guardrails の機微な情報のフィルターで、入力と出力の個人情報を伏せたり止めたりできます。日本語にも対応していますが、用意された種類には米国や英国の番号の形が多く、日本の電話番号などは正規表現を自分で足すことになります。また、AWSのドキュメントには、モデルの呼び出しの記録を有効にしていると、記録の入力の欄には置き換える前の元の文が残ると書かれています。記録の設定と置き換えの設定を、組み合わせで確かめます。

ログには、本文ではなく数と識別子を残す

呼び出しの記録は、費用の集計と、障害や誤りの調べに使います。そのために必要なのは、送った本文や応答の全文ではなく、数と識別子と結果の種類です。

残す項目 使い道 本文を残さない理由
日時、機能の名前、利用者の識別子 誰がどの機能をどれだけ使ったかを集計する 名前ではなく社内の識別子で足りる
会社とモデルの名前 モデルを変えた前後を比べる なし
入力と出力のトークン数 費用を集計し、上限の判定に使う なし
かかった時間、結果の種類(成功・上限で切れた・エラーの種類) 遅さや障害を見つける なし
各社の要求の識別子(Anthropic の request-id など) 障害を各社に問い合わせるときに示す なし
置き換えた件数 置き換えが効いているかを見る 置き換えた中身は残さない

本文をどうしても残す必要がある機能(たとえば、AIの下書きと人が直した後を比べたい機能)は、その機能だけ、保存期間と見られる人を決めたうえで、業務システムの記録として別に持ちます。呼び出し口の共通の記録に本文を入れておくと、個人情報が予定していない場所に、予定していない期間残ります。

障害のときは、エラーの種類で再試行と代替を分ける

生成AIのAPIは、混み合いや上限で一時的に失敗します。エラーをひとまとめに再試行せず、種類ごとに動きを分けます。

エラーの種類 例 呼び出し口の動き
一時的な混み合い・レートの上限 429(レートの上限)、500、503、Anthropic の 529 retry-after があればその秒数待ち、なければ待ち時間を倍にしながら少しずらして、回数を決めて再試行する
利用額の上限に達した 各社の利用額の上限による拒否 再試行しない。代わりの道へ回し、担当者へ知らせる
要求の誤り 400、401、403、413 再試行しない。記録して、開発者へ知らせる
時間切れ 応答が返らない 決めた時間で打ち切り、代わりの道へ回す

利用額の上限は、見分け方に気をつけます。Anthropic のドキュメントによれば、契約の段階ごとの月の上限に達したときは、レートの上限と同じ 429 が返るものの retry-after が付かず、時間をおいても失敗し続けます。自分で設定した利用額の上限に達したときは 400 が返ります。OpenAI も、送る速さによる 429 と、利用額の上限による 429 を分けて説明しています。エラーの番号だけで「待てば直る」と判断すると、上限に達したまま再試行を繰り返すことになります。

代わりの道は、2段で用意します。

  1. 別のモデル・別の会社へ回す。 ただし、回す先でも送った内容の学習利用と保存の条件が同じであること、普段の質問のセットで出力を確かめてあることが条件
  2. AIを使わずに業務を続ける。 下書きの機能なら空の入力欄を出す、分類の機能なら「未分類」として人の確認待ちに入れる

業務システムに組み込むときに大切なのは、2の道です。AIの応答が返らなくても、問い合わせの受け付けや予約の登録そのものは止まらないように、AIの処理は本体の処理と切り離し、結果を後から足す作りにしておきます。

外部サービスとの連携という意味では、生成AIの呼び出しも決済や地図のAPIと同じ扱いになるため、株式会社bundlyzeでは、外へ出ていくAIの呼び出しについても上限・記録・止まったときの道をひと組にして設計する方針です。要件を固める工程から保守運用までの業務システム開発と、AWS上のデータ分析基盤の構築を手がける中で、外部連携の基本の形として置いているものです。

組み込む前のチェックリスト

  • APIの呼び出しが、システムの中の1か所に集まっているか
  • APIの鍵が、画面の側やリポジトリに出ていないか
  • 本番と検証で、プロジェクトかワークスペースが分かれているか
  • 1回・1日・1か月の上限が、それぞれ設定されているか
  • 出力が上限で切れたときに、正常な結果として扱っていないか
  • 使う会社ごとに、学習利用と保存の条件を確かめた日が記録されているか
  • 送る項目が絞られ、個人情報の置き換えが入っているか
  • 呼び出しの記録に、本文が入っていないか
  • 利用額の上限による拒否を、再試行の対象から外しているか
  • AIが使えないときに、業務が止まらない道があるか

既存の業務システムに生成AIの機能を足すときの設計や実装、運用中の見張りまでの進め方を、業務システム開発のサービス紹介で説明しています。

各社のドキュメント(確認は2026年10月3日)

APIの仕様や上限、データの扱いは頻繁に変わります。組み込む時点で、もう一度それぞれのページを開いて確かめてください。

よくある質問

APIの利用料が想定を超えないようにするには、何から設定すればよいですか?

まず各社の管理画面で、組織かプロジェクトの単位の利用額の上限と通知を設定します。そのうえで、業務システムの側に1回あたりの出力の上限と、利用者や機能ごとの1日の上限を持たせます。管理画面の上限は最後の止め、システムの側の上限は日々の調整と考えて、両方を入れます。

個人情報をマスキングすれば、生成AIのAPIに顧客のデータを送っても問題ありませんか?

マスキングは漏れを減らす手立てで、それだけで十分とは言えません。置き換えの漏れは起きうるので、学習利用を止めた契約と設定で使うことと、送る項目をそもそも必要なものに絞ることと組み合わせます。

1社のAPIが止まったとき、別の会社のAPIに自動で切り替えてもよいですか?

切り替える先でも入力の学習利用と保存の条件が同じであること、同じ質問のセットで出力の質を確かめてあることの2つがそろっていれば、自動で切り替えてかまいません。そろっていなければ、AIを使わずに業務を続ける道を用意し、そちらへ回します。