はじめに
こんにちは。全社データ技術局データインテグレーションチームに所属している與田龍人です。
Snowflake の Semantic View は、データベース上にビジネスロジックを定義する新しい仕組みです。
これにより、テーブル間の関係性(RELATIONSHIPS
)、分析軸(DIMENSIONS
)、集計定義(FACTS
・METRICS
)を「意味付けしたレイヤー」として 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学習などに役立てることができます。
まとめ
今回は、dbt と dbt_semantic_view パッケージで Semantic View を構築し、Cortex Analyst と連携して自然言語分析を行うまでの最小構成を示しました。Semantic View は、メトリクスやディメンションの定義を Snowflake に一元化し、組織全体で統一された「意味」を共有できます。またCortex Analyst との連携により、これまでエンジニアが手動で書いていた SQL を AI が適切に生成でき、ビジネスユーザーも自然言語で高度な分析を実行できます。今後はログを活用しながら、フィードバックループによる改善で精度を高めていければと考えています。