
Text-to-SQLとは ― NL2SQLの歴史とLLM以後の変化
Text-to-SQL(NL2SQLとも呼ばれる)は、自然言語の質問をSQLクエリに変換するタスクです。 「先月の売上トップ10カテゴリを教えて」と書けば、エンジン側が適切なJOINとGROUP BYを組んでクエリを実行する ― この夢は2000年代からSeq2Seqモデルや文法ベースパーサで繰り返し挑戦されてきました。 LLM登場以前は、学術ベンチマーク上でも実行一致率(Execution Accuracy)が数十%台にとどまり、実運用に乗せるのは難しい領域でした。
状況を変えたのがGPT-3.5以降の大規模言語モデルです。 2023年に発表されたDIN-SQL(問題分解+自己修正)やDAIL-SQL(Skeleton-basedな例示選択)がSpiderで85%超を達成し、 その後2024〜2025年にかけて「Text-to-SQLはほぼ解けた」かのような空気が広まりました (DAIL-SQL論文(Gao et al., VLDB 2024))。 しかし、実企業のデータに近い新しいベンチマークが登場するにつれ、見過ごされていた巨大なギャップが可視化されてきました。 本記事では、ベンチマーク数値・代表的な実装手法・主要プロダクトのアーキテクチャ・評価フレームワークを横断的に整理し、 「Text-to-SQLの精度を本番レベルに引き上げるための実装パターン」を体系化します。
精度の現状 ― Spider 2.0・BIRD・ハルシネーション率
Text-to-SQLの精度を論じる上で、学術ベンチマークの世代差を理解することが不可欠です。 同じ「精度90%」という数字が、ベンチマークによって意味が全く異なります。
| ベンチマーク | 特徴 | 現在のSOTA | 人間のスコア |
|---|---|---|---|
| Spider 1.0 (2018) | 200DB・小規模スキーマ・単一SELECT中心 | 86.6%(DAIL-SQL)〜91%台 | - |
| BIRD (2023) | 95DB・33.4GB・37ドメイン・外部知識必要 | 76.13%(Gemini, 2025/11) | 92.96% |
| Spider 2.0 (ICLR 2025) | 1000カラム超・BQ/Snowflake・100行超SQL | 21.3%(o1-preview) | - |
| BIRD-Interact (ICLR 2026) | 対話的・曖昧質問の明確化含む | 16〜24%程度 | - |
要点は、スキーマ規模と業務複雑度を上げた途端に精度は1/4〜1/5に落ちるということです。 Spider 2.0ではGPT-4oでも10.1%、GPT-4はSpider 2.0-Snow(Snowflake環境)でわずか2.2%にとどまります (Spider 2.0論文 / arXiv 2411.07763、Spider 2.0公式)。
一方、BIRDはこの1年で急速にスコアが伸びています。 Google Geminiは2025年11月にSingle Trained Model Trackで76.13%を達成、 Databricks/Genieチームはself-consistency+RLVR(Reinforcement Learning with Verifiable Rewards)で75.68%を記録しました (Google Cloud Blog、BIRD-bench公式)。 ただしBIRDですら人間エキスパート(92.96%)には届いていません。
さらに深刻なのが、プロダクション環境でのハルシネーション率です。 GoodDataの調査では、セマンティックレイヤーが整備されていないAIシステムのハルシネーション率は最大79%に達すると報告されています (GoodData: Why Agents Will Hallucinate on Your Current Semantic Layer)。 モデルを差し替えるだけでは解決しない、環境側の問題が精度の支配要因であることを示唆しています。
精度を下げる5つの要因
実企業データでText-to-SQLが崩れる原因は、おおむね次の5つに分類できます。
1. Schema ambiguity ― テーブル名・カラム名が不明瞭
t_ord_hdr、cust_seg_v2、flg_del のような略記カラムは、LLMにとって意味を推測しにくい最大要因です。 またcustomer_idが orders と payments の両方に存在する場合、どちらを起点にJOINすべきかはビジネス文脈がないと判断できません。
2. Metric定義の揺れ
「売上」がGMV(流通総額)なのか、キャンセル除外後のネット売上なのか、税込か税抜か ― 組織ごと・部署ごとにバラバラです。 定義がSQL・ダッシュボード・スプレッドシートに分散していると、LLMは一番それらしい計算式を「創作」します。これがハルシネーションの最大源です。
3. 複雑なJOIN/Window関数
PARTITION BYを伴うLAG/LEAD、再帰CTE、UNPIVOT、ARRAY型アクセスなど、方言差分の強い構文は依然として崩れやすい領域です。 BigQuery、Snowflake、PostgreSQL、MySQLで微妙に異なる関数名・引数順にも対応する必要があります。
4. 業務ロジック依存
「アクティブユーザー」=「直近30日でイベント発火した人」「セッション」=「30分アイドルで切断」「解約」=「ステータスがcanceledに遷移した日付」 ― これらは業務側のルールブックにしかない定義です。LLMはスキーマだけからは決して再現できません。
5. データ型・NULL・タイムゾーン
文字列 "2026-04-18" と DATE型の混在、論理削除フラグの除外漏れ、UTC/JSTの境界 ― 些細に見えて結果が大きく変わる罠が多数あります。 Spider 2.0で精度が急落する一因も、まさにこの「現実のノイズ」です。
精度を上げる5つの実装アプローチ
ベンチマークとプロダクション実装の知見から、精度を押し上げる技術は次の5本柱に集約されます。
1. Semantic Layer / Metric Layer
精度向上のうち最もレバレッジが効くのが、セマンティックレイヤー(意味層)の整備です。 テーブル・カラムの説明、シノニム、メトリック定義、エンティティ間の関係をコードとして一度定義し、AI・BI・ノートブック全てに供給する「Metrics-as-Code」の思想です。
- dbt Semantic Layer(MetricFlow) ― YAMLでSemantic Model / Metric / Entityを定義。GraphQL・JDBC API経由で一貫供給(dbt Labs公式)
- Cube(Headless BI) ― Gartnerが2026年のMarket Guide for Agentic Analyticsで「オントロジー/セマンティックレイヤー/ナレッジグラフは必須」と評価(Cube Blog)
- LookML(Looker) ― 中央集権型メトリック。Gemini in Lookerが同じセマンティックを参照
- Unity Catalog Metric Views(Databricks) ― ガバナンス一体型のセマンティック管理
- Snowflake Semantic Model ― YAMLでdescriptive name・synonym・メトリック・filter条件を宣言してCortex Analystに供給
- AtScale ― キューブベースのユニバーサルセマンティックレイヤー
Snowflakeはこの分野で最も定量的に価値を示しており、エージェント型のセマンティックモデル自動生成・リファインメントだけでSQL精度が平均20%向上したと報告しています (Snowflake Engineering Blog: Agentic Semantic Model Improvement)。
2. Few-shot Examples ― ベクトル類似度で類似クエリを取得
過去に検証済みの「質問 ↔ SQL」ペアをベクトルデータベース(pgvector / Pinecone / Qdrant等)に蓄積し、 新規質問に対して意味的に近い例示をTop-k取得してプロンプトに差し込む手法です。 DAIL-SQLはこのアイデアを体系化し、「質問文の類似度」ではなく「SQLスケルトンの類似度で例示を選ぶ」方が有効だと示しました (DAIL-SQL論文)。 つまり、質問文は違っても「複数テーブルのGROUP BY + Window関数」のような構造類似で選ぶと効果が大きいということです。
3. RAG for SQL ― スキーマと過去クエリの動的注入
数百〜数千テーブルのDWHでは、スキーマ全体をプロンプトに載せるのは物理的に不可能です。 そこで、テーブル定義・カラム説明・過去のSQLをembeddingし、質問に応じてTop-kだけを取得するRAG for SQLが定石になっています。
nilensoの検証では、pgvector + all-MiniLM-L6-v2(384次元)ベースのシンプルなRAGで BIRDで57.1%、Spider最初の500問で85.6%の精度を達成しています (nilenso blog)。 限界として「類似度スコアの不正確さ」「存在しないカラムの捏造」「与えたスキーマを無視する挙動」も報告されており、 RAGは銀の弾丸ではなく、後述のValidatorと組み合わせて初めて実用化します。
4. Chain-of-Thought / ReAct ― ステップ分解で難問を崩す
複雑な質問をいきなりSQLに変換するのではなく、(a) スキーマリンキング → (b) サブ問題分解 → (c) SQL生成 → (d) 自己検証のように段階化する手法です。 DIN-SQLはこの「分解 + 自己修正」を明示的に組み込み、SpiderでExecution Accuracy 85.3%、BIRDで55.9%を達成しました (DIN-SQL論文(Pourreza & Rafiei, NeurIPS 2023))。 ReActパターン(Thought → Action → Observation)をSQL Agentに適用した実装も、LangChainリファレンスで標準となっています。
5. Guardrails / Validation ― 生成SQLを検査・実行・再試行する
LLMの出力をそのまま実行するのは危険です。最低限、次のガードレールを挟みます。
- 構文チェック ―
sqlglot等でパース。構文エラーなら再生成 - SELECT限定バリデーション ― DML(INSERT/UPDATE/DELETE/DROP)を弾く
- Dry-run / EXPLAIN ― 実行前にBQ/Snowflake等のdry-runでコストとエラーを検知
- Row-Level Securityの貫通 ― ユーザー権限でクエリを実行
- 結果の妥当性チェック ― 空結果/異常値ならLLMに戻して再試行
- 監査ログ永続化 ― 誰がどのSQLを発行したかを全て記録
実装パターン ― DIN-SQL / DAIL-SQL / LangChain SQL Agent
DIN-SQLのプロンプト構造
DIN-SQLは4モジュール構成でSQLを生成します。擬似コードで示すと次のようになります。
# Step 1: Schema Linking
prompt_1 = f"""
Given the question and database schema, identify which tables/columns are needed.
Schema: {schema}
Question: {question}
Answer: tables=[orders, users], columns=[orders.created_at, users.country]
"""
# Step 2: Classification (Easy / Non-nested / Nested)
prompt_2 = f"""
Classify the question difficulty:
- EASY: single table, no nested query
- NON-NESTED: joins, GROUP BY, no subquery
- NESTED: requires subquery or set operations
Question: {question}
"""
# Step 3: SQL Generation (difficulty-specific prompt with NatSQL intermediate)
prompt_3 = generate_sql_by_difficulty(question, schema_links, difficulty)
# Step 4: Self-Correction
prompt_4 = f"""
Check the following SQL for common mistakes:
- JOIN condition correctness
- Column name existence
- Aggregation correctness
SQL: {sql}
Fix if broken:
"""難易度ごとにプロンプトを切り替え、最後に自己修正を走らせる設計が、素のFew-shotより大幅に精度を伸ばした要因です。
DAIL-SQLのSkeleton-based Retrieval
DAIL-SQLは「過去クエリを例示として取得する際に、SQLのスケルトン(構造)類似度で検索する」ことをコアアイデアに据えました。 実装の要点は以下です。
# 過去の質問-SQLペアを用意
history = [
{"q": "月別の売上", "sql": "SELECT DATE_TRUNC(...) FROM orders GROUP BY 1"},
{"q": "カテゴリ別のCVR", "sql": "SELECT category, SUM(...)/COUNT(...) FROM ..."},
...
]
# SQLスケルトン(列名・定数を除いた構造)を抽出
def extract_skeleton(sql: str) -> str:
# e.g. "SELECT col FROM tbl GROUP BY col" → "SELECT _ FROM _ GROUP BY _"
...
# 新しい質問に対して、類似スケルトンを持つ例を検索
def retrieve_examples(question, history, k=5):
predicted_skeleton = llm_predict_skeleton(question)
scored = [(jaccard(predicted_skeleton, extract_skeleton(h["sql"])), h) for h in history]
return sorted(scored, reverse=True)[:k]GPT-4でわずか約1600トークン/問という効率で、Spider 86.6%(self-consistency込み)を達成しました。
LangChain SQL AgentのReAct実装
LangChain公式のSQL Agentは、次の8ステップをReActループで回します (LangChain Docs: Build a SQL agent)。
- 利用可能なテーブル一覧を取得
- 質問に関連するテーブルを選別
- 選別したテーブルのスキーマを取得
- スキーマと質問を元にSQLを生成
- LLMで一般的な誤りをダブルチェック
- SQLを実行
- DBエラーが出れば修正して再実行
- 結果を元に自然言語で回答整形
from langchain_community.agent_toolkits import create_sql_agent
from langchain_community.utilities import SQLDatabase
from langchain_openai import ChatOpenAI
db = SQLDatabase.from_uri("bigquery://project/dataset",
include_tables=["orders", "users"],
sample_rows_in_table_info=3)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
agent = create_sql_agent(
llm=llm,
db=db,
agent_type="openai-tools",
verbose=True,
top_k=10,
max_iterations=8, # Reflexionループの上限
)
result = agent.invoke({"input": "先月、カテゴリ別売上トップ10を教えて"})本番ではこれに加え、Progressive Disclosure(必要なテーブルのみオンデマンドで取得)と、 LangGraphベースのカスタム実装でValidator/Retryを明示制御するのが推奨されています。
主要プロダクトの実装を読み解く
Snowflake Cortex Analyst ― Semantic Modelベースのエージェント
Cortex Analystは複数のSOTA LLM(Meta Llama系、Mistral系)を組み合わせたエージェントワークフローで、 公称90%超のSQL精度を実世界ユースケースで達成していると報告されています (Cortex Analyst: Behind the Scenes)。 鍵は、ユーザーがYAMLで記述するSemantic Modelに、descriptive name・synonym・custom instructions・共通メトリックを明示的に埋め込む点です。 加えて、曖昧な質問を処理するClassification Agentが質問意図を分類し、適切なプロンプト経路にルーティングします。
Databricks Genie ― Unity Catalog × LLM
Genieは最大25テーブルで構成されるGenie SpaceをUnity Catalog上に定義し、 テーブル関係・列説明・ビジネスロジックをセマンティックとしてLLMに供給します (Production-Ready Databricks Genie)。 ガバナンス(Unity Catalog)とAI実行基盤が同居しているため、Row-Level Securityや列マスキングが自動で貫通するのが差別化ポイントです。 BIRDでself-consistency + RLVRで75.68%を達成した技術がGenieにも反映されています。
ThoughtSpot Sage ― 検索トークンとの融合
Sageは「Pre-process → GPT処理 → Post-process」の3段構成で、生成されたSQLを検索トークン("revenue by category last month"のようなSpotIQ独自記法)に一度変換し、 ユーザーに表示・編集させてから実行するハイブリッド方式を採っています (How we built Sage with GPT)。 完全なブラックボックス化を避け、ユーザーの検証可能性を担保する設計です。
Hex / Mode / Count ― ノートブック中心の分析ワークベンチ
Hexは「Notebook Agent」でSQL/Python/Chartセルを連携生成し、MCPサーバー経由でClaude・Cursorからも呼び出せるようにしました (Hex: AI and agents)。 Modeは既存SQL/Pythonノートブックに会話型AIを統合、CountはCanvas上のデータブロックをAIが自動接続する特徴的な可視化モデルを持ちます。 いずれも「生成されたクエリをユーザーが編集できる」点を重視し、ブラックボックス化を避ける設計方針が共通しています。
Google Looker(Gemini in Looker)/AWS Q in QuickSight/Microsoft Fabric Data Agents
3大クラウドBIはいずれも、既存のセマンティック層(LookML、Data Q&A topic、OneLake metadata)を土台にText-to-SQLエージェントを被せる路線で一致しています。 独自モデルではなく、メタデータとRBACの統合度で差別化する戦略です。
評価フレームワーク ― 何をもって「正しい」とするか
Text-to-SQLの評価は単純な「accuracyが高い/低い」では語れません。本番導入では複数の指標を多面的に見ます。
Execution Accuracy(実行一致率)
生成SQLの実行結果が正解SQLの実行結果と一致する割合。Spider / BIRDで採用されている主要指標で、 SQLの書き方が違っても結果が同じならOKとする寛容な指標です。
Exact Match
SQL文字列の厳密一致。同じ結果を返す異なる書き方を許容しないため、実務では補助指標として使われます。
LLM-as-a-Judge
正解SQLがない場合、別のLLM(GPT-4 Turbo等)に「この生成SQLは質問意図に合致しているか」を判定させる手法。 ArizeのPhoenix実装では、GPT-4 Turboを判定者にしたときF1スコア0.70〜0.76を達成したと報告されています (Arize: Evaluating SQL Generation with LLM as a Judge)。 注意点は「スキーマ情報を全部渡すと精度が下がる」「クエリで参照したテーブルのスキーマだけ渡すと大幅に改善する」という知見です。
Production Metrics(運用指標)
- Rerun rate ― ユーザーが同じ質問を言い換えた率。高ければ初回失敗が多い
- Thumbs up / Thumbs down率 ― 実ユーザーの受容度
- Tool Success Rate ― Reflexionループが何回目で成功したか
- Latency (P50 / P95) ― Deep Research系は30秒〜数分のオーダーになる
- Token cost / query ― Multi-agent構成では指数的に増える
- Ask for Review率 ― Genieのように人間レビューを要求した頻度
単一のgod metricに頼らず、マルチステップワークフローをユーザー中心に細分化して測るのが重要です (Humanloop: LLM Evals Done Right)。 IBMのtext2sql-eval-toolkitのようなOSSも登場しており、評価パイプラインをCIに組み込むハードルは下がっています。
よくある失敗とアンチパターン
1. スキーマがドキュメント化されていない
テーブルのdescription、カラムのcomment、外部キー関係がDBに書かれていないのにLLMに期待するのは無理筋です。 まずCOMMENT ON TABLE / COMMENT ON COLUMN(PostgreSQL/Snowflake)やdescription(BigQuery)を埋めることから始めるのが最低限のROIです。
2. Metric定義が統一されていない
「売上」「アクティブユーザー」「CVR」の定義が部門によって違うのにSemantic Layerを導入しないと、エージェントは美しいSQLを書きつつ平然と違う定義で計算します。 GoodDataが警告する79%ハルシネーションの主因です。
3. 評価セットがない
「質問 → 正解SQL/期待結果」のペアを50〜200件作らないまま本番投入すると、モデル更新・プロンプト変更の度にデグレに気づけません。 Databricks GenieがBenchmarks機能を標準装備したのも、この問題の重要性を示しています。
4. 全スキーマをプロンプトに詰め込む
数千テーブルの企業でスキーマ全量を注入すると、トークンコストが爆発するうえノイズで精度も落ちます。 RAG for SQL + Progressive Disclosure(必要なテーブルのみオンデマンド取得)が前提です。
5. 生成SQLを無検証で実行する
SELECT限定バリデーション・Dry-run・RLSの貫通・監査ログがないまま本番DBを叩かせると、セキュリティインシデントとコスト事故の温床になります。
ベストプラクティス ― 段階的導入と人間介在
ここまでの知見を踏まえた、Text-to-SQL導入の実務的な進め方を整理します。
- Phase 1: スキーマ整備とメタデータ ― テーブル・カラムdescription、シノニム、関係を定義。 ここだけでSnowflakeの研究では平均20%精度向上が観測されている。
- Phase 2: Semantic Layerの導入 ― dbt Semantic Layer、Cube、LookMLなどを採用し、メトリクスを「契約」として定義。 AI・BI・ノートブックが同じ値を返す土台を作る。
- Phase 3: 少数ドメインで評価セットを構築 ― 50〜200件の「質問↔期待結果」ペアを作成し、Execution AccuracyとLLM-as-Judgeで継続評価。
- Phase 4: Retrieval + Validatorパイプライン ― スキーマRAG、Few-shot retrieval、構文チェック、Dry-run、RLS貫通をLangGraph等で明示的にノード化。
- Phase 5: Human-in-the-Loop ― 低影響の集計は自動、影響度の高い意思決定支援クエリは人間承認。 Thumbs up/downとAsk for Reviewを標準装備し、意思決定ログを学習データに還流。
- Phase 6: Production Monitoring ― Rerun rate・Latency・Token cost・ユーザー受容度をダッシュボード化。 スキーマ変更 → Semantic Layer更新 → 評価スイート実行までをCI/CDで連動させる。
重要なのは、Text-to-SQLを単一のモデル選定問題ではなく、セマンティック整備・検索・生成・検証・人間介在・監視を横断する「分散システム設計」として扱うことです。 「GPT-5に差し替えれば解決する」という認識は、2026年時点でも誤りです。
まとめ
- Text-to-SQLの精度はベンチマークごとに桁違いに異なる。Spider 1.0は86〜91%だが、 実企業データに近いSpider 2.0ではo1-previewで21.3%、GPT-4oで10.1%、GPT-4はSnowflake環境でわずか2.2%。 BIRDもGemini 76.13%が現在のSOTAで、人間エキスパート92.96%には届いていない。
- 精度を下げる5要因は、スキーマ曖昧性、Metric定義の揺れ、複雑なJOIN/Window関数、業務ロジック依存、型・NULL・タイムゾーン。 セマンティック不整合に起因するハルシネーションは最大79%にも達する。
- 精度を上げるのは、(1) Semantic Layer、(2) Few-shot Examples、(3) RAG for SQL、(4) Chain-of-Thought/ReAct、(5) Guardrails/Validationの5本柱。 単独で銀の弾丸になるものはなく、組み合わせて初めて実用精度になる。
- 実装パターンはDIN-SQL(分解+自己修正、Spider 85.3%)、DAIL-SQL(Skeleton-based retrieval、Spider 86.6%)、 LangChain SQL Agent(ReActループ+Validator)が参照実装として広く使われている。
- 主要プロダクトの差別化軸はセマンティック整備とガバナンス統合。 Snowflake Cortex Analyst(90%+精度公称)、Databricks Genie(Unity Catalog統合、BIRD 75.68%)、ThoughtSpot Sage(検索トークン可視化)、Hex/Mode/Count(ノートブック中心)などがある。
- 評価はExecution Accuracy、Exact Match、LLM-as-a-Judge(F1 0.70〜0.76)、Rerun rate・Thumbs up率・Latency・Token costなどを多面的に。 単一god metricに頼らず、CI/CDに評価スイートを組み込むことが「実験」から「プロダクト」への分岐点。
関連サービスのご案内
AI Readyデータ基盤の構築から、分析自動化AIエージェントの導入まで一気通貫で
DecisionFlowは、DWH/セマンティックレイヤーの整備と、KPI変動検知 → 問い生成 → 自動分析 → 意思決定までをパイプライン化するAIエージェントを導入パッケージで提供しています。 Text-to-SQLを「単一モデル選定」ではなく「分散システム設計」として扱い、本番レベルの精度とガバナンスを両立します。
関連記事:AIエージェント型データ分析の全体像/AI Readyデータ基盤とは?/Slack × AI分析エージェント/お問い合わせ
