利用部門からのデータ抽出依頼に、集計の案と結果の説明の下書きを作る
利用部門の依頼文とテーブル定義を入力に、集計の案(SQL)と、結果を読むための説明の下書きを作ります。データ担当の作業は、ゼロから書くことから、示された案を確かめて直すことに変わります。
- 利用ツール
- Amazon Kendra/Azure AI/Azure OpenAI Service/ChatGPT/Claude/Gemini/Google Apps Script/Make/n8n/OpenSearch/Power Automate/Python
- 対象業界
- IT・SaaS/保険/小売/金融
- 対象部門
- 情報システム/経営企画
- 対象業務
- 情報検索/集計・分析
- 主な課題
- データ分析に時間がかかる/人手が足りない/属人化している
- AIで行う処理
- 生成
- 主な効果
- 対応スピード向上/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 利用部門が問い合わせフォームから依頼する
- データ担当が依頼文を読む
- 曖昧な点を依頼者に確認する(チャットまたはメール)
- 回答を待つ
- テーブル定義書を見て、使うテーブルを決める
- SQLを書く
- 実行して結果を見る
- 想定と違えば書き直す
- 結果をCSVまたはスプレッドシートで渡す
- 数字の意味を説明する
- 利用部門が依頼フォームから依頼する(用途と機密区分を必須項目にする)
- 自動依頼文から、決まっていない点を挙げる
- 自動依頼者に、決まっていない点をまとめて1回で聞き返す
- 人依頼者が回答する
- 自動テーブル定義と過去の類似依頼から、使うテーブルの候補を挙げる
- 自動集計の案(SQL)を作る
- 自動案の前提(期間の定義、除外条件、結合の粒度)を文章で書き出す
- 自動ドライランでスキャン量を見積もる
- 自動個人情報を含む列が入っていないかを検査する
- 人データ担当が案をレビューし、必要なら直す
- 人データ担当が実行する
- 自動結果を読むための説明の下書きを作る
- 人データ担当が説明を確かめて渡す
- 自動依頼・案・実行したSQL・結果の説明を記録する
各工程の詳しい説明を読む
- 利用部門が問い合わせフォームから依頼する
- データ担当が依頼文を読む
- 曖昧な点を依頼者に確認する(チャットまたはメール)
- 回答を待つ
- テーブル定義書を見て、使うテーブルを決める
- SQLを書く
- 実行して結果を見る
- 想定と違えば書き直す
- 結果をCSVまたはスプレッドシートで渡す
- 数字の意味を説明する
問題は5つあります。
(a)確認のやり取りで数日かかる。 曖昧な点を1つずつ聞き返すため、往復が発生します。
(b)書ける人が限られる。 400テーブルの関係を把握しているのは、4名のうち2名です。
(c)同じ依頼が繰り返される。 「先月と同じものを今月分で」という依頼が毎月来ます。過去のSQLを探すところから始まります。
(d)テーブル定義書が古い。 追加された列や、使われなくなったテーブルが反映されていません。
(e)結果の説明に時間がかかる。 数字を渡すだけでは足りず、「この数字は何を含むか」を毎回説明しています。
- 利用部門が依頼フォームから依頼する(用途と機密区分を必須項目にする)
- 【自動】 依頼文から、決まっていない点を挙げる
- 【自動】 依頼者に、決まっていない点をまとめて1回で聞き返す
- 【人】 依頼者が回答する
- 【自動】 テーブル定義と過去の類似依頼から、使うテーブルの候補を挙げる
- 【自動】 集計の案(SQL)を作る
- 【自動】 案の前提(期間の定義、除外条件、結合の粒度)を文章で書き出す
- 【自動】 ドライランでスキャン量を見積もる
- 【自動】 個人情報を含む列が入っていないかを検査する
- 【人】 データ担当が案をレビューし、必要なら直す
- 【人】 データ担当が実行する
- 【自動】 結果を読むための説明の下書きを作る
- 【人】 データ担当が説明を確かめて渡す
- 【自動】 依頼・案・実行したSQL・結果の説明を記録する
自動化されるのは「曖昧な点の洗い出し」「案の作成」「見積もり」「説明の下書き」の4つです。残るのは「案をレビューすること」と「実行すること」です。
3番目が、体感の改善としていちばん大きい部分です。 現在は聞き返しが1つずつ発生しています。最初にまとめて聞けば、往復が1回で済みます。
02今回想定するシステム構成
依頼フォーム(用途・機密区分を必須) │ ▼ Claude API(曖昧な点の洗い出し)──【依頼者に1回で聞き返す】 │ ▼ テーブル定義・データ辞書・過去の依頼(Claude のプロジェクト/検索基盤) │ ▼ Claude API(集計の案と前提の生成) │ ▼ BigQuery ドライラン(スキャン量の見積もり。課金されない) │ ▼ 個人情報を含む列の検査(列名の突き合わせ) │ ▼ 案のレビュー ──【データ担当が確認・修正】 │ ▼ 実行(読み取り専用のサービスアカウント) │ ▼ Claude API(結果を読むための説明の下書き) │ ▼ 依頼者へ回答 ── 依頼・SQL・説明を記録(次回の類似依頼に使う)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 生成AI | Claude API(最小構成では Claude のプロジェクト) | ChatGPT、Gemini、Azure OpenAI Service |
| 実行環境 | Python(ドライラン・実行・検査) | Google Apps Script |
| 検索基盤 | Claude のプロジェクト(テーブル定義・過去の依頼) | Azure AI Search、Amazon Kendra、OpenSearch |
| 連携 | Power Automate(依頼の受け付け) | Make、n8n |
| データ基盤 | BigQuery | Snowflake、Amazon Redshift、SQL Server |
AIにクエリを実行させない構成にしてください。 生成と実行を分け、実行は人がレビューしてから、社内のプログラムが行います。 実行まで自動化すると、誤った結合で巨大なスキャンが走る、個人情報の列を含む結果が出力されるといった事故が、気づかれないまま起きます。
テーブル定義をどう渡すかが、この構成の要です。 400テーブルすべてを毎回渡すことはできません。最小構成では、よく使う30〜50テーブルの定義を Claude のプロジェクトにアップロードしておきます。 プロジェクトに置いた文書は、そのプロジェクト内の会話で読ませられます。
BIツールのセルフサービス機能と比べてください。 利用部門が自分で集計できる環境を整えるほうが、根本的な解決です。この構成が向くのは、定型化できない依頼が一定量ある場合です。
03どうやって実装するのか
処理の起点を決める
依頼フォームが提出されたときが起点です。
フォームの設計が、この構成の半分を決めます。 次を必須項目にしてください。
| 項目 | 理由 |
|---|---|
| 何を知りたいか(1文) | 集計の目的が分かる |
| 用途(報告/分析/システム連携/外部提出) | 外部提出なら扱いが変わる |
| 対象期間 | 曖昧さの最大の原因 |
| 必要な粒度(日別/月別/顧客別など) | 集計の軸 |
| 機密区分(個人情報を含むか) | 承認の要否が変わる |
| いつまでに必要か | 優先順位 |
| 過去に似た依頼をしたか | 再利用の手がかり |
「用途」と「機密区分」を必須にしてください。 自由記述の依頼文だけでは、個人情報を含む抽出が紛れ込みます。
半自動化では、次を追加します。
- 前回と同じ依頼の場合、過去のSQLを提示する
- 繰り返し依頼されているものを月次で集計し、定型化の候補として挙げる
2つ目が長期的に効きます。 同じ依頼が3か月続けば、BIツールのダッシュボードにすべきものです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 依頼文 | フォームの入力内容 | 問い合わせフォーム |
| テーブル定義 | テーブル名、列名、型、説明、主キー、更新頻度 | データ基盤(最新に保つ) |
| データ辞書 | 業務用語と列の対応、集計時の注意 | 情報システム(新しく作る) |
| 過去の依頼とSQL | 依頼文、使ったSQL、結果の説明 | 依頼の記録 |
| 個人情報を含む列の一覧 | 列名と、その扱い | 情報システム(新しく作る) |
| 権限の設定 | 依頼者が見てよいデータの範囲 | 情報システム |
「データ辞書」がこの構成の中核です。 テーブル定義だけでは足りません。
| 業務用語 | 対応する列 | 集計時の注意 |
|---|---|---|
| 売上(計上) | fact_revenue.amount_excl_tax | 税抜。キャンセル分は status='cancelled' を除く |
| 受注 | fact_order.order_amount | 税込。売上とは別物 |
| 月 | fact_revenue.fiscal_month | 会計月。暦月は date_trunc(revenue_date, MONTH) |
| 部門 | dim_org.department_code | 発生部門。担当者の所属は dim_employee.dept |
| 顧客 | dim_customer.customer_id | 解約済みを含む。稼働顧客は is_active=true |
この表を作ることが、この構成でいちばん時間がかかり、いちばん効きます。 現在、担当者の頭の中にあるものです。
「個人情報を含む列の一覧」も必ず作ってください。 氏名、住所、電話番号、メールアドレス、生年月日、マイナンバー、口座番号。列名で機械的に検査できる状態にしてください。
データの取得方法を決める
テーブル定義: データ基盤のメタデータから自動で取得し、説明文は人が書きます。 自動取得だけでは、列名と型しか分かりません。
最小構成では、よく使う30〜50テーブルの定義書を Claude のプロジェクトにアップロードします。 プロジェクトに置いた文書は、そのプロジェクト内の会話で読ませられるため、毎回貼り直す必要がありません。
半自動化では、依頼文から関連しそうなテーブルを絞ってから渡します。 400テーブルすべてを渡すことはできません。テーブル名と説明文だけの一覧で候補を選び、選ばれたテーブルの詳細な定義を渡すという2段階にしてください。
実行の権限: 読み取り専用のサービスアカウントで実行します。BigQuery では、roles/bigquery.jobUser(プロジェクト内でクエリを含むジョブを実行する権限)と roles/bigquery.dataViewer(データセットのメタデータの取得と、テーブルデータのクエリ・エクスポート・レプリケート) の組み合わせで、データを変更せずにクエリを実行できます。
書き込み権限を持つアカウントで実行しないでください。 生成された案に DELETE や CREATE OR REPLACE が混ざる可能性は、ゼロにはできません。権限で防ぐのが確実です。
スキャン量の見積もり: 実行前にドライランを行います。APIでは JobConfiguration の dryRun を true に設定します。bq コマンドでは --dry_run フラグです。
bq query --use_legacy_sql=false --dry_run 'SELECT ...'
ドライランはクエリを実行しないため、課金されません。 返ってきたスキャン予定バイト数を使えば、実行前に費用を見積もれます。 BigQuery のオンデマンド課金は、読み取ったバイト数に基づきます。
ドライランの限界を2つ押さえてください。
- 行レベルセキュリティでマスクされたテーブルに対するドライランは、サイドチャネル攻撃を防ぐため、常に0バイトを返します。 このテーブルでは費用の見積もりに使えません
- 外部データソースを参照するフェデレーテッドクエリでは、行が返る場合でも0バイトという下限値が報告されることがあります
閾値を決めてください。 「ドライランで1TBを超えたら、担当者の確認を必須にする」といった運用にします。
AIへ渡す前に整形する
- 依頼文の分解 … 対象、期間、粒度、条件に分けます
- 業務用語の引き当て … データ辞書で列に対応付けます
- 過去の類似依頼の検索 … 同じ依頼が過去にないかを探します
- テーブル候補の絞り込み … 関連しそうなテーブルを20件程度に絞ります
- 権限の確認 … 依頼者が見てよい範囲かを確認します
- 機密区分の確認 … 個人情報を含む依頼かを判定します
3番目を必ず入れてください。 「先月と同じものを」という依頼は毎月来ます。過去のSQLがあれば、期間を変えるだけです。
5番目を省かないでください。 依頼者が見てよいデータかどうかは、依頼の内容ではなく、依頼者の権限で決まります。 「営業の人が全社の人件費を知りたい」という依頼は、技術的には簡単ですが、出してよいかは別の話です。
AIに処理させる
| 処理 | 内容 |
|---|---|
| 曖昧な点の洗い出し | 依頼文から、決まっていない点を列挙する |
| 聞き返しの文案の作成 | 依頼者に1回でまとめて聞く文章を作る |
| テーブル候補の提示 | 使いそうなテーブルと、その理由を挙げる |
| 集計の案の作成 | SQLの案を書く |
| 前提の明示 | 期間の定義、除外条件、結合の粒度を文章で書く |
| 結果の説明の下書き | 数字が何を含み、何を含まないかを書く |
AIに次のことをさせないでください。
| させないこと | 理由 |
|---|---|
| クエリの実行 | 人がレビューしてから実行する |
| データを変更する文の生成 | INSERT UPDATE DELETE CREATE DROP を書かせない |
| 結果の数字の解釈・断定 | 「売上が好調です」と書かせない |
| テーブル定義にない列の使用 | 存在しない列名を作らせない |
| 権限の判断 | 見てよいかは人が決める |
| 個人情報を含む列の自動追加 | 「参考までに氏名も付けました」をさせない |
「テーブル定義にない列を使わせない」ことが、実装上いちばん多く発生する問題です。 生成AIは、それらしい列名を作ります。customer_name があるように見えて、実際は cust_nm かもしれません。定義に存在する列だけを使うよう明示し、存在しない列を使った案は機械的に弾いてください。
「結果の数字を解釈させない」ことも重要です。 「前月比15%増で好調です」という一文が報告書に混ざると、誰の判断なのか分からなくなります。 説明の下書きは、数字が何を含み、何を含まないかにとどめてください。
指示内容を固定する
曖昧な点の洗い出し:
あなたは、データ抽出依頼を受け付ける担当者です。
依頼文から、決まっていない点を洗い出してください。
【厳守事項】
- 決まっていない点を、あなたの推測で埋めないでください。
「おそらく暦月でしょう」と書かないでください。
- 聞き返しは1回でまとめてください。
優先度の高い順に並べ、5点以内にしてください。
- 依頼者が答えやすいよう、選択肢を示してください。
(例:「先月」は 暦月 / 会計月 のどちらですか)
- データ辞書に複数の解釈がある用語は、必ず挙げてください。
【データ辞書】
{data_dictionary}
【依頼文】
{request_text}
集計の案の作成:
あなたは、データ抽出の集計案を書く担当者です。
テーブル定義に基づいて、集計の案を書いてください。
【厳守事項】
- クエリを実行しないでください。案を書くだけです。
- データを変更する文を書かないでください。
INSERT / UPDATE / DELETE / MERGE / CREATE / DROP / TRUNCATE を
使わないでください。SELECT のみで書いてください。
- テーブル定義に存在しない列名・テーブル名を使わないでください。
必要な列が定義にない場合は、missing_columns に書いて、
案は作らないでください。
- 機密区分で「個人情報を含まない」とされた依頼では、
個人情報を含む列の一覧にある列を使わないでください。
「参考のため」に列を追加しないでください。
- SELECT * を使わないでください。必要な列を明示してください。
- 案の前提(期間の定義、除外した条件、結合の粒度)を
assumptions に日本語で書いてください。
SQLのコメントではなく、別項目として書いてください。
- 結果の数字を解釈しないでください。
「増加傾向です」「好調です」と書かないでください。
- 結合によって行が増える可能性がある場合は、
duplication_risk に、どの結合で何が重複しうるかを書いてください。
【テーブル定義】
{table_definitions}
【データ辞書】
{data_dictionary}
【個人情報を含む列の一覧】
{pii_columns}
【依頼内容(確認済み)】
{clarified_request}
**「SELECT * を使わない」を明示してください。 BigQuery の費用は読み取ったバイト数で決まります。必要な列だけを指定することが、費用に直結します。**
「結合による重複」を必ず書かせてください。 1対多の結合で行が増え、合計金額が実際の何倍にもなるのは、この種の集計で最も多い誤りです。AIも人も間違えます。 明示的に挙げさせておけば、レビューで見る場所が分かります。
出力形式を固定する
{
"request_id": "",
"clarifications_needed": [
{
"point": "",
"options": [],
"why_it_matters": ""
}
],
"candidate_tables": [
{
"table": "",
"reason": ""
}
],
"sql_draft": "",
"assumptions": [],
"duplication_risk": [],
"missing_columns": [],
"pii_columns_used": [],
"similar_past_requests": [],
"confidence": "high | medium | low"
}
実行前の検査(プログラム)の出力:
{
"request_id": "",
"syntax_valid": false,
"statement_type": "",
"contains_write_statement": false,
"unknown_identifiers": [],
"pii_columns_detected": [],
"dry_run_bytes": 0,
"dry_run_reliable": true,
"estimated_cost": 0,
"exceeds_threshold": false
}
dry_run_reliable を必ず持たせてください。 行レベルセキュリティでマスクされたテーブルを含む場合、ドライランは常に0バイトを返します。 0バイトを「安全」と読むと、実際には巨大なスキャンが走ります。 対象テーブルに行レベルセキュリティが設定されているかを確認し、設定されていれば dry_run_reliable を false にしてください。
contains_write_statement と unknown_identifiers は、AIの出力を信じない検査です。 プロンプトで禁止していても、機械で確かめてください。
assumptions は、依頼者に渡す説明の材料になります。 「会計月で集計」「キャンセル分を除外」「税抜」が書かれていれば、数字が合わないときに原因を追えます。
システムへ連携する
最小構成では連携はありません。依頼文とテーブル定義を生成AIのプロジェクトで扱い、案を人が実行します。
半自動化では、次をつなぎます。
| つなぐ先 | 内容 |
|---|---|
| 問い合わせフォーム | 依頼の受け取り |
| データ基盤のメタデータ(読み取り) | テーブル定義の取得 |
| BigQuery(ドライラン) | スキャン量の見積もり |
| BigQuery(読み取り専用) | 人がレビューした後の実行 |
| 依頼の記録(SharePoint リスト等) | 依頼・SQL・説明の保存 |
| Teams | 聞き返し、回答の通知 |
実行を自動化しないでください。 レビューを挟む構成にします。レビューなしで実行してよいのは、「過去に実行したSQLの期間だけを変えたもの」に限定してください。 それも、期間の変更が機械的に検証できる場合だけです。
結果ファイルの受け渡しにも注意してください。 CSVをメールに添付する運用は、誤送信の経路になります。 権限管理された保管場所に置き、リンクで渡してください。
人が確認する
実行の判断は、必ずデータ担当が行います。
| 順 | 確認する点 | 誰が |
|---|---|---|
| 1 | contains_write_statement が true | データ担当(実行しない) |
| 2 | unknown_identifiers(定義にない識別子) | データ担当(案を破棄して作り直す) |
| 3 | pii_columns_detected | データ担当(機密区分と照合。必要なら承認を取る) |
| 4 | duplication_risk(結合による重複) | データ担当(結合の粒度を確かめる) |
| 5 | assumptions(前提が依頼の意図と合うか) | データ担当 |
| 6 | dry_run_bytes と dry_run_reliable | データ担当(閾値超えは要確認) |
| 7 | 依頼者が見てよい範囲か | データ担当(権限で判断する) |
| 8 | 結果の説明の下書き | データ担当 |
4番目の「結合による重複」を必ず見てください。 金額の合計が正しいかどうかは、結果を見ただけでは分かりません。 1対多の結合で3倍になっていても、それらしい数字に見えます。 結合の粒度を確かめる工程を、省略できない手順にしてください。
7番目は技術の話ではありません。 「出せるか」と「出してよいか」は別です。依頼者の権限で判断してください。
例外に対処する
| 起きること | 対応 |
|---|---|
| 定義にない列名が使われる | unknown_identifiers。案を破棄して作り直す |
| データを変更する文が混ざる | 実行しない。権限でも防ぐ |
| 個人情報の列が入っている | 機密区分と照合。必要なら承認を取る |
| ドライランが0バイトを返す | 行レベルセキュリティの可能性。 見積もりに使えない |
| フェデレーテッドクエリ | 0バイトの下限値が返ることがある。 別途見積もる |
| スキャン量が閾値を超える | 実行前に確認する。条件を絞る |
| 結合で行が増えている | duplication_risk を確認する。粒度を揃える |
| テーブル定義が古い | 定義の更新を先に行う。 古い定義で書いた案は動かない |
| 同じ依頼が3か月続く | 定型化の候補として挙げる。 BIツールへ移す |
| 依頼者が権限のないデータを求める | 技術ではなく権限の問題。断る理由を明確にする |
| 依頼文が1行だけ | 聞き返しを1回でまとめて出す |
| 外部提出用の依頼 | 用途が外部。 出力の扱いを別の手順にする |
| 依頼者が急いでいる | 手順を短縮しない。レビューは省かない |
記録を残す
- 依頼文と、聞き返しの内容・回答
- 生成された案(SQL)と、その前提
- データ担当が修正した内容と、修正前後
- 実行したSQL(実際に実行したもの)
- ドライランのスキャン量と、実際のスキャン量
- 結果の説明の下書きと、確定した説明
pii_columns_detectedが出た依頼と、その承認の記録- 定型化の候補として挙げた依頼
「実際に実行したSQL」を必ず残してください。 案ではなく、実行したものです。後から「この数字はどう出したのか」を問われたとき、これがなければ答えられません。
「データ担当が修正した内容」が、この構成を育てる材料です。 どの種類の依頼でよく修正されているかが分かれば、データ辞書に足すべき記述が見えます。
「同じ依頼の繰り返し」を数えてください。 3か月続いている依頼は、この構成で処理し続けるべきものではありません。 BIツールのダッシュボードにすれば、依頼そのものがなくなります。
04実装レベルの3段階
半自動化で効果の大半が出ます。 50分が18分程度になります。本格構成で15分ですが、本格構成の価値は時間より「繰り返しの依頼が見えること」にあります。
05工数削減シミュレーション
導入後 90件 × 15分 ÷ 60 = 22.5 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 利用部門からのデータ抽出依頼が月50件以上あり、情報システムまたはデータ担当が個別に対応している企業。データウェアハウスに集約済みで、テーブル定義が文書として存在すること(または作れること)。
- 依頼が月に数件で、担当者が即答できている場合。BIツールのセルフサービス環境が整っていて、利用部門が自分で出せている場合。データがシステムごとに分散し、共通の基盤がない場合(先に基盤の整備が必要)。
07最小構成で試す方法
- よく使う30テーブルの定義書を用意する(列の説明を人が書く)
- データ辞書を20行作る(業務用語と列の対応、集計時の注意)
- 過去の依頼から10件を選び、依頼文と定義を生成AIのプロジェクトに入れる
- 案を出させ、データ担当が実際に書いたSQLと比べる
見るのは次の4点です。
| 見る点 | 判断 |
|---|---|
| 定義にない列を使っていないか | 使っていたら、機械的な検査を必ず入れる |
| 曖昧な点を挙げているか | 挙げていなければ、聞き返しの価値が出ない |
assumptions が書かれているか | 書かれていなければ、レビューできない |
| 結果の数字を解釈していないか | 解釈していたら、プロンプトを強める |
2のステップ(データ辞書)が、この試行でもっとも重要です。 そして、この構成をやめても残る資産です。 新しく入ったデータ担当の教材になります。
あわせて、次の2つの数字を出してください。
- 依頼を受けてから回答するまでの日数(中央値)
- 月90件のうち、過去3か月で同じ内容が繰り返されている件数
6の数字が大きければ、この構成より先にやることがあります。 繰り返しの依頼は、定型化すれば消えます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 定義にない列名が生成される | 機械的に検査して弾く。プロンプトだけでは防げない。最重要 |
| AIにクエリを実行させる | させない。レビューを挟む |
| データを変更する文が混ざる | 検査で弾き、読み取り専用の権限でも防ぐ |
SELECT * が生成される | 禁止する。費用がバイト数で決まる |
| 結合で行が増える | duplication_risk を挙げさせ、粒度を確かめる |
| ドライランの0バイトを安全と読む | 行レベルセキュリティの可能性。 dry_run_reliable を持つ |
| フェデレーテッドクエリを見積もる | 0バイトの下限値が返ることがある |
| 個人情報の列が「参考」で付く | 禁止する。列名で検査する |
| テーブル定義が古い | 先に整備する。 古い定義では動かない |
| 400テーブルすべてを渡そうとする | 2段階で絞る。候補選び→詳細定義 |
| 結果の数字を解釈させる | 禁止する。誰の判断か分からなくなる |
| 権限のない依頼に応えてしまう | 依頼者の権限で判断する。 技術の問題ではない |
| 繰り返しの依頼を処理し続ける | 定型化してBIツールへ移す |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: テーブル定義、列名、依頼文、集計の案。データそのものは、原則としてAIに渡しません。
- データ本体を渡さない設計 … AIに渡すのは、テーブル定義・列名・依頼文までです。実データを渡さなければ、外部送信のリスクは大きく下がります。この分離を設計の原則にしてください
- テーブル定義そのものの機密性 … 列名の一覧は、自社がどんなデータを持っているかを示します。 外部サービスへの入力可否を、情報管理規程で確認してください
- 読み取り専用の権限 … 実行は
roles/bigquery.jobUserとroles/bigquery.dataViewerの組み合わせで行い、書き込み権限を持つアカウントを使わないでください - 個人情報の列の検査 … 列名で機械的に検査してください。プロンプトでの禁止だけに頼らないでください
- 依頼者の権限 … 「出せるか」と「出してよいか」は別です。依頼者が見てよい範囲かを、人が判断してください
- 結果の受け渡し … CSVのメール添付は誤送信の経路になります。権限管理された場所に置き、リンクで渡してください
- 費用の上限 … ドライランの結果に閾値を設け、超えた場合は実行前の確認を必須にしてください
- 実行記録の保存 … 実際に実行したSQLを残してください。「この数字はどう出したのか」に答えられる状態を保ちます
- 数字の解釈をさせない … 説明の下書きは、数字が何を含み何を含まないかにとどめます。評価や判断は人が書きます
- 自動実行してよい範囲 … 曖昧な点の洗い出し、案の作成、ドライラン、説明の下書きまでです。クエリの実行、権限の判断、結果の解釈は、必ず人が行います
誤りが起きた場合のリスクは、誤った数字が意思決定に使われることです。結合の重複、期間の取り違え、除外条件の漏れ——いずれも結果を見ただけでは気づけません。 前提を文章で残し、レビューする工程を、省略できない手順として組み込んでください。
10まず何から始めるか
1週目:繰り返しの依頼を数える
過去3か月の依頼を並べ、同じ内容が繰り返されている件数を数えてください。ここが大きければ、この構成より先に定型化すべきです。
あわせて、依頼から回答までの日数の中央値を出してください。これが導入前の基準値になります。
2〜3週目:データ辞書を作る
業務用語と列の対応、集計時の注意を20〜30行にまとめます。
- 「売上」は受注か出荷か計上か
- 「月」は暦月か会計月か
- 「部門」は発生部門か所属か
- 税込か税抜か
- キャンセル・返品の扱い
この5つだけでも、聞き返しの大半がなくなります。 現在、担当者が毎回口頭で説明しているものです。
あわせて、個人情報を含む列の一覧を作ってください。 列名で機械的に検査できる形にします。
4週目:10件で試す
過去の依頼10件について、依頼文と定義を生成AIのプロジェクトに入れ、案を出させます。定義にない列を使っていないか、前提が書かれているか、数字を解釈していないかを確かめてください。
2か月目:検査の仕組みを作る
AIの出力を信じない検査を、プログラムで作ります。
- データを変更する文が含まれていないか
- 定義にない識別子がないか
- 個人情報の列が含まれていないか
- ドライランでスキャン量が閾値を超えていないか
この検査が、この構成の安全装置です。 プロンプトより先に作ってください。
3か月目以降: フォームからの受け付けと聞き返しの自動化を追加します。50分が何分になるかを実測し、あわせて依頼から回答までの日数を追ってください。 時間より、待ち時間の短縮のほうが依頼者に伝わります。
あわせて、繰り返しの依頼を月次で集計してください。 3か月続いているものをBIツールへ移していけば、依頼の総数そのものが減ります。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
BigQuery の事前定義ロール roles/bigquery.dataViewer が、データセットのメタデータと権限の取得、およびテーブルデータのクエリ・エクスポート・レプリケートを許可し、データの変更はできないこと。roles/bigquery.jobUser が、プロジェクト内でクエリを含むジョブを実行する権限を与えること。読み取り専用でクエリを実行するには、この2つのロールの組み合わせが必要であること | Google Cloud:BigQuery のアクセス制御 | 2026-09-18 |
BigQuery のドライランが、API では JobConfiguration の dryRun を true に設定することで、bq コマンドでは --dry_run フラグで実行できること。ドライランはクエリを実行しないため課金されず、スロットも使用しないこと。行レベルセキュリティでマスクされたテーブルに対するドライランは、サイドチャネル攻撃を防ぐため常に0バイトを返し、費用の見積もりに使えないこと。外部データソースを使うフェデレーテッドクエリでは、行が返る場合でも0バイトという下限値が報告されることがあること。オンデマンドのクエリ料金が読み取ったバイト数に基づくこと | Google Cloud:費用の見積もりと管理 | 2026-09-18 |
| Claude のプロジェクトに参照用の文書をアップロードして、そのプロジェクト内の会話で読ませられること | Claude Help Center: What are projects? | 2026-09-18 |
この構成は、社内のデータ基盤に対するクエリを扱います。 テーブル定義や列名の一覧は、自社が保有するデータの構成を示す情報です。外部の生成AIサービスへの入力可否を、自社の情報管理規程と委託先の契約条件で確認してください。 個人情報を含む列を扱う抽出については、利用目的の範囲内であるかを個人情報保護の担当部門と確認してください。生成されたクエリを人のレビューなしに実行しないでください。 データを変更する文の混入、定義にない識別子の使用、結合による行の重複は、いずれもプロンプトの指示だけでは防げません。機械的な検査と、書き込み権限を持たないアカウントでの実行の両方を必ず組み込んでください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。クエリの実行費用は、自社のデータ量とスキャン量から算出してください。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0129)についてのご相談はこちらから。
