Snowflake Cortex Analystは、ビジネスユーザーが自然言語で質問を投げるだけで、構造化データに対するSQLクエリを自動生成・実行できるサービスです。 セマンティックモデル(YAML定義)をもとにテーブル構造とビジネスロジックを理解し、正確なSQLを生成します。 本記事では、セマンティックモデルの設計方法、変換フローの仕組み、権限設計を解説します。
Cortex Analystは、自然言語の質問を受け取り、セマンティックモデルの定義に基づいてSQLクエリを生成するSnowflakeのマネージドサービスです。 従来のBIツールではダッシュボード設計者がクエリを事前定義する必要がありましたが、Cortex Analystではエンドユーザーが自由形式の質問を投げるだけで回答を得られます。
生成されるSQLはSELECT文のみに限定されるため、データの変更リスクはありません。 またSnowflakeのRBACが適用されるため、ユーザーのロールでアクセスできないデータは結果に含まれません。
[ビジネスユーザー]
│ 「先月の商品カテゴリ別売上は?」
▼
[Cortex Analyst API]
│
├─ 1. セマンティックモデル(YAML)を読み込み
│ └─ テーブル構造・カラムの意味・計算式を把握
│
├─ 2. LLMが自然言語を解析
│ └─ 意図を理解し、該当するテーブル・カラムをマッピング
│
├─ 3. SQLクエリを生成(SELECT文のみ)
│ └─ セマンティックモデルの定義に従ったJOIN・集計を構築
│
└─ 4. SQLを返却(自動実行 or ユーザー確認後実行)
└─ 結果はJSON形式でAPIレスポンスに含まれるセマンティックモデルはYAML形式で記述し、Snowflakeステージ上に配置します。 モデルには論理テーブル・ディメンション・メジャー・時間ディメンション・リレーションシップを定義します。
# semantic_model.yaml
name: sales_analytics
description: "EC売上分析用セマンティックモデル"
tables:
- name: orders
base_table:
database: ANALYTICS_DB
schema: PUBLIC
table: FACT_ORDERS
description: "注文トランザクションテーブル"
dimensions:
- name: order_id
expr: ORDER_ID
description: "注文の一意識別子"
data_type: VARCHAR
- name: product_category
expr: PRODUCT_CATEGORY
description: "商品カテゴリ(家電、食品、衣料品など)"
data_type: VARCHAR
time_dimensions:
- name: order_date
expr: ORDER_DATE
description: "注文日"
data_type: DATE
measures:
- name: total_revenue
expr: SUM(ORDER_AMOUNT)
description: "合計売上金額"
data_type: NUMBER
- name: order_count
expr: COUNT(DISTINCT ORDER_ID)
description: "注文件数"
data_type: NUMBER
- name: avg_order_value
expr: AVG(ORDER_AMOUNT)
description: "平均注文単価"
data_type: NUMBER
- name: customers
base_table:
database: ANALYTICS_DB
schema: PUBLIC
table: DIM_CUSTOMERS
description: "顧客マスタ"
dimensions:
- name: customer_id
expr: CUSTOMER_ID
description: "顧客ID"
data_type: VARCHAR
- name: region
expr: REGION
description: "顧客の所在地域"
data_type: VARCHAR
relationships:
- name: order_customer
left_table: orders
right_table: customers
join_type: LEFT
relationship_columns:
- left_column: CUSTOMER_ID
right_column: CUSTOMER_ID
verified_queries:
- name: "月次カテゴリ別売上"
question: "商品カテゴリ別の月次売上を教えて"
sql: |
SELECT
DATE_TRUNC('MONTH', o.ORDER_DATE) AS month,
o.PRODUCT_CATEGORY,
SUM(o.ORDER_AMOUNT) AS total_revenue
FROM ANALYTICS_DB.PUBLIC.FACT_ORDERS o
GROUP BY 1, 2
ORDER BY 1, 3 DESC| 要素 | 役割 | 必須 |
|---|---|---|
| tables | クエリ対象テーブルの定義 | はい |
| dimensions | グループ化・フィルタ用カラム | はい |
| time_dimensions | 時間軸カラム(日付・タイムスタンプ) | 推奨 |
| measures | 集計計算式(SUM/COUNT/AVG等) | はい |
| relationships | テーブル間のJOIN定義 | 複数テーブル時に必須 |
| verified_queries | 検証済みの質問-SQL対。精度向上用のfew-shot例 | 推奨 |
| description | テーブル・カラムの自然言語説明 | 精度向上に必須 |
Cortex AnalystはREST APIおよびPython SDKから呼び出します。Snowsight上のStreamlitアプリに組み込むことも可能です。
# Python SDKでの呼び出し例
import json
from snowflake.core import Root
root = Root(session)
analyst = root.databases["ANALYTICS_DB"].schemas["PUBLIC"].cortex_analyst
response = analyst.send_message(
semantic_model_file="@my_stage/semantic_model.yaml",
messages=[
{"role": "user", "content": "先月の地域別売上トップ5を教えて"}
]
)
# レスポンスからSQLと結果を取得
for item in response.message.content:
if item.type == "sql":
print("Generated SQL:", item.statement)
elif item.type == "text":
print("Explanation:", item.text)Cortex Analystの権限はSnowflakeの標準RBACモデルに従います。
| 操作 | 必要な権限 |
|---|---|
| Cortex Analyst APIの呼び出し | SNOWFLAKE.CORTEX_USER データベースロール |
| セマンティックモデルYAMLの読み取り | ステージに対するREAD権限 |
| 生成SQLの実行対象テーブル | テーブルに対するSELECT権限 |
| クエリ実行 | ウェアハウスのUSAGE権限 |
-- Cortex Analyst利用ユーザーへの権限付与例
GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE analyst_role;
GRANT USAGE ON DATABASE analytics_db TO ROLE analyst_role;
GRANT USAGE ON SCHEMA analytics_db.public TO ROLE analyst_role;
GRANT SELECT ON ALL TABLES IN SCHEMA analytics_db.public TO ROLE analyst_role;
GRANT READ ON STAGE analytics_db.public.my_stage TO ROLE analyst_role;
GRANT USAGE ON WAREHOUSE analyst_wh TO ROLE analyst_role;セマンティックモデルのverified_queriesセクションに質問とSQLのペアを登録することで、 類似した質問が投げられた際のSQL生成精度が向上します。 これはfew-shot promptingのアプローチで、特にビジネス固有の用語やロジックがある場合に効果的です。
Cortex Analyst
問題 1
Cortex Analystのセマンティックモデルに関して正しい記述はどれか?
正解: B
Cortex Analystのセマンティックモデルはステージ上にYAMLファイルとして配置し、テーブル・ディメンション・メジャー・リレーションシップを定義します。Aは形式がJSON/テーブル内で誤り、Cはセマンティックモデル未定義では利用不可、Dのverified_queriesは推奨ですが必須ではありません。
Cortex Analystのセマンティックモデルはどこに保存されますか?
セマンティックモデルはYAMLファイルとしてSnowflakeのステージ上に保存されます。@my_stage/semantic_model.yaml のようにステージパスで参照し、Cortex Analystはこのファイルをもとにテーブル構造・カラムの意味・計算ロジックを理解してSQLを生成します。バージョン管理にはGitリポジトリ連携も利用可能です。
Cortex Analystが生成するSQLは安全ですか?
Cortex Analystが生成するSQLはSELECT文に限定されており、INSERT/UPDATE/DELETE/DDLは生成されません。さらに、実行時にはユーザーのロール権限が適用されるため、アクセス権のないテーブルやカラムにはアクセスできません。セマンティックモデルで公開するテーブルを制限することで、クエリ対象をさらに限定できます。
Cortex AnalystとCortex Searchの使い分けは?
Cortex Analystは構造化データに対する自然言語→SQL変換に特化しています。ビジネスユーザーが『先月の売上上位10商品は?』のような分析クエリを自然言語で実行するユースケースに適しています。一方、Cortex Searchは非構造化テキストのハイブリッド検索に特化しており、ドキュメント検索やRAGのリトリーバとして使います。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...