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×SQL】現場の「泥臭いハック」が、未来のアーキテクチャに変わるまで【ほぼAI執筆】

Last updated at Posted at 2025-12-15

1年以上ぶり、かなり久しぶりの投稿です!

生成AIの進化のスピード早すぎますね。
この記事もせっかくなので(?)、ほぼ全編AIに作ってもらいました!
Nano Bananaでいい感じの説明画像も作ってもらいました!
おかげで、全体的に「AIみ」全開な文体と画像になっていますがご容赦ください!
(生成AIがつくる記事タイトル、文章中の章タイトルってなぜか生成AIを感じさせますよね。生成AI構文的な情緒を感じられるので、あえてそのまま使っていきます!)

前段のPart1は実際に既に実践している内容で、Part2は生成AIに将来的な展望としてアドバイスもらった内容です。そのためPart2はほぼAIの妄想ですが、できたらいいなぁということで未来へのメモとして残してます。

これ以降、ほぼGeminiが作成してくれたまま掲載しています!

01_冒頭.jpg

今回は、私たちが現在進行形で取り組んでいる「生成AIを活用したSQL開発」の試行錯誤についてお話しします。

正直に言うと、私たちはまだ「最強のデータ基盤」を完成させたわけではありません。
日々の業務で「AIにもっとうまくSQLを書かせるにはどうすればいいか?」と悩み、試行錯誤してたどり着いた独自の「ハック(工夫)」が、AIとの対話を通じて「次世代のアーキテクチャ」へと昇華されつつある——。
そんな、現在地と未来の構想を包み隠さず共有したいと思います。

【人間が追記】

正直に言うと、私たちはまだ「最強のデータ基盤」を完成させたわけではありません。

正直に言うともなにも、「最強のデータ基盤を完成させました!」なんて言ってないのに…笑
その後に続く文章もなんだか壮大な雰囲気でAIっぽいなぁと思いました。

【Part 1】 現在の実践:AIに文脈を伝えるための「手紙」

私たちが直面していた課題は、一般的な「Text-to-SQL」の限界でした。
AIに「このテーブルで分析して」と頼んでも、業務特有のルール(滞在の定義など)や、Snowflakeのベストプラクティスを無視したコードが返ってくる。毎回プロンプトで指示するのは面倒すぎる。
そこで私たちが始めたのは、「SQLファイル自体に、AIへの手紙(メタデータ)を埋め込む」という、非常にアナログで泥臭いアプローチです。

やっていること:JSONメタデータの埋め込み

すべてのSQLファイルのヘッダーに、以下のようなコメントブロックを書いています。

/*METADATA  
{  
  "file": "visit_analysis_a-city.sql",  
  "description": "A空港利用者の県内周遊分析。滞在定義は15分ルールを採用。",  
  "tags": ["滞在解析", "inbound", "airport"],  
  "inputs": ["raw.gps_logs", "master.mesh_codes"],  
  "outputs": ["mart.visit_summary"],  
  "dependencies": ["01_preprocessing.sql"]  
}  
METADATA*/

-- 以下、実際のSQL  
WITH ...

【人間が追記】

非常にアナログで泥臭いアプローチです。

とはありますが、CLAUDE.mdにメタデータの構成、利用目的、SQL自体のガイドラインを設定しているため、このメタデータ埋め込み自体はClaude Codeに指示してアップデートしています。
「クエリを書く(or それ自体もClaudeが作成)→ Claudeにメタデータ更新してもらう」というワークフローです。
VSCodeのClaude Code拡張を利用しているので、そこまで運用負荷はなく、サクッとできます!
作業のたびに更新していくので、複数のSQLの関係性もdependenciesでちゃんと記録できます。

なぜこれをやっているのか?

理由はシンプルで、「AIがファイル単体を見て、全てを理解できるようにするため」です。

  • 検索性: AIは日本語の description や tags を見て、過去の膨大なクエリの中から「使えるロジック」を探し出せます。
  • ハルシネーション抑制: 「入力と出力はこれを使って」とJSONで明記されているため、AIは勝手なテーブル結合をせず、仕様通りのコードを書くようになります。

私たちはこれを「Vue.jsのSFC(単一ファイルコンポーネント)みたいなものだ」と捉えています。ロジックと仕様を1箇所に凝集させることで、AIにとっての可読性を極限まで高める作戦です。

【人間が追記】

私たちはこれを「Vue.jsのSFC(単一ファイルコンポーネント)みたいなものだ」と捉えています。

とはもともと捉えておらず、AIに聞いたらこれはSFCみたいなものだよと言われました。
AIが勝手に「どやっ!」ってくれました。

目的自体は記載のとおり「検索にヒットする」「AIにとっての可読性を高める」という意図で始めています。人間が検索するときもヒットしやすくて助かります。

【実演】 AIはどうやってコードを書くのか?

このメタデータがあるおかげで、今の私たちの開発現場では、以下のような体験が日常になっています。

02_現状.jpg

Scene 1: 「曖昧な指示」で過去の資産を探す

エンジニアは、具体的なファイル名を覚えておく必要はありません。

👨‍💻 人間:  
 「新しい案件で『空港利用者の周遊分析』をやりたいんだけど、参考になる過去のクエリある? 滞在時間は15分定義で。」

🤖 AI:  
 「タグ airport 滞在解析 で検索しました。以下のクエリが参考になりそうです。

   1. 2024/02_A空港案件/1_周遊分析/1-2_OD分析.sql  
   2. 2024/03_B空港案件/4_旅程分析.sql

 特に2つ目のB空港のクエリは、今回の要件に近い『広域周遊』のロジックを含んでいます。」

