概要
データ分析を行えるクラウドサービスとしてSnowflakeが有りますが、
その中のサービス「Snowflake Intelligence」が2025年11月4日に一般提供されました
自然言語(チャット)で構造化データと非構造化データ双方の分析に対応できているとの事で、面白そうですね
そこで、Snowflake Intelligenceを実際に試してみました。
実際に試してみて分かりましたが、Snowflake IntelligenceはCSVを入れたらAIが勝手に分析してくれるものではなく、LLMによるデータ分析の基盤を作る必要が有ります
この記事では、
Snowflakeの新しいUIではまりそうな構築ポイントを回避しながら Snowflake Intelligence の実技検証手順をまとめてみました
事前知識
Snowflake Intelligenceの特徴
1. 「何が起きているか」だけでなく、重要な「なぜそうなったのか」を教えてくれる
Snowflake Intelligenceは社内のデータだけでなく、サードパーティー(市場の動きなどの外部データ)もあわせて分析対象としてくれる
「なぜ売上が落ちたのか?」という踏み込んだ理由まで、普段通りの言葉でやり取りしながら探っていける模様
2. 回答の情報源まで遡ることができる
回答の根拠をはっきりさせる事が出来る
「どのデータを見てそう判断したか」というソースを提示してくるので、根拠をユーザーが再確認できる
3. Snowflakeのセキュアな環境下で使える
Snowflakeの強固なガバナンスポリシーの下で運用されている
今回のゴール
Cortex Analyst(数値・構造化データ)
Cortex Search(文章・非構造化データ)
を構築して、自然言語で質問できる状態を作る所までを目指します
Cortex Agentに統合して、Snowflake IntelligenceのチャットUI(Chat GPTの様な画面)にて自然言語で質問できる状態を目指しましたが、現時点では、Trial版ではそこまでサポートしていないので、そこは割愛しています
実技検証手順
初期セットアップSQLの実行
Snowflake Intelligence を使うために必要な以下のリソースを公式の setup.sql を一度実行するだけでまとめて作成します。
- データベース
- ロール
- ウェアハウス
- サンプルデータ
- AI 機能用の下準備
手順
公式リポジトリから setup.sql を取得
setup.sql (展開すると全文表示。上記リンクが切れたとき用)
-- Summary of objects created in this script:
--
-- Roles:
-- - snowflake_intelligence_admin
--
-- Warehouses:
-- - WH_SI_JP
--
-- Databases:
-- - DB_SI_JP
-- - snowflake_intelligence
--
-- Schemas:
-- - DB_SI_JP.retail
-- - snowflake_intelligence.agents
--
-- File Format:
-- - swt_csvformat
--
-- Stages:
-- - swt_marketing_data_stage
-- - swt_products_data_stage
-- - swt_sales_data_stage
-- - swt_social_media_data_stage
-- - swt_support_data_stage
-- - semantic_models
--
-- Tables:
-- - marketing_campaign_metrics
-- - products
-- - sales
-- - social_media
-- - support_cases
--
-- Notification Integration:
-- - email_integration
--
-- Stored Procedure:
-- - send_email
USE ROLE accountadmin;
CREATE OR REPLACE ROLE snowflake_intelligence_admin;
GRANT CREATE WAREHOUSE on account to role snowflake_intelligence_admin;
GRANT CREATE DATABASE on account to role snowflake_intelligence_admin;
GRANT CREATE INTEGRATION on account to role snowflake_intelligence_admin;
SET current_user = (select current_user());
GRANT ROLE snowflake_intelligence_admin to user identifier($current_user);
ALTER USER SET default_role = snowflake_intelligence_admin;
ALTER USER SET default_warehouse = WH_SI_JP;
USE ROLE snowflake_intelligence_admin;
CREATE OR REPLACE DATABASE DB_SI_JP;
USE DATABASE DB_SI_JP;
CREATE OR REPLACE SCHEMA RETAIL;
CREATE OR REPLACE WAREHOUSE WH_SI_JP WITH WAREHOUSE_SIZE = 'large';
CREATE DATABASE IF NOT EXISTS snowflake_intelligence;
CREATE SCHEMA IF NOT EXISTS snowflake_intelligence.agents;
GRANT CREATE AGENT on schema snowflake_intelligence.agents to role snowflake_intelligence_admin;
USE DATABASE DB_SI_JP;
USE SCHEMA RETAIL;
USE WAREHOUSE WH_SI_JP;
CREATE OR REPLACE file format swt_csvformat
skip_header = 1
field_optionally_enclosed_by = '"'
type = 'csv'
;
-- create table marketing_campaign_metrics and load data from s3 bucket
CREATE OR REPLACE stage swt_marketing_data_stage
file_format = swt_csvformat
url = 's3://sfquickstarts/sfguide_getting_started_with_snowflake_intelligence_ja/marketing/';
CREATE OR REPLACE table marketing_campaign_metrics (
date date,
category varchar(16777216),
campaign_name varchar(16777216),
impressions number(38,0),
clicks number(38,0)
);
COPY INTO marketing_campaign_metrics
FROM @swt_marketing_data_stage;
-- create table products and load data from s3 bucket
CREATE OR REPLACE stage swt_products_data_stage
file_format = swt_csvformat
url = 's3://sfquickstarts/sfguide_getting_started_with_snowflake_intelligence_ja/product/';
CREATE OR REPLACE table products (
product_id number(38,0),
product_name varchar(16777216),
category varchar(16777216)
);
COPY INTO products
from @swt_products_data_stage;
-- create table sales and load data from s3 bucket
CREATE OR REPLACE stage swt_sales_data_stage
file_format = swt_csvformat
url = 's3://sfquickstarts/sfguide_getting_started_with_snowflake_intelligence_ja/sales/';
CREATE OR REPLACE table sales (
date date,
region varchar(16777216),
product_id number(38,0),
units_sold number(38,0),
sales_amount number(38,2)
);
COPY INTO sales
FROM @swt_sales_data_stage;
-- create table social_media and load data from s3 bucket
CREATE OR REPLACE stage swt_social_media_data_stage
file_format = swt_csvformat
url = 's3://sfquickstarts/sfguide_getting_started_with_snowflake_intelligence_ja/social_media/';
CREATE OR REPLACE table social_media (
date date,
category varchar(16777216),
platform varchar(16777216),
influencer varchar(16777216),
mentions number(38,0)
);
COPY INTO social_media
FROM @swt_social_media_data_stage;
-- create table support_cases and load data from s3 bucket
CREATE OR REPLACE stage swt_support_data_stage
file_format = swt_csvformat
url = 's3://sfquickstarts/sfguide_getting_started_with_snowflake_intelligence_ja/support/';
CREATE OR REPLACE table support_cases (
id varchar(16777216),
title varchar(16777216),
product varchar(16777216),
transcript varchar(16777216),
date date
);
COPY INTO support_cases
FROM @swt_support_data_stage
;
CREATE OR REPLACE stage semantic_models encryption = (type = 'snowflake_sse') directory = ( enable = true );
CREATE OR REPLACE notification integration email_integration
type=email
enabled=true
default_subject = 'snowflake intelligence'
;
CREATE OR REPLACE PROCEDURE send_email(
recipient_email varchar,
subject varchar,
body varchar
)
returns varchar
language python
runtime_version = '3.12'
packages = ('snowflake-snowpark-python')
handler = 'send_email'
as
$$
def send_email(session, recipient_email, subject, body):
try:
# Escape single quotes in the body
escaped_body = body.replace("'", "''")
# Execute the system procedure call
session.sql(f"""
CALL SYSTEM$SEND_EMAIL(
'email_integration',
'{recipient_email}',
'{subject}',
'{escaped_body}',
'text/html'
)
""").collect()
return "Email sent successfully"
except Exception as e:
return f"Error sending email: {str(e)}"
$$;
ALTER ACCOUNT SET CORTEX_ENABLED_CROSS_REGION = 'AWS_US';
SELECT 'Congratulations! Snowflake Intelligence セットアップは無事完了しました!' as status;
作成されるリソース
| カテゴリ | オブジェクト名 | 役割・用途 |
|---|---|---|
| ロール | snowflake_intelligence_admin |
管理用ロール。「ウェアハウス(仮想サーバー)」、「データベース」、「統合(INTEGRATION)オブジェクト」、「エージェント」作成の権限を付与 |
| ウェアハウス | WH_SI_JP |
AIの推論やデータ処理を動かすための計算リソース(Size: Large)。 |
| データベース | DB_SI_JP |
分析の核となる小売関連(Retail)のデータを格納する箱です。 |
| データベース | snowflake_intelligence |
AIエージェント本体を定義・保存するための専用DBです。 |
| スキーマ | DB_SI_JP.RETAIL |
売上、製品、SNS、サポートなど、実データテーブルの管理場所です。 |
| スキーマ | snowflake_intelligence.agents |
作成したAIエージェントを格納・管理する場所です。 |
| テーブル | marketing_campaign_metrics |
広告キャンペーンの結果(クリック数など)を保持します。 |
| テーブル | products |
商品名やカテゴリなどのマスター情報です。 |
| テーブル | sales |
地域ごとの売上金額や販売数などの実績データです。 |
| テーブル | social_media |
SNSのトレンド。AIが「なぜ売れたか」を推論する材料になります。 |
| テーブル | support_cases |
顧客対応ログ。AIが顧客の声を分析するために参照します。 |
| ステージ | semantic_models |
【重要】 データの意味をAIに教える「定義ファイル(YAML)」の置き場です。 |
| ステージ | swt_xxx_data_stage |
各種CSVデータを外部(S3等)からロードするための一時的な窓口。 |
| 通知統合 | email_integration |
Snowflakeからメールを送信するための通信設定です。 |
| プロシージャ | send_email |
AIが分析結果をメール報告する際に呼び出すPythonプログラムです。 |
| ファイル形式 | swt_csvformat |
CSV読み込み時のルール(ヘッダー飛ばし等)の定義です。 |
簡易にまとめると
| 役割 | 内容 | 該当オブジェクト名 | 行えること |
|---|---|---|---|
| 管理者・実行役 | ロール / ウェアハウス |
snowflake_intelligence_adminWH_SI_JP
|
AIを動かすための「権限」と「パワー」 |
| データの保管庫 | データベース / スキーマ / テーブル |
DB_SI_JP.RETAILsales, products など計5テーブル |
AIが分析するための「知識(データ)」 |
| 知能の設定場所 | ステージ / スキーマ |
semantic_modelssnowflake_intelligence.agents
|
データの意味をAIに教える「説明書の置き場」 |
| アクション機能 | メール連携 / プロシージャ |
email_integrationsend_email
|
分析後にメールを送るなどの「行動手段」 |
ここでは「AIを安全に動かすための専用環境」を用意しています。
尚、本setup.sqlではS3から取り込んだStagingテーブルを分析対象としているけど、実際にはdbtで整形したMartデータを分析対象とする必要が有ると理解
Snowflake の Worksheet で SQL を実行
実行後、ロールを「SNOWFLAKE_INTELLIGENCE_ADMIN」に切り替え
Cortex Analyst(構造化データ × AI)の構築
Cortex Analyst とは
売上、商品、クリック数などのテーブル形式のデータ(構造化データ)を対象に自然言語からSQLを自動生成してくれる機能
そのために
「この列は売上」「この列は商品名」といった情報(セマンティックモデル) を AI に教える必要が有ります
セマンティックモデルとは
AIに「このデータは何を意味しているか」を教える設計書 です。
AIはテーブル構造だけ見ても、 「clicks が何を意味するのか」、「どの列で集計すべきか」を正しく理解できません。
そのため、人間が意図を YAML で明示する必要が有ります
その情報を持たせたものをセマンティックモデルといいます
セマンティックモデル(YAML)の登録
以下の YAML ファイルをダウンロード
marketing_campaigns.yaml (展開すると全文表示。上記リンクが切れたとき用)
name: Sales_And_Marketing_Data
tables:
- name: MARKETING_CAMPAIGN_METRICS
base_table:
database: DB_SI_JP
schema: RETAIL
table: MARKETING_CAMPAIGN_METRICS
primary_key:
columns:
- CATEGORY
dimensions:
- name: CAMPAIGN_NAME
synonyms:
- ad_campaign
- marketing_campaign
- promo_name
- advertisement_name
- campaign_title
- promotion_name
description: マーケティングキャンペーンの名前。特定のプロモーション施策のパフォーマンスを識別・分析するために使用できます。
expr: CAMPAIGN_NAME
data_type: VARCHAR(16777216)
sample_values:
- Summer Fitness Campaign
- name: CATEGORY
synonyms:
- type
- classification
- group
- label
- sector
- class
- kind
- genre
description: マーケティングキャンペーンのカテゴリ。プロモーション対象の製品またはサービスを表し、特定の業種や製品ラインなどを示します。
expr: CATEGORY
data_type: VARCHAR(16777216)
sample_values:
- Fitness Wear
facts:
- name: CLICKS
synonyms:
- click_throughs
- link_clicks
- ad_clicks
- button_clicks
- selections
- hits
description: マーケティングキャンペーンにおいて、ユーザーが広告またはプロモーションリンクをクリックした合計回数。
expr: CLICKS
data_type: NUMBER(38,0)
sample_values:
- '614'
- '429'
- '446'
- name: IMPRESSIONS
synonyms:
- views
- ad_views
- ad_exposures
- display_count
- ad_impressions
- exposures
- ad_views_count
- views_count
description: マーケティングキャンペーン期間中に広告がユーザーに表示された合計回数。
expr: IMPRESSIONS
data_type: NUMBER(38,0)
sample_values:
- '10927'
- '7278'
- '9962'
time_dimensions:
- name: DATE
synonyms:
- day
- calendar_date
- timestamp
- datestamp
- calendar_day
- date_value
description: マーケティングキャンペーンの指標が記録された日付。
expr: DATE
data_type: DATE
sample_values:
- '2025-06-15'
- '2025-06-16'
- '2025-06-17'
- name: PRODUCTS
base_table:
database: DB_SI_JP
schema: RETAIL
table: PRODUCTS
primary_key:
columns:
- PRODUCT_ID
dimensions:
- name: CATEGORY
synonyms:
- type
- classification
- group
- genre
- kind
- class
- product_type
- product_group
- product_category
- product_classification
description: CATEGORYカラムは販売商品の種類を表し、Fitness Wear(フィットネスウェア)、Casual Wear(カジュアルウェア)、Accessories(アクセサリー)の3つの主要カテゴリに分類されます。
expr: CATEGORY
data_type: VARCHAR(16777216)
sample_values:
- Fitness Wear
- Casual Wear
- Accessories
- name: PRODUCT_ID
synonyms:
- product_key
- item_id
- product_number
- item_number
- product_code
- sku
- product_identifier
description: カタログ内の各商品を一意に識別するための識別子。
expr: PRODUCT_ID
data_type: NUMBER(38,0)
sample_values:
- '1'
- '2'
- '3'
- name: PRODUCT_NAME
synonyms:
- item_name
- product_title
- item_title
- product_description
- product_label
- item_label
description: 販売商品の名称。フィットネス機器やアクセサリーなど、特定の商品タイプを示します。
expr: PRODUCT_NAME
data_type: VARCHAR(16777216)
sample_values:
- Fitness Item 1
- Fitness Item 2
- Fitness Item 3
- name: SALES
base_table:
database: DB_SI_JP
schema: RETAIL
table: SALES
dimensions:
- name: PRODUCT_ID
synonyms:
- product_code
- item_id
- product_number
- item_number
- sku
- product_key
description: 販売商品の一意識別子。
expr: PRODUCT_ID
data_type: NUMBER(38,0)
sample_values:
- '1'
- '2'
- '3'
- name: REGION
synonyms:
- area
- territory
- zone
- district
- location
- province
- state
- county
- geographic_area
- market_area
description: 販売が行われた地理的地域。
expr: REGION
data_type: VARCHAR(16777216)
sample_values:
- North
- South
- East
facts:
- name: SALES_AMOUNT
synonyms:
- total_sales
- revenue
- sales_total
- sales_value
- sales_revenue
- total_revenue
- sales_figure
- sales_number
description: 取引または注文によって生成された販売額の合計。
expr: SALES_AMOUNT
data_type: NUMBER(38,2)
sample_values:
- '2199.67'
- '1039.35'
- '692.70'
- name: UNITS_SOLD
synonyms:
- quantity_sold
- items_sold
- sales_volume
- units_purchased
- volume_sold
- sales_quantity
description: 販売された商品の合計数量。
expr: UNITS_SOLD
data_type: NUMBER(38,0)
sample_values:
- '28'
- '25'
- '26'
time_dimensions:
- name: DATE
synonyms:
- day
- calendar_date
- date_field
- calendar_day
- timestamp
- date_value
- entry_date
- record_date
- log_date
description: 販売が行われた日付。取引が発生したカレンダー日を表します。
expr: DATE
data_type: DATE
sample_values:
- '2025-05-16'
- '2025-05-17'
- '2025-05-18'
- name: SOCIAL_MEDIA
base_table:
database: DB_SI_JP
schema: RETAIL
table: SOCIAL_MEDIA
dimensions:
- name: CATEGORY
synonyms:
- type
- classification
- group
- genre
- kind
- label
- section
- class
description: ソーシャルメディアコンテンツのカテゴリ。フィットネス関連の衣類やアクセサリーなど、プロモーション対象の製品またはサービスを示します。
expr: CATEGORY
data_type: VARCHAR(16777216)
sample_values:
- Fitness Wear
- name: INFLUENCER
synonyms:
- social_media_personality
- online_influencer
- social_media_figure
- content_creator
- key_opinion_leader
- thought_leader
- industry_expert
- brand_ambassador
description: ソーシャルメディアインフルエンサーの名前。製品またはサービスをプロモーションするために使用されるソーシャルメディア上の有名人を示します。
expr: INFLUENCER
data_type: VARCHAR(16777216)
sample_values:
- NovaFitStar
- name: PLATFORM
synonyms:
- channel
- medium
- site
- social_media_channel
- network
- outlet
description: ソーシャルメディアプラットフォーム。活動または関与が行われたソーシャルメディアのプラットフォームを示します。
expr: PLATFORM
data_type: VARCHAR(16777216)
sample_values:
- Instagram
- Twitter
- Facebook
facts:
- name: MENTIONS
synonyms:
- citations
- references
- quotes
- allusions
- name_drops
- tags
- shoutouts
- credits
- acknowledgments
description: ブランド、製品、またはキーワードがソーシャルメディアプラットフォームで何回言及されたかを示す数値。
expr: MENTIONS
data_type: NUMBER(38,0)
sample_values:
- '16'
- '6'
- '9'
time_dimensions:
- name: DATE
synonyms:
- day
- timestamp
- calendar_date
- posting_date
- publication_date
- entry_date
description: ソーシャルメディアデータが収集または投稿された日付。
expr: DATE
data_type: DATE
sample_values:
- '2025-05-16'
- '2025-05-17'
- '2025-05-19'
relationships:
- name: SALES_TO_PRODUCT
left_table: SALES
right_table: PRODUCTS
relationship_columns:
- left_column: PRODUCT_ID
right_column: PRODUCT_ID
relationship_type: many_to_one
join_type: inner
- name: MARKETING_TO_SOCIAL
left_table: SOCIAL_MEDIA
right_table: MARKETING_CAMPAIGN_METRICS
relationship_columns:
- left_column: CATEGORY
right_column: CATEGORY
relationship_type: many_to_one
join_type: inner
verified_queries:
- name: sales
question: |+
商品カテゴリごとの6月から8月までの売上トレンドを表示してください。
use_as_onboarding_question: false
sql: WITH monthly_sales AS (SELECT p.category, DATE_TRUNC('MONTH', s.date) AS month, SUM(s.sales_amount) AS monthly_sales FROM sales AS s INNER JOIN products AS p ON s.product_id = p.product_id WHERE s.date >= '2025-06-01' AND s.date < '2025-09-01' GROUP BY p.category, DATE_TRUNC('MONTH', s.date)) SELECT category, month, monthly_sales FROM monthly_sales ORDER BY category, month
verified_by: D User
verified_at: 1752091901
| モデル名 | 対象テーブル | AIが理解する内容 |
|---|---|---|
| Marketing | marketing_campaign_metrics |
広告キャンペーンの成果(クリック数や表示回数) |
| Products | products |
商品名やカテゴリなどのマスター情報 |
| Sales | sales |
売上金額や販売数。商品データとの紐付けルール |
| Social Media | social_media |
SNSでの言及数やインフルエンサーの影響力 |
| Support | support_cases |
顧客の問い合わせ内容や、やり取りの書き起こし |
サンプルのYAMLの定義で気になった点として以下に有る様に
CAMPAIGN_NAMEのsynonyms(類義語)定義でLLMの類義語に関する認知能力をフォローできるようです
サンプルでは英語で定義していますが、日本語での精度を高めるのであれば、日本語での定義も入れておいた方が良さそうです
dimensions:
- name: CAMPAIGN_NAME
synonyms:
- ad_campaign
- marketing_campaign
- promo_name
- advertisement_name
- campaign_title
- promotion_name
左メニュー → Catalog>Database Explorerを開く
Databaseを開き、上記でダウンロードしたYAMLファイルをアップロードする
Catalog
└─ Databases
└─ DB_SI_JP
└─ RETAIL
└─ Stages
└─ SEMANTIC_MODELS
エラーが出なければアップロードに成功して以下の画面に遷移する
AI & ML → Cortex Analystに戻る
もし「Please select a YAML file」エラーが出たら、画面上部の「←」ボタンを押下して戻る
YAMLファイルを選択する
ここまで来たのでYAML の取り込みは成功しています。
Cortex AnalystでのLLMデータ分析
ここで、構築した機能を少し試してみます
Cortex Analystで「marketing_campaigns.yaml」を選択した状態で、画面右上の Playground をクリックするとチャット入力欄が表示されます

