はじめに

こんにちは。全社データ技術局データインテグレーションチームに所属している與田龍人です。

Snowflake の Semantic View は、データベース上にビジネスロジックを定義する新しい仕組みです。
これにより、テーブル間の関係性(RELATIONSHIPS)、分析軸(DIMENSIONS)、集計定義(FACTSMETRICS)を「意味付けしたレイヤー」として Snowflake 上に構築できます。

Semantic View によって、SQL の深い知識がなくても一定正しい定義に基づく分析が可能になり、
Cortex Analyst のような AI エージェントと連携することで、自然言語によるデータ分析が実現します。

本記事では、Snowflake-Labsが公開している公式パッケージ dbt_semantic_view を使って dbt (data build tool)上で Semantic View を作成し、Snowflake Intelligence (Snowflake が提供するAIサービス群)の1つである Cortex Analyst で利用するまでの流れを紹介します。

1. 環境準備

Semantic View の定義を dbt から実行するために、まずパッケージとデータソースを設定します。

本記事ではdbt cloudを使用しますが、オープンソース版のdbt coreでも同様のパッケージを利用できます。

今回は、EC サイトを模したサンプルデータを使用します。
データセットでは、顧客情報と注文履歴の2つのテーブルで構成されており、「どの顧客がどの商品を購入し、どの都市で取引が行われたか」といった購買データを格納しています。

事前に snowflake と dbt cloud の接続テストなどは完了していることを想定しています。

packages.yml

packages.yml は、dbt に外部パッケージ(拡張機能)を追加するための設定ファイルです。
ここで、Semantic View の作成をサポートする公式拡張パッケージ Snowflake-Labs/dbt_semantic_view を指定します。
このパッケージを導入することで、dbt から直接 CREATE SEMANTIC VIEW 構文を発行し、
Snowflake 上で意味的なデータモデルを定義できるようになります。

packages:
  - package: Snowflake-Labs/dbt_semantic_view
    version: 1.0.3

依存関係を取得します。

dbt deps

sources.yml

sources.yml は、Semantic View の元となるデータソースを登録するための設定ファイルです。

version: 2

sources:
  - name: sample
    database: <YOUR_DATABASE_NAME>
    schema: <YOUR_SCHEMA_NAME>
    tables:
      - name: SAMPLE_CUSTOMERS
        description: "顧客マスタテーブル"
      - name: SAMPLE_ORDERS
        description: "注文テーブル"

ここで登録したテーブルを、dbt の {{ source() }} で参照できます。
Semantic View はこれらのテーブルを結合・拡張してモデル化します。

2. Semantic View モデルを作成

models/customer_orders_semantic.sql に以下のように定義します。

ここでは、顧客と注文のテーブルを結合し、分析に必要なディメンション・メトリクスを Semantic View として定義します。

{{ config(materialized='semantic_view',copy_grants = true) }}

TABLES(
  orders    AS {{ source('sample', 'SAMPLE_ORDERS') }}    PRIMARY KEY (ORDER_ID),
  customers AS {{ source('sample', 'SAMPLE_CUSTOMERS') }} PRIMARY KEY (CUSTOMER_ID)
)

RELATIONSHIPS(
  orders_to_customers AS
    orders (CUSTOMER_ID) REFERENCES customers (CUSTOMER_ID)
)

FACTS(
  orders.AMOUNT AS AMOUNT
)

DIMENSIONS (
  orders.ORDER_ID AS ORDER_ID
    COMMENT = '注文ID',
  orders.CUSTOMER_ID AS CUSTOMER_ID
    COMMENT = '顧客ID',
  orders.PRODUCT AS PRODUCT
    COMMENT = '商品名',
  customers.NAME AS NAME
    COMMENT = '顧客名',
  customers.AGE AS AGE
    COMMENT = '年齢',
  customers.CITY AS CITY
    COMMENT = '都市'
)

METRICS (
  orders.total_amount AS SUM(orders.AMOUNT)
    COMMENT = '売上合計',
  orders.avg_amount AS AVG(orders.AMOUNT)
    COMMENT = '平均注文金額',
  orders.order_count AS COUNT(*)
    COMMENT = '注文件数'
)

COMMENT = '顧客と注文を結合したセマンティックビュー'

Semantic View モデルの考え方

  • TABLES: 対象テーブルと主キーの定義
  • RELATIONSHIPS: テーブル間の関係を明示
  • FACTS: 数値系の事実データ(例:金額、数量)
  • DIMENSIONS: 分析軸(顧客・商品・地域など)
  • METRICS: 再利用可能な集計定義(例:売上合計・平均金額など)

Semantic View は、他の dbt モデルからも再利用できます。
semantic_view(ref(...)) 構文を使うことで、既存の Semantic View を参照し、
特定のメトリクスやディメンションを指定して新しいビューを作成できます。

{{ config(materialized='view') }}

