1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflake Intelligence入門:セマンティックモデルで実現する、LLMを活用した自然言語データ分析

1
Last updated at Posted at 2026-04-23

概要

データ分析を行えるクラウドサービスとして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_admin
WH_SI_JP
AIを動かすための「権限」と「パワー」
データの保管庫 データベース / スキーマ / テーブル DB_SI_JP.RETAIL
sales, products など計5テーブル
AIが分析するための「知識(データ)」
知能の設定場所 ステージ / スキーマ semantic_models
snowflake_intelligence.agents
データの意味をAIに教える「説明書の置き場」
アクション機能 メール連携 / プロシージャ email_integration
send_email
分析後にメールを送るなどの「行動手段」

ここでは「AIを安全に動かすための専用環境」を用意しています。
尚、本setup.sqlではS3から取り込んだStagingテーブルを分析対象としているけど、実際にはdbtで整形したMartデータを分析対象とする必要が有ると理解

Snowflake の Worksheet で SQL を実行

image.png

実行後、ロールを「SNOWFLAKE_INTELLIGENCE_ADMIN」に切り替え

image.png

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を開く

image.png

Databaseを開き、上記でダウンロードしたYAMLファイルをアップロードする

Catalog
 └─ Databases
    └─ DB_SI_JP
       └─ RETAIL
          └─ Stages
             └─ SEMANTIC_MODELS

image.png

エラーが出なければアップロードに成功して以下の画面に遷移する

image.png

AI & ML → Cortex Analystに戻る

image.png

もし「Please select a YAML file」エラーが出たら、画面上部の「←」ボタンを押下して戻る

image.png

YAMLファイルを選択する

image.png

ここまで来たのでYAML の取り込みは成功しています。

image.png

Cortex AnalystでのLLMデータ分析

ここで、構築した機能を少し試してみます

Cortex Analystで「marketing_campaigns.yaml」を選択した状態で、画面右上の Playground をクリックするとチャット入力欄が表示されます
image.png

上記取り込んだYAMLに基づいて質問を入力して実行させます

クリック率が最も高かったマーケティングキャンペーンはどれですか?

image.png

ここに出ている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が再利用出来るようにする仕組み

image.png

上記、「Verified query」ボタンをクリックすると以下のポップアップ画面が表示されます

image.png

回答の結果が良いようであれば、「Save and Continue」を押下してAIに正しいSQLとしてAIに覚えさせることが出来る。

生成されたSQL文を人間が修正するのではなく、質問の方を修正する事で、正しいSQL文が生成出来たら、Saveしてあげる仕組みの様です

Cortex Analyst 検証済みクエリリポジトリ(VQR)は、質問とそれに答える SQL クエリのコレクションを提供することで、結果の精度と信頼性を向上させるのに役立ちます。

公式サイトより

Cortex Search(文章検索)

マニュアルや報告書といった非構造の文書データから、知りたい情報の「意味」を汲み取って最適な回答の根拠を見つけ出す機能
従来のような単語の完全一致による検索ではなく、LLMが文脈を理解して関連性の高い記述を抽出するため、社内ナレッジを活用した高精度なAIアシスタント(RAG)の様な感じで構築できる

ここではS3の「SUPPORT_CASES」を基に構築します

手順

左メニューから AI & ML → Search を選択

image.png

右上 [Create] をクリック

image.png

ウィザード形式の画面になりますので、以下サービス関連項目を設定します

項目 設定値
Role and warehouse WH_SI_JP
Schema RETAIL
Service name Support_Cases

image.png

検索対象データを選択します

項目 設定
Table SUPPORT_CASES

image.png

検索対象列を設定します

Search columns(検索される本文)として「TRANSCRIPT」を選択します
セマンティック検索のメイン対象となります

image.png

Attributes(結果表示用メタ情報)を設定します

TITLE、PRODUCTを選択します

検索結果の「説明文」用です。後で Agent が文脈理解に使います

image.png

Include columnsを設定します

ここでは、「Select all」をクリックして全項目を選択状態にします

image.png

インデックス設定を行います

ここではデフォルトのままとします
image.png

CREATEボタンを押下すると以下画面に遷移します

image.png

Cortex Searchの検証

Cortex Search 画面を開く

AI & ML → Searchより開くと、作成した Search Serviceの一覧に

「Support_Cases」が表示されている

image.png

一覧の「Support_Cases」をクリックして詳細画面を開かれるので右上の「Playground」をクリック

image.png

質問を入力すると回答が返ってくる

ここでは「品質に関するクレームはどんな内容が多いですか?」と質問
image.png

回答がピックアップされて返ってくるので、実際にプレビュー表示してみると

品質に関してのクレームがピックアップできている事が分かる

image.png

表示結果のカスタマイズとして、以下の様に表示列を追加も可能

image.png

ここで注目すべきことは

  • キーワード完全一致でなくても拾えている
  • 言い回しが違っても意味で引っかかっている
  • 「それっぽい理由」がちゃんと並んでいる
    という従来の機械的なSQLでは抽出できない事を可能としているのがCortex Search の真価ではないかと思う

注意点

Snowflake Trial版の注意

Snowflake Intelligence(チャットUI)は、
Trial では利用不可 です。

Access denied for trial accounts.

が表示されますが、
これは 仕様 です。

image.png

まとめ

今回、Cortex Analyst と Cortex Search をそれぞれ構築して動かしてみて感じたのは、Snowflake Intelligence は「SnowflakeのAIが宜しくデータ分析して結果を返してくれる」のではなく、人間がセマンティックモデルなどの作り込みで精度が決まりそうだと思いました
何気にYAMLの synonyms や description の書き方は人間の手による作業が必要そう

Cortex Analyst については、自然言語からSQLを自動生成してくれる点は便利で、生成されたSQLがそのまま見えるのもオープンで良い感じです。

Cortex Search の方は、キーワードの完全一致に頼らず意味で検索できるのが従来のSQL検索との大きな違いでした。サポート問い合わせのような自由記述のテキストに対しては、かなり実用的だと思います。

あと、今回はセットアップ用のサンプルデータ(S3からのCSV取り込み)をそのまま分析対象にしましたが、実際にはdbtなどでのデータ変換をELTで組み込むことを考えなければならないと思いました

全体を通して、Snowflake Intelligence は基盤を整えてあげれば、自然言語での分析できるのが強力だと思いました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?