上記取り込んだYAMLに基づいて質問を入力して実行させます
クリック率が最も高かったマーケティングキャンペーンはどれですか?
ここに出ているSQL文がCortex Analyst が解釈し、裏側で自動生成した SQLとなります。
自然言語からSQLを生成して宜しく分析してくれたと言う訳ですね
SELECT
campaign_name,
SUM(clicks) AS total_clicks,
SUM(impressions) AS total_impressions,
SUM(clicks) / NULLIF(NULLIF(SUM(impressions), 0), 0) AS click_through_rate
FROM
marketing_campaign_metrics
GROUP BY
campaign_name
ORDER BY
click_through_rate DESC NULLS LAST
LIMIT
1
/* Generated by Cortex Analyst (request_id: 8fd99999-9999-999d-a999-xxxxxxxxxxxx) */
なお、公式サイトに記載の通りCortex Analystが使用するモデルは自動でモデルが選択されるようです
Verified Query とは?
Cortex Analystで上述の通りSQLが生成されましたが、保存しておくことで再度、似たような質問が来た際に、保存済みのSQLをLLMが再利用出来るようにする仕組み
上記、「Verified query」ボタンをクリックすると以下のポップアップ画面が表示されます
回答の結果が良いようであれば、「Save and Continue」を押下してAIに正しいSQLとしてAIに覚えさせることが出来る。
生成されたSQL文を人間が修正するのではなく、質問の方を修正する事で、正しいSQL文が生成出来たら、Saveしてあげる仕組みの様です
Cortex Analyst 検証済みクエリリポジトリ(VQR)は、質問とそれに答える SQL クエリのコレクションを提供することで、結果の精度と信頼性を向上させるのに役立ちます。
公式サイトより
Cortex Search(文章検索)
マニュアルや報告書といった非構造の文書データから、知りたい情報の「意味」を汲み取って最適な回答の根拠を見つけ出す機能
従来のような単語の完全一致による検索ではなく、LLMが文脈を理解して関連性の高い記述を抽出するため、社内ナレッジを活用した高精度なAIアシスタント(RAG)の様な感じで構築できる
ここではS3の「SUPPORT_CASES」を基に構築します
手順
左メニューから AI & ML → Search を選択
右上 [Create] をクリック
ウィザード形式の画面になりますので、以下サービス関連項目を設定します
| 項目 | 設定値 |
|---|---|
| Role and warehouse | WH_SI_JP |
| Schema | RETAIL |
| Service name | Support_Cases |
検索対象データを選択します
| 項目 | 設定 |
|---|---|
| Table | SUPPORT_CASES |
検索対象列を設定します
Search columns(検索される本文)として「TRANSCRIPT」を選択します
セマンティック検索のメイン対象となります
Attributes(結果表示用メタ情報)を設定します
TITLE、PRODUCTを選択します
検索結果の「説明文」用です。後で Agent が文脈理解に使います
Include columnsを設定します
ここでは、「Select all」をクリックして全項目を選択状態にします
インデックス設定を行います
CREATEボタンを押下すると以下画面に遷移します
Cortex Searchの検証
Cortex Search 画面を開く
AI & ML → Searchより開くと、作成した Search Serviceの一覧に
「Support_Cases」が表示されている
一覧の「Support_Cases」をクリックして詳細画面を開かれるので右上の「Playground」をクリック
質問を入力すると回答が返ってくる
ここでは「品質に関するクレームはどんな内容が多いですか?」と質問

