❄️

第5回Snowflake Rookies Camp ~Rookies Camp Demoの振り返り〜

に公開

Snowflake Rookies Camp 幹事メンバーのhueです。
この記事は2025年10月31日に開催した
「第5回Snowflake Rookies Camp ~Rookies Camp Demoの振り返り〜」のコードの紹介となります。

Rookies Camp Demo

今回のイベントでは、先日開催されたSnowflake World Tour Tokyoで実施したCortex AnalystとStreamlitを用いたチャットボット構築のハンズオンとなります!
実際のコードについてはこちらのブログで紹介していますので、ぜひ併せてご覧ください!

SnowflakeのAI「Cortexシリーズ」とは

SnowflakeはAI Data Cloud として、データの統合・加工・共有・分析を一体的に行えるプラットフォームになっています。

その中でも Cortexシリーズ は、AIを活用した自然言語による検索・分析を実現する機能群です。

Cortexシリーズの主な機能

名称 概要 主な対象データ
Cortex Search テキストやドキュメントなど非構造化データを検索できるAI。ベクトル検索×キーワード検索のハイブリッド型。 非構造化データ(PDF・テキストなど)
Cortex Analyst 構造化データを自然言語で分析するAI。自然言語→SQL変換→結果表示を自動で行う。 構造化データ(テーブル・ビューなど)
Snowflake Intelligence SearchとAnalystを統合し、対話型でSnowflake全体を操作する次世代インターフェース。 構造化+非構造化データ

SearchとAnalystは、それぞれ目的が異なるものの、組み合わせることで「検索→分析」の自然な会話体験を実現できます。

今回の構成:検索基盤と会話アプリの役割分担

以下の4ステップでチャットボットを構築しました。

  • 各種オブジェクトの準備(データベース、スキーマ、ウェアハウス、ステージ、テーブル)
  • オブジェクト使用権限割当
  • データアップロード
  • Cortex Searchの作成
  • Streamlit in Snowflake(SiS)アプリのデプロイ

これらの中で、

  • Cortex Searchは SQLで構築し、検索対象データをSnowflake内に登録する基盤部分。
    「どのテーブルの、どのカラムを検索できるか」をSQLで定義し、意味検索やベクトル検索を可能にします。
    この設定によって、アプリがSnowflake内のデータを効率的に検索できるようになります。

  • Cortex Analystの呼び出しは SiS(Streamlit in Snowflake)のPythonで実装。
    ユーザーの質問を自然言語で受け取り、内部的にCortex Analyst APIを呼び出してSQLを生成・実行します。
    結果はそのままチャット画面に返され、Snowflake内で完結する対話型の分析体験を実現しています。

という役割分担になっています。

Cortex Search(検索基盤)

Cortex SearchはSQLコマンドで作成します:

CREATE OR REPLACE CORTEX SEARCH SERVICE product_line_search_service 
ON WAREHOUSE compute_wh
TARGET_TABLE cortex_analyst_demo.revenue_timeseries.product_dim
QUERY_COLUMN product_line;

これは、検索対象となるテーブルや列をSnowflake内に登録し、AIが「どのテキストを検索できるか」 を定義する仕組みです。

Streamlitアプリからこのサービスを呼び出すことで、「製品ライン名」などの曖昧検索が可能になります。

Cortex Analyst(会話アプリ)

Streamlit in Snowflake (SiS) のPythonアプリが担当。
アプリでは、ユーザーの質問を取得し、内部的にCortex Analyst APIへ送信します。

response = requests.post(
    "https://<account>.snowflakecomputing.com/api/v2/cortex/analyst/message",
    headers={"Authorization": f"Bearer {token}"},
    json={"semantic_model": "revenue_timeseries.yaml", "message": user_input}
)

Cortex AnalystはYAMLで定義されたSemantic Modelをもとに、Snowflake内のデータを分析します。

自然言語の質問(例:「商品の一覧を教えて!」)をSQLに変換し、結果を返す流れです。

Semantic Model(YAML)の役割

Cortex Analystが正しく動作するためには、Semantic Model(セマンティックモデル) の定義が欠かせません。
これは AIがどのテーブル・カラム・指標を使ってよいか を教える「辞書」のようなものです。

例えば、今回のrevenue_timeseries.yamlの一部では以下のように定義されています。

measures:
  - name: daily_revenue
    expr: revenue
    description: total revenue for the given day
    synonyms: ["sales", "income"]
    default_aggregation: sum
    data_type: number

この設定により:

revenue 列は
・「sales」「income」といった言葉でも理解される
・集計方法はsum(合計)である
・データ型は数値
といった情報をAIが理解できます。

つまり、Semantic ModelはCortex Analystの「知識ベース」であり、外部情報には依存せず、Snowflake内のデータのみで回答を生成します。

参照データとリレーションシップ

yaml内の relationships セクションでは、テーブル同士の結合関係を定義しています。

relationships:
  - name: revenue_to_product
    left_table: daily_revenue
    right_table: product
    relationship_columns:
      - left_column: product_id
        right_column: PRODUCT_ID
    join_type: left_outer
    relationship_type: many_to_one

  - name: revenue_to_region
    left_table: daily_revenue
    right_table: region
    relationship_columns:
      - left_column: region_id
        right_column: REGION_ID
    join_type: left_outer
    relationship_type: many_to_one

