本文へスキップ
hdknr blog
戻る

AI エージェントのためのデータ基盤:レイクハウスを土台に「意味・費用・権限・取り消し」を設計する

AI エージェントに社内のデータを分析させる基盤を作るなら、何から考えればよいでしょうか。結論を先に書くと、データをオープンな形式で S3 などに置くレイクハウスを土台にするのが堅実です。ただし、レイクハウスだけではエージェントは安全にも賢くも動きません。その上に「意味・費用・権限・取り消し」の 4 つの守りを足す必要があります。

この記事は、次の 4 本に続くレイクハウスのシリーズの 5 本目(最終回)です。

なぜレイクハウスが土台に向くのか

AI エージェントのデータ基盤に足す 4 つの守り

エージェントは、MCP(Model Context Protocol:AI エージェントが外部のツールやデータを呼び出すための共通の規格)のサーバーを窓口にしてデータにアクセスします。窓口から計算エンジン、カタログ、テーブルまでの各層に 1 つずつ守りを置く、というのがこの記事の整理です。

AI エージェントのためのデータ基盤の構成と、4 つの守りを示した図。上から順に、AI エージェント、窓口(MCP サーバーとセマンティックレイヤーによる指標の定義)、計算エンジン(DuckDB・Athena・Redshift)、カタログ(Glue Data Catalog・S3 Tables・Iceberg REST カタログ)、S3 上の Iceberg テーブル(Parquet、スナップショット、ブランチ)が重なっている。各層の右に守りが対応している。窓口には「① 意味:列や指標の定義を渡し、LLM に計算させない」、計算エンジンには「② 費用:スキャン量や RPU に上限を設ける」、カタログには「③ 権限:読めるテーブルを絞り、既定は読み取り専用にする」、Iceberg テーブルには「④ 取り消し:書き込みはブランチで検証し、失敗はスナップショットで戻す」

① 意味:セマンティックレイヤーで指標の定義を渡し、LLM に計算させない

エージェントがよく間違えるのは、SQL の文法よりも「この列は何を意味するか」「売上はどう定義するか」です。たとえば「売上」が税込か税抜か、返品を引くかどうかを知らなければ、正しい SQL でも誤った数字を返します。

対策は、指標の定義をセマンティックレイヤーとしてエージェントの外に持つことです。

② 費用:Athena と Redshift Serverless でクエリに上限を設ける

エージェントは人よりはるかに多くのクエリを投げます。試行錯誤のたびに大きなテーブルを全件スキャンすれば、費用はすぐに膨らみます。エンジンの側で上限を設けておきましょう。

エージェント専用のワークグループを作って上限を設定しておけば、人の分析と費用を分けて管理できます。テーブルをパーティションで区切ったり、よく使う集計を事前に作っておいたりして、スキャン量そのものを減らすことも大切です。

③ 権限:カタログと MCP サーバーで、既定は読み取り専用にする

エージェントに渡す権限は、人に渡す権限より狭くするのが基本です。

MCP サーバー側の制限だけに頼らず、データベースやカタログの権限でも二重に守るのが安全です。エージェントの接続に使う認証の仕組みは、MCP のセキュリティが OAuth 2.1 で大幅進化:AI エージェントと社内データを安全に接続する仕組みも参考になります。

④ 取り消し:Iceberg のブランチで検証し、スナップショットで戻す

③ で既定を読み取り専用にしたうえで、どうしても書き込みを任せる場合の守りがこれです。ここでは Iceberg のブランチが役立ちます。ブランチはテーブルのスナップショットに名前を付けた参照で、本番(main)とは別の場所に書き込めます。

Iceberg のドキュメントには、WAP(Write-Audit-Publish:書き込み → 検証 → 公開)の流れが Spark の例で載っています。次のコードは、Iceberg の SQL 拡張を有効にした Spark セッションでの例を、ドキュメントからそのまま引用したものです。

-- テーブルで WAP を有効にする
ALTER TABLE db.table SET TBLPROPERTIES ('write.wap.enabled'='true');

-- 検証用のブランチを作る(スナップショット ID 3 から分岐し、7 日間保持)
ALTER TABLE db.table CREATE BRANCH `audit-branch` AS OF VERSION 3 RETAIN 7 DAYS;

-- 以降の書き込みをブランチに向ける
SET spark.wap.branch = audit-branch;
INSERT INTO prod.db.table VALUES (3, 'c');

-- 検証が済んだら main をブランチの先頭まで進める
CALL catalog_name.system.fast_forward('prod.db.table', 'main', 'audit-branch');

エージェントはブランチにだけ書き込み、件数や値の範囲のチェックに通ったものだけを本番に反映します。チェックに通らなければ、ブランチを捨てれば済みます。万一本番に誤った書き込みが入っても、Spark なら rollback_to_snapshot プロシージャで過去のスナップショットに戻せます。ブランチへの対応状況はエンジンによって違うので、使うエンジンのドキュメントで確認してください。

規模別の構成:DuckDB から S3 + Iceberg、Redshift へ

最初から全部をそろえる必要はありません。規模に合わせて段階的に進めるのが現実的です。

段階構成守りの重点
試行DuckDB(+ DuckLake)を手元で使い、エージェントに読ませる意味(列の説明を渡す)
チームでの利用S3 + Iceberg(S3 Tables など)に置き、Athena や DuckDB から読む費用(Athena の上限)、権限(読み取り専用のロール)
業務への組み込みセマンティックレイヤーを用意し、定型の集計は Redshift にも持つ意味(指標の定義)、取り消し(ブランチでの検証)

守りは段階が進むごとに積み重ねていきます。前の段階の守りは外しません。どの段階でも、データはオープンな形式で持っておきます。そうすれば、次の段階に進むときにデータを作り直さずに済みます。RAG のために埋め込みベクトルも扱うなら、4 本目で紹介した Lance も候補になります。

まとめ

シリーズを振り返って

1 本目で Iceberg の仕組み、2 本目で軽量な選択肢の DuckLake、3 本目で DWH(Redshift)との使い分け、4 本目で周辺技術の地図を見てきました。どの回でも結論は「データをオープンな形式で持ち、エンジンやカタログは差し替えられるように選ぶ」でした。AI エージェントは、この方針の恩恵をもっとも受ける利用者の 1 つです。



前の記事
DuckLake 入門:メタデータを SQL データベースに置くレイクハウスフォーマットと Iceberg との違い
次の記事
Claude Code で Higgsfield 用ショート動画シナリオを量産する — CLAUDE.md でプロンプト構文を固定し MCP で生成まで