回答がピックアップされて返ってくるので、実際にプレビュー表示してみると
品質に関してのクレームがピックアップできている事が分かる
表示結果のカスタマイズとして、以下の様に表示列を追加も可能
ここで注目すべきことは
- キーワード完全一致でなくても拾えている
- 言い回しが違っても意味で引っかかっている
- 「それっぽい理由」がちゃんと並んでいる
という従来の機械的なSQLでは抽出できない事を可能としているのがCortex Search の真価ではないかと思う
注意点
Snowflake Trial版の注意
Snowflake Intelligence(チャットUI)は、
Trial では利用不可 です。
Access denied for trial accounts.
が表示されますが、
これは 仕様 です。
まとめ
今回、Cortex Analyst と Cortex Search をそれぞれ構築して動かしてみて感じたのは、Snowflake Intelligence は「SnowflakeのAIが宜しくデータ分析して結果を返してくれる」のではなく、人間がセマンティックモデルなどの作り込みで精度が決まりそうだと思いました
何気にYAMLの synonyms や description の書き方は人間の手による作業が必要そう
Cortex Analyst については、自然言語からSQLを自動生成してくれる点は便利で、生成されたSQLがそのまま見えるのもオープンで良い感じです。
Cortex Search の方は、キーワードの完全一致に頼らず意味で検索できるのが従来のSQL検索との大きな違いでした。サポート問い合わせのような自由記述のテキストに対しては、かなり実用的だと思います。
あと、今回はセットアップ用のサンプルデータ(S3からのCSV取り込み)をそのまま分析対象にしましたが、実際にはdbtなどでのデータ変換をELTで組み込むことを考えなければならないと思いました
全体を通して、Snowflake Intelligence は基盤を整えてあげれば、自然言語での分析できるのが強力だと思いました。

