select *
from semantic_view(
  {{ ref('customer_orders_semantic') }}
  METRICS total_amount, avg_amount
  DIMENSIONS CITY, PRODUCT
  WHERE CITY IS NOT NULL
)

この方法を使うと、既に定義された Semantic View をベースに
条件を絞り込んだり、特定のメトリクスだけを抽出したりする派生ビューを
dbt 上で簡潔に作成できます。

またdbt Cloud では、定義した dbt モデルをリネージュ(データの流れ)として可視化できます。
これにより、各モデルがどのデータソースや他の dbt モデルを利用しているかを一目で確認できます。

※ 注意点

Semantic View の SQL 定義内で記載した COMMENT は、dbt の persist_docs 機能とは連動していません。テーブル自体やカラムにコメントを永続化したい場合は、schema.yml に明示的に記述し、persist_docs を有効にする必要があります。

{{ config(
    materialized='view',
    persist_docs={"relation": true, "columns": true}
) }}

この設定により、YMLファイルに記載したドキュメントがデータベースのCOMMENTとして永続化されます。

3. 権限設定と実行

Semantic View の作成には、スキーマ単位で権限が必要です。Snowflake側のSQLワークシートから実行します。

GRANT CREATE SEMANTIC VIEW ON SCHEMA <YOUR_DATABASE_NAME>.<YOUR_SCHEMA_NAME>
  TO ROLE <YOUR_ROLE_NAME>;

dbt cloudへ戻り、作成したモデルをdbt runします。

dbt run --select customer_orders_semantic

Semantic Viewの確認

SnowsightのAIとML→Cortex分析からdbtで作成したSemantic Viewを確認できます。

4. Cortex Analyst で試す

ここからはSnowflake Intelligence の Cortex Analyst を設定し、作成したSemantic View を使って自然言語での分析を行います。
ここでは「構築 → 設定 → 質問して動かす」の流れをまとめます。

4-1. 構築手順

データベースとスキーマを作成

まず、Cortex Analyst を利用するための土台として、専用のデータベースとスキーマを作成します。ここでは snowflake_intelligence というデータベースを用意し、エージェントの管理用スキーマとして agentsを作成します。これらのオブジェクトに対しては、エージェント作成や実行に必要な基本的な権限を付与します。

CREATE DATABASE IF NOT EXISTS snowflake_intelligence;
GRANT USAGE ON DATABASE snowflake_intelligence TO ROLE PUBLIC;

CREATE SCHEMA IF NOT EXISTS snowflake_intelligence.agents;
GRANT USAGE ON SCHEMA snowflake_intelligence.agents TO ROLE PUBLIC;

GRANT CREATE AGENT ON SCHEMA snowflake_intelligence.agents TO ROLE <YOUR_ROLE_NAME>;

Cortex Analyst エージェントの設定(Snowsight から)

  • AIとMLから「エージェントを作成」を選択
  • ツール:Analyst(構造化データ)を設定
  • データソース:dbtで構築した Semantic Viewの選択
  • オーケストレーション:プロンプト定義
  • アクセス制御:利用ロールを設定

4-2. 自然言語で質問してみる

エージェントの設定完了後サイドバーからSnowflake インテリジェンスを選択。New chatから作成したエージェントとツールを選択し質問を送ります。

質問例: 「都市別の売上合計と平均注文金額を教えて」

Cortex Analyst は Semantic View の構造をもとに、SQL を自動生成し分析から可視化まで行います。

 

 

Cortex Analyst は Semantic View の定義を理解しているため、SQL を書かずに正確な結果を得られます。

4-3. ログ収集による運用改善

実際の運用では「使われているか?」「どこで困っているか?」を把握することが重要です。

SnowflakeにはCORTEX_ANALYST_REQUESTS_Vというビューがあり、Cortex Analystの実行履歴を取得できます。

SELECT * FROM SNOWFLAKE.LOCAL.CORTEX_ANALYST_REQUESTS_V

例えば、以下のような分析が可能です。

これによりよくある質問パターンの特定やユーザー別の成功率分析、エラーが多い質問の抽出などが可能になり、頻出質問をVerified Queryとして登録してFew-shot学習などに役立てることができます。

まとめ

今回は、dbtdbt_semantic_view パッケージで Semantic View を構築し、Cortex Analyst と連携して自然言語分析を行うまでの最小構成を示しました。Semantic View は、メトリクスやディメンションの定義を Snowflake に一元化し、組織全体で統一された「意味」を共有できます。またCortex Analyst との連携により、これまでエンジニアが手動で書いていた SQL を AI が適切に生成でき、ビジネスユーザーも自然言語で高度な分析を実行できます。今後はログを活用しながら、フィードバックループによる改善で精度を高めていければと考えています。

参考

Snowflake-Labs/dbt_semantic_view

Snowflake-Intelligence

cortex-analyst

cortex-analyst-request-v