Snowflake

Snowflake Cortex Analystで自然言語から分析へ|セマンティックモデル設計

2026-03-21
更新: 2026-03-27
NicheeLab編集部

Snowflake Cortex Analystは、ビジネスユーザーが自然言語で質問を投げるだけで、構造化データに対するSQLクエリを自動生成・実行できるサービスです。 セマンティックモデル(YAML定義)をもとにテーブル構造とビジネスロジックを理解し、正確なSQLを生成します。 本記事では、セマンティックモデルの設計方法、変換フローの仕組み、権限設計を解説します。

Cortex Analystとは

Cortex Analystは、自然言語の質問を受け取り、セマンティックモデルの定義に基づいてSQLクエリを生成するSnowflakeのマネージドサービスです。 従来のBIツールではダッシュボード設計者がクエリを事前定義する必要がありましたが、Cortex Analystではエンドユーザーが自由形式の質問を投げるだけで回答を得られます。

生成されるSQLはSELECT文のみに限定されるため、データの変更リスクはありません。 またSnowflakeのRBACが適用されるため、ユーザーのロールでアクセスできないデータは結果に含まれません。

自然言語→SQL変換フロー

[ビジネスユーザー]
       │ 「先月の商品カテゴリ別売上は?」
       ▼
[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

YAML定義の重要要素

要素役割必須
tablesクエリ対象テーブルの定義はい
dimensionsグループ化・フィルタ用カラムはい
time_dimensions時間軸カラム(日付・タイムスタンプ)推奨
measures集計計算式(SUM/COUNT/AVG等)はい
relationshipsテーブル間のJOIN定義複数テーブル時に必須
verified_queries検証済みの質問-SQL対。精度向上用のfew-shot例推奨
descriptionテーブル・カラムの自然言語説明精度向上に必須

APIからの呼び出し

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(検証済みクエリ)

セマンティックモデルのverified_queriesセクションに質問とSQLのペアを登録することで、 類似した質問が投げられた際のSQL生成精度が向上します。 これはfew-shot promptingのアプローチで、特にビジネス固有の用語やロジックがある場合に効果的です。

  • 質問文は実際のビジネスユーザーが使う自然な言い回しで記述する
  • SQLはセマンティックモデルで定義したテーブル・カラムを参照する
  • 10〜20個のverified queriesを登録するとSQL生成精度が大幅に向上する

制限事項と注意点

  • 生成されるSQLはSELECT文のみ(DMLやDDLは生成されない)
  • セマンティックモデルで未定義のテーブルやカラムには言及できない
  • 非常に複雑なJOIN(5テーブル以上)では精度が低下する場合がある
  • セマンティックモデルのdescriptionが不十分だと誤ったカラムマッピングが発生する
  • 現時点ではCortex Analystの実行はサーバーレスクレジットで課金される

試験対策のポイント

  • セマンティックモデルはYAML形式でステージ上に配置する
  • 生成SQLはSELECT文に限定され、RBACが適用される
  • verified_queriesはSQL生成精度を向上させるfew-shotの仕組み
  • Cortex AnalystとCortex Searchの違いを明確に区別する
  • SNOWFLAKE.CORTEX_USERデータベースロールの付与が必要

サンプル問題

Cortex Analyst

問題 1

Cortex Analystのセマンティックモデルに関して正しい記述はどれか?

  1. A. セマンティックモデルはJSON形式でSnowflakeテーブル内に保存する
  2. B. セマンティックモデルはYAML形式でステージ上に配置し、テーブル構造やメジャーを定義する
  3. C. セマンティックモデルを定義しなくても、Cortex Analystはスキーマを自動解析してSQLを生成できる
  4. D. セマンティックモデルのverified_queriesは必須フィールドで、省略するとエラーになる

正解: 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のリトリーバとして使います。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.