第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_column と right_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