上記の記述で
daily_revenue(売上の明細テーブル)は、

  • product_id をキーにして product(製品ディメンション) と結合。
  • region_id をキーにして region(地域ディメンション) と結合。
    を表現しています。絵にすると↓

この構造をもとに、Cortex Analystは自然言語から自動的にJOIN構文を組み立ててSQLを生成します。

内容の意味

要素 説明
name リレーションの論理名。ログなどで識別される名前
left_table 結合の「左側」になるテーブル(主にファクトテーブル)。ここでは daily_revenue
right_table 結合の「右側」になるテーブル(ディメンション)。ここでは product または region
relationship_columns 実際に結合するキー列を指定。left_columnright_column のペアで定義。
join_type SQLで使う結合タイプ。ここでは left_outer(売上を軸に、ディメンションを補完)
relationship_type 結合の論理関係。ここでは many_to_one(多対一)

Streamlit In Snowflake (SiS)について

💡 Cortex Analyst呼び出しの3つのポイント

今回のStreamlit in Snowflake(SiS)アプリでは、ユーザーの質問をCortex Analystに渡して自然言語でデータ分析を行う仕組みを構築しています。
その中でも、理解しておきたい重要なポイントを3つ紹介します。

① Semantic Model(YAML)を指定してAPIを呼び出す

(実装箇所:get_analyst_response() 関数)

Cortex Analyst APIを呼び出す際、
どの Semantic Model(YAML) を使うかを semantic_model_file パラメータで明示しています。

request_body = {
    "messages": messages,
    "semantic_model_file": f"@{st.session_state.selected_semantic_model_path}",
}
resp = _snowflake.send_snow_api_request("POST", API_ENDPOINT, {}, {}, request_body, None, API_TIMEOUT)

ここで指定しているsemantic_model_fileがYAML形式の定義ファイルです。
AIはこのYAMLに書かれたテーブル構造や指標、同義語などをもとにSQLを生成します。

また、ユーザーが日本語で質問した場合でも正しく応答できるよう、
process_user_inputという
「(日本語で回答してください)」という指示を自動的にメッセージに追加しています。

② Verified Query(検証済みクエリ)をUIで可視化

(実装箇所:display_sql_confidence() 関数)

Cortex Analystが生成するSQLには、「Verified Query Repository」で事前に検証されたクエリ情報が付与されます。
このアプリではそれを 「検証済クエリ情報」 としてUI上で確認できるようにしています。

verified = confidence["verified_query_used"]
st.text(f"名称: {verified['name']}")
st.text(f"質問: {verified['question']}")
st.text(f"検証者: {verified['verified_by']}")

これにより、

  • どの質問をベースに生成されたSQLなのか
  • 誰が検証したのか
    を一目で確認できます。

③ Snowflake内でSQLを実行し、即座に可視化

(実装箇所:display_sql_query() 関数 + get_query_exec_result() 関数)

Cortex Analystの返したSQLは、Snowflake内で直接実行され、結果が即座にStreamlit上に表示されます。

@st.cache_data(show_spinner=False)
def get_query_exec_result(query: str) -> Tuple[Optional[pd.DataFrame], Optional[str]]:
    df = session.sql(query).to_pandas()
    return df, None
def display_sql_query(sql: str, message_index: int, confidence: dict, request_id: str):
    with st.expander("SQLの実行結果", expanded=True):
        df, err_msg = get_query_exec_result(sql)
        if df is not None:
            st.dataframe(df)

この実行結果を、Streamlitで以下のように表示しています。

  • 「📄データ」タブ:テーブル形式で結果を確認
  • 「📊グラフ」タブ:Pythonのグラフ作成ライブラリである Altair を使用し、折れ線グラフや棒グラフなどを選択して可視化

また、SQL内に日本語エイリアスがある場合はquote_japanese_aliases() 関数で自動でクォート補正し、
実行エラーを防ぐ工夫もされています。

以上により、「質問 → SQL生成 → 実行 → 可視化ク」 の一連の流れがSnowflake内で完結します。

まとめ:Snowflakeの中で“データと会話する”体験を

今回紹介した仕組みでは、Snowflakeの中だけでAIによる検索と分析を完結させることができます。

  • Cortex Search で検索対象となるデータをSQLで登録し、意味検索やテキスト探索の基盤を構築。

  • Cortex Analyst を Streamlit in Snowflake(SiS) のPythonアプリから呼び出し、自然言語での質問をSQLに変換して実行。

  • Semantic Model(YAML) で「どのデータをどのように扱うか」を定義し、AIが理解できるデータ構造を提供。

この3つを組み合わせて今回はSnowflakeに話しかけるだけで「Snowflakeに話しかけるだけで分析できる」新しい体験を実現できます!

ぜひCortex AnalystとCortex Searchを触ってみてください。
「SQLを書かなくても、Snowflakeと会話できる」その感覚を、ぜひ体験してみてほしいです。

Discussion