【Snowflake】Cortex AnalystとCortex Agents(Snowflake Intelligence)を比較してみた
はじめに
mizuhoです。
少し前の話になりますが、Snowflake intelligenceがパブリックプレビューとなりましたね。truestar社内でも各メンバー色々触って使い勝手や使い所を確認しているところで。その中で、Cortex Analyst単体で使うのとCortex Agentsを構築してSnowflake intelligenceで使用するのとで、結構挙動が異なるのでご紹介したいと思います。
Cortex Analystとは
まずは各機能について簡単にご紹介します。Cortex Analystとは、Snowflake上の構造化データを活用して、分析業務を効率化するためのツールです。セマンティックモデルやセマンティックビューを活用することで、データの意味や関係性を保ちながら、分析者が価値あるインサイトを素早く得られるように設計されています。
セマンティックモデルとセマンティックビュー
Cortex Analystが動くのに欠かせないのがセマンティックレイヤーの存在です。Snowflakeではセマンティックレイヤーの設定方法は2種類あります。それが、セマンティックモデルとセマンティックビューです。両者の違いは改めて詳しく紹介しますが、簡単に言うとymlファイルをアップロードして作るのがセマンティックモデル、Snowflake上のUIから作成できるのがセマンティックビューです。
セマンティックビューは今年のSnowflake Summitで発表されており、truestarはローンチパートナーとして紹介されました。詳しくはこちらの記事をご覧ください。
Cortex Agents(Snowflake intelligence)とは
次に、Cortex AgentsとSnowflake intelligenceについて簡単にご紹介します。
Cortex Agentsは、Snowflake が提供する「エージェント」機能で、ユーザーからの自然言語リクエストを理解し、必要に応じてタスクを分解・計画し、適切なツール(例:Cortex AnalystでのSQL生成や、Cortex Searchによる非構造化データ検索)に振り分けて実行・回答までをオーケストレーションします。Cortex AnalystやCortex Searchといった個別機能をつなぎ合わせて、最適なルートを選び、”一連のやりとりを完結させる「頭脳」” の役割を担います。
ちなみに、Cortex Searchについては今回詳しく触れませんが、非構造化データに対してデータ探索できるSnowflakeの機能です。詳しくはこちらのブログをご覧ください。
このCortex Agentsを動かすための箱として準備されているのがSnowflake intelligenceです。専用のインターフェイスで、チャットボット形式でCortex Agentsを簡単に動かすことが可能です。
Cortex Analystを日本語で使ってみる
先に述べたように、Cortex Analystを使うにはセマンティックレイヤーの準備が必須です。Semantic ViewがリリースされUIからでも設定可能になったことによって、格段に設定作業は楽になりました。ですが、Cortex Analystのエンジンは日本語にあまり強くない、といった注意点があります。truestarが展開しているPODBのデータを使って確かめてみましょう。
PODBとは
PODBは、truestarが提供する「収集・加工不要ですぐに使えるオープンデータ」サービスです。
e-Statや国土数値情報などの公的なオープンデータを、Snowflake マーケットプレイス上で即座に分析できる形に整形・無償提供しています。今回は、この中でも一番ユーザーの多いカレンダーデータを使っていこうと思います。
PODBは英語カラムVer.と日本語カラムVer.のビューをそれぞれ準備しており、そのうち英語カラムについてはセマンティックビューも一緒に共有しています。つまり、データ利用者は共有されたデータを使って、即Cortex Analystを使うことができちゃうんです。
英語カラムのセマンティックビュー
まずはPODBにすでに準備されている英語カラムのセマンティックビューを使ってCortex Analystを動かしてみます。「2026年の祝日は何日あるの?」と簡単な質問を投げかけてみると…
"IS_HOLIDAY = TRUE"カラムをカウントして18日、と正確な回答を得ることができます。
日本語カラムのセマンティックビュー
次に、日本語カラムにセマンティックビューを準備してCortex Analystを動かしてみましょう。セマンティックビューは直接的に日本語カラムを扱うことができないため、このようなハッシュ値でカラム名が充てられます。
今回は、敢えてこのビューに手を加えることなくこのままCortex Analystを使ってみます。
先程と同様の問い合わせをしてみましょう。
答えは"2日"と誤った回答が返ってきてしまいました。クエリを確認してみると、どうやら"振替休日"カラムを"祝日"としてカウントしてしまっていることがわかります。
Cortex Agentsで動かしてみる
今度は、先程の日本語カラムのCortex AnalystをCortex Agentsで動かしてみます。ここではCortex Agnetsの具体的な設定方法は割愛するので、設定方法から知りたい方はぜひこちらのブログを参照いただければと思います。
Cortex Analystで動かすエンジンは選択することができず、日本語にちょっと弱い節があるのですが、Cortex Agentsは、オーケストレーションでResponse Modelを設定することができます。ここではGPTやClaudeといった心強いモデルを選択することが可能で、Cortex Analyst単体で使うよりも賢く、そして日本語に強く動いてくれます。今回はGPT-5をモデルとして設定しました。
早速先ほどと同じ質問を投げかけてみます。ちょっと長いのですが、Cortex Agentsの処理を追ってみたいと思います。
Cortex Agentsの処理
Planning the next steps
ユーザーは2026年の祝日の数について質問している。これは日本のカレンダーデータに関する質問のようだ。利用可能なツールを確認すると、CALENDAR_Jという日本語カラムで作られた日本のカレンダーデータのセマンティックモデルがある。
この質問に答えるために、CALENDAR_Jツールを使用して2026年の祝日の数を取得する必要がある。パラメータを設定する:
- query: "2026年の祝日は何日あるの?" または "2026年の祝日の数"
- previous_related_tool_result_id: "" (前回の関連する結果はない)
- check_metric_distribution: 祝日の分布を確認するため
- check_missing_data: 2026年のデータが完全にあるかチェックするため
- has_time_column: カレンダーデータなので時間カラムがあるはず
- queried_time_period: 2026年全体をカバーする期間を指定
WITH __j_japan_calendar AS (
SELECT
"振替休日" AS column_8513f1f3_c29e_4743_9d56_9df90213677b,
"日付" AS column_6686a595_ed99_40db_b175_539d37146261
FROM prepper_open_data_bank__japanese_calendar_data.j_podb.j_japan_calendar
)
SELECT
COUNT(*) AS holiday_count
FROM __j_japan_calendar
WHERE
DATE_PART('YEAR', column_6686a595_ed99_40db_b175_539d37146261) = 2026
AND column_8513f1f3_c29e_4743_9d56_9df90213677b = TRUE
-- Generated by Cortex Analyst
;
Cortex Analystと同じく、振替休日を祝日と勘違いして処理していますね。しかし今回は続きがあります。
Planning the next steps
結果を見ると、2026年の祝日は2日となっている。これは少し少ないように思える。日本の祝日は通常年間15-16日程度あるはずだ。
この結果が正確かどうか確認するために、もう少し詳細な分析を行う必要がある。セマンティックモデルの詳細を確認して、どのようなデータが含まれているかを理解したい。 2026年の祝日が2日という結果が予想より少ないため、セマンティックモデルの詳細を確認して、祝日データの定義や構造を理解する必要がある
Planning the next steps
セマンティックモデルを確認すると、「振替休日」と「祝日」が別々のカラムとして定義されていることがわかった。最初のクエリでは「振替休日」のみをカウントしていたが、実際には「祝日」カラムを使用すべきだった。
「祝日」カラム(COLUMN_AE2492BA_AD50_4A2C_A4B4_3B0FA305DEA5)の説明には「出典:内閣府 国民の祝日」とあり、これが正しい祝日データのようだ。
再度クエリを実行して、2026年の祝日の正確な数を取得する必要がある。
Planning the next steps
ツールから、祝日名のカラムがないという説明があったが、セマンティックモデルを見ると「祝日名」カラム(COLUMN_E6FCC8D3_F6F3_48F5_9AF0_9DBF37713860)が存在している。祝日名は必要ないので、祝日の数だけを取得するクエリを再実行してみる。
Planning the next steps
ツールが祝日カラムの特定に困っているようだ。セマンティックモデルから、COLUMN_AE2492BA_AD50_4A2C_A4B4_3B0FA305DEA5が「祝日」で「出典:内閣府 国民の祝日」となっているので、これが正しい祝日カラムだ。明確にこのカラムを指定してクエリを実行してみる。
WITH __j_japan_calendar AS (
SELECT
"振替休日" AS column_8513f1f3_c29e_4743_9d56_9df90213677b,
"日付" AS column_6686a595_ed99_40db_b175_539d37146261
FROM prepper_open_data_bank__japanese_calendar_data.j_podb.j_japan_calendar
)
SELECT
COUNT(*) AS total_holidays
FROM __j_japan_calendar
WHERE
DATE_PART('YEAR', column_6686a595_ed99_40db_b175_539d37146261) = 2026
AND column_8513f1f3_c29e_4743_9d56_9df90213677b = TRUE
-- Generated by Cortex Analyst
;
Planning the next steps
まだ「振替休日」カラムを使用している。セマンティックモデルで確認したところ、「祝日」カラムは COLUMN_AE2492BA_AD50_4A2C_A4B4_3B0FA305DEA5 で、「振替休日」カラムは COLUMN_8513F1F3_C29E_4743_9D56_9DF90213677B だった。
より具体的に「祝日」カラムを指定して、振替休日ではなく祝日そのものをカウントするように指示する必要がある。
WITH __j_japan_calendar AS (
SELECT
"振替休日" AS column_8513f1f3_c29e_4743_9d56_9df90213677b,
"日付" AS column_6686a595_ed99_40db_b175_539d37146261
FROM prepper_open_data_bank__japanese_calendar_data.j_podb.j_japan_calendar
)
SELECT
COUNT(*) AS total_holidays
FROM __j_japan_calendar
WHERE
DATE_PART('YEAR', column_6686a595_ed99_40db_b175_539d37146261) = 2026
AND column_8513f1f3_c29e_4743_9d56_9df90213677b = TRUE
-- Generated by Cortex Analyst
;
Planning the next steps
まだ同じ結果が出ている。ツールが「振替休日」カラムを使い続けている。データの可用性を確認するために、2026年のデータがどの程度含まれているかを確認してみる必要がある。また、利用可能なすべての祝日関連カラムを確認してみる。
WITH __j_japan_calendar AS (
SELECT
"振替休日" AS column_8513f1f3_c29e_4743_9d56_9df90213677b,
"土日祝" AS column_8dfcee6e_82f0_4b62_a52c_69e4bca10dbb,
"祝日" AS column_ae2492ba_ad50_4a2c_a4b4_3b0fa305dea5,
"日付" AS column_6686a595_ed99_40db_b175_539d37146261
FROM prepper_open_data_bank__japanese_calendar_data.j_podb.j_japan_calendar
)
SELECT
MIN(column_6686a595_ed99_40db_b175_539d37146261) AS start_date,
MAX(column_6686a595_ed99_40db_b175_539d37146261) AS end_date,
COUNT(*) AS total_records,
SUM(CASE WHEN column_8513f1f3_c29e_4743_9d56_9df90213677b = TRUE THEN 1 ELSE 0 END) AS national_holidays,
SUM(CASE WHEN column_ae2492ba_ad50_4a2c_a4b4_3b0fa305dea5 = TRUE THEN 1 ELSE 0 END) AS substitute_holidays,
SUM(CASE WHEN column_8dfcee6e_82f0_4b62_a52c_69e4bca10dbb = TRUE THEN 1 ELSE 0 END) AS weekends_and_holidays
FROM __j_japan_calendar
WHERE
DATE_PART('YEAR', column_6686a595_ed99_40db_b175_539d37146261) = 2026
-- Generated by Cortex Analyst
;
- Planning the next steps
素晴らしい!今度は正しい結果が得られた。SQLの結果を見ると:
- 2026年のデータは完全にある(1月1日から12月31日まで、365日)
- NATIONAL_HOLIDAYS(振替休日): 2日
- SUBSTITUTE_HOLIDAYS(祝日): 18日
- WEEKENDS_AND_HOLIDAYS(土日祝): 121日
SQLのラベルが混乱していたようだが、実際の結果から、2026年の祝日は18日であることがわかる。これは日本の年間祝日数として妥当な数字だ。
ユーザーの質問「2026年の祝日は何日あるの?」に対する答えは18日である。
2026年の祝日は18日あります。
この結果は内閣府の国民の祝日データに基づいており、2026年1月1日から12月31日までの365日分のデータが完全に含まれていることを確認済みです。
というわけで、ちょっと時間は要しましたがちゃんと自力で正しい回答「18日」を導き出すことができました!さすがGPTくん!頼りになりますね。
Agentsは賢い!されど…
こんな感じでとても頼もしいCortex Agents。こんなに頑張ってくれるならもうセマンティックビューはそこそこに、Agentsに頑張ってもらえばいいじゃないか!って思いたくなりますが、それには落とし穴もあるので要注意です。
上記の問い合わせを行った際のCortex Analystの履歴がこちら。
たった1つの問い合わせに対し、6回もクエリを実行してるんですね。つまりそれだけ"ウェアハウスが動いてる = クレジットを消費している"ということです。最初のCortex Analystの問い合わせは当然クエリは1回しか発行されていないので、これだけ見ても6倍の費用がかかっていることがわかります。実際は、モデルのトークン代もかかってくるはずなのでさらにコストは嵩んでいるはず…。
やっぱりセマンティックビューは大事
Cortex Agentsは非常に賢く、単体のCortex Analystでは誤答してしまうような日本語カラムのデータでも、自力で正解にたどり着けちゃいます。Cortex Analystの日本語力に物足りなさを感じていた身としては、このパワー自体はめちゃめちゃ嬉しい。しかしその一方で、単純なCortex Analystの利用よりもコストがかかるという現実も見えました。(そりゃそうなんですが…)
結局、Cortex Agentsに「丸投げ」するんじゃなくて、しっかりセマンティックビューやセマンティックモデルを整備してあげることこそが、効率的で正確、かつコスパの良い分析体験への近道だと痛感しました。
まとめ
今回はCortex AnalystとCortex Agents(Snowflake intelligence)の日本語力の違いを比較してみました。この記事がどなたかのお役に立てたら幸いです!
今後もSnowflake・Cortex周りの機能について随時発信していくので、ぜひチェックしてみてください!