AIはファイルの中身(メタデータ)を理解しているため、「ファイル名検索」ではなく「意味検索」で、大量のファイルから最適な「テンプレート」を提案してくれます。

Scene 2: テンプレートにはできない「連鎖」と「カスタマイズ」

ここからが真骨頂です。単に既存のSQLのパラメータ(変数)を変えるだけならストアドプロシージャでも十分ですが、実務では「案件ごとに微妙に異なるロジック」が求められます。

👨‍💻 人間:  
 「ありがとう。  
 次に、この結果を使って『空港到着後にA神社へ直行した人』だけを抽出する後続のクエリを作って。  
 ただし、A神社の滞在は60分以上に限定したい。」  

🤖 AI:  
 「承知しました。先ほどのクエリ(mart.visit_summary)を入力とする新しいSQLファイルを作成します。  
 
 作成ファイル: 02_shrine_direct_access.sql

 実装するロジック:

  1. 前段で作った mart.visit_summary を入力テーブルとして指定(依存関係を設定)。  
  2. A神社のポリゴンと結合し、空港到着時刻と比較。  
  3. 空港→神社の間に他の観光地滞在がないユーザーのみを抽出。  
  4. 滞在時間フィルタを > 60 分に設定。

 以下の内容でファイルを生成しました。メタデータの dependencies も自動でリンクさせています。」

このように、AIは「複数のクエリを連鎖させてパイプラインを構築する」ことや、「直行判定などの複雑なロジックを案件に合わせて即興で実装する」ことができます。
これにより、定型的な分析であれば、ほぼAIとの対話だけでデータパイプライン全体が完成するレベルにまで到達しています。

【人間が追記】

定型的な分析であれば、ほぼAIとの対話だけでデータパイプライン全体が完成するレベルにまで到達しています。

ここまで言い切る自信は流石にありません!
しかし、確実にゼロから考えるよりは圧倒的に早く、ほぼ正しいものが作成されている状態にはあると感じています!
ただし、ここでも重要なのは「コンテクスト」で、冒頭での「◯◯がやりたいんだけど」の指示内容をできるだけ明確にするというのもかなり重要です。

【Part 2】 AIが描いた未来:dbt × AI の完全自動化構想

さて、ここから先の話は、今の私たちがまだ実現できていない「未来の構想」です。

上記の運用について、壁打ち相手のAI(Gemini)に相談したところ、
「そのアプローチは素晴らしいが、もっと自動化できる。dbtと組み合わせれば最強のF1マシンになる」
という、私たちの想像を超えた提案が返ってきました。
以下は、AIが提示してくれたロードマップです。

AIが提案する「Writer / Guardian / Runner」体制

AIは、現在の「JSON埋め込み」を進化させ、以下の3つの役割でパイプラインを組むべきだと提言しています。

03_未来.jpg

① Writer (AI & Human)

  • 現状: 人間がAIに指示してSQLを書く。
  • 未来: 人間は「やりたいこと」だけを伝え、AIが過去の資産(JSON付きSQL)をテンプレートとして、爆速でドラフトを作成する。

② Guardian (CI/CD)

  • 現状: 目視チェック。
  • 未来: ここが重要です。AIが書いたコードをそのまま通すのではなく、「SQLパーサー(sqlglot等)」を使った自動検知システムを導入します。
  • 「SQLの中身」と「ヘッダーのJSON」に矛盾がないか(使っているテーブルがinputsに書いてあるか)を機械的にチェックし、ミスがあればマージをブロックします。

③ Runner (dbt)

  • 現状: 手動実行やスクリプト実行。
  • 未来: 信頼できる実行基盤として dbt を採用します。
  • ただし、人間が schema.yml を手書きする(YAML地獄)必要はありません。「SQLヘッダーのJSONから、dbtの設定ファイルを自動生成する」のです。
  • これにより、私たちは「AIに伝わるSQL」だけを書き、裏側では堅牢なdbtパイプラインが回るという世界が実現します。

【人間が追記】
正直、Gemini提案の未来像の具体的な内容が理解できていません!(現在やっていないことが多いので)
しかし、概念と「さらに発展させていける可能性がありそうだ」というところは理解できたので、今後の資料として活用したいと思います!

まとめ:走りながら考える

私たちが今実践しているのは、「SQLにJSONを埋め込む」という小さな工夫に過ぎません。
しかし、それをAIに見せたことで、「じゃあ次はこうしませんか?」というエンジニアリングの道筋(ロードマップ)が示されました。

  • 現在: AIが読みやすいコードを蓄積する(メタデータ埋め込み)。
  • 未来: dbt等のモダンスタックと融合させ、完全自動化を目指す。

「車輪の再発明だ」と笑われるかもしれません。しかし、AIという全く新しいドライバーが運転席に座るなら、車体(開発フロー)も新しく作り直す必要があるはずです。

私たちはこの「AIネイティブなデータ開発」の実験を、これからも楽しみながら続けていきます。

【人間が追記】

「車輪の再発明だ」と笑われるかもしれません。しかし、AIという全く新しいドライバーが運転席に座るなら、車体(開発フロー)も新しく作り直す必要があるはずです。

この最後のパンチライン、謎の納得感あって気に入りました笑
この1年で、AIは Copilot(副操縦士)から Pilot(操縦士)になっていますね。
(人間は一体どこへ…??? Control Tower(管制塔)???)

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?