こんにちは、喜田です。
SnowVillageのSlackワークスペース内でひっそりと月イチ勉強会が続いている #ai-datacloud チャンネルが有益という話をします。
2025年4月16日、何回目かの #ai-datacloud 勉強会に参加しました。この勉強会は歩くリリースノートこと @toru_data さんが最近のSnowflakeのAI関連のリリースを見ながらその場で試すというスタイルで世界一ゆるくやっているであろうAI勉強会です。最近は世の中のAIの事例もたくさんでてきて一般人もAI想像力がついてきて、でもこの新機能だったらこんな使い方どうかな?と、まだ見ぬAIの使い道みたいなことをあれこれ語ることも多いような感じです。
SnowflakeのCortex AIにマルチモーダルLLMが登場
Xもすっかり盛り上がってますね!
マルチモーダルLLMとは、テキストだけじゃなくて画像、音声、動画・・・様々な入力に対応して応答してくれるタイプのLLMです。今回のリリースでは画像に対応しました。画像を入力に、その画像を読み取って解説してくれたり、Cortexくんへのお願いの仕方によっては画像に関連するキーワードをタグとして返してくれたりします。
さっそく試してみる
まだ日本リージョンでは使えないようなので、北米リージョンで試しました(実はCross-Regionモードでは使える by ひやまさん もこの勉強会で知ることになるのだが。)
マルチモーダルLLMの登場に合わせてか、非構造データをファイルとしてそのままSnowflake上で扱うことができるFILE型とTO_FILE関数などがこのタイミングで追加されています。これも後ほど触れますが、ちょっとだけコツがいります。(マニュアルにそのまま書いてあります。)
-- 内部ステージを作成、サーバーサイドでの暗号化オプションがファイル読み取りには必須!
CREATE OR REPLACE STAGE input_stage
DIRECTORY = ( ENABLE = true )
ENCRYPTION = ( TYPE = 'SNOWFLAKE_SSE' );
-- SnowsightのUIからDB>スキーマ>ステージを選んで画像ファイルを配置
-- あとはステージ名とファイル名を指定してTO_FILEにかけるとFILE型が返る
SELECT to_file('@input_stage','test_pptx.png');
見た目はステージ上のファイルのメタデータのような「FILE型」で返ってきます。
{
"CONTENT_TYPE": "image/png",
"ETAG": "6753841ba060095e087d806fb62d2909",
"LAST_MODIFIED": "Wed, 16 Apr 2025 13:49:31 GMT",
"RELATIVE_PATH": "test_pptx.png",
"SIZE": 955937,
"STAGE": "@MYDB.MYSCHEMA.INPUT_STAGE"
}
あとはCOMPLETE関数の仕様通りに引数として渡すだけ。
SELECT SNOWFLAKE.CORTEX.COMPLETE(
'claude-3-5-sonnet',
'この画像に書かれていることを要約してください',
to_file('@input_stage','test_pptx.png')
-- ここにFILE型を指定するとファイル実態にアクセスしてcompleteのインプットにしてくれる
);
この画像は、「TROCCO ACTION for Snowflake を試してみた」というプレゼンテーションのタイトルスライドです。主なポイントは以下の通りです:
- #p_UG 東京というイベントまたはグループの発表資料のようです
- メインタイトルは「あなたの興味を狙い撃ち!」となっています
- 発表日は2025年4月18日です
- 発表者はエクスチュア株式会社の喜田紘介さんです
- 画面右側にはデータ分析やダッシュボードを示すようなラップトップの画像が配置されています
- これはSnowflakeというデータプラットフォームに関連するTROCCO ACTIONという機能やサービスについての発表資料のようです。
回答編

じつは、今週末に某所のイベントでLTする資料の表紙をスクショにしてました。ちゃんと動いてくれました~~~
新たなデータ型、FILE型について
マルチモーダルLLMの登場、つまり非構造データをよりカジュアルにSnowflake内で扱える時代の到来です。そこに合わせて現れたFILE型、期待大ですよ!!!
上記のようにLLMに直接渡すだけでなく、テーブル作成時に列の型として普通に使えます。
-- テーブル作成時にFILE型の「picture」列を定義
CREATE TABLE test_image (name varchar,picture file);
-- INSERT時、VALUES句が使えなかったので「INSERT SELECT」で書きます。
INSERT INTO test_image
SELECT 'test_pptx',to_file('@input_stage','test_pptx.png');
-- テーブルに格納されるとこんな感じ
SELECT * FROM test_image;
name | picture
-----------+---------------------------------------------------
test_pptx | {
| "CONTENT_TYPE": "image/png",
| "ETAG": "6753841ba060095e087d806fb62d2909",
| "LAST_MODIFIED": "Wed, 16 Apr 2025 13:49:31 GMT",
| "RELATIVE_PATH": "test_pptx.png",
| "SIZE": 955937,
| "STAGE": "@MYDB.MYSCHEMA.INPUT_STAGE"
| }
これで何ができるかというと・・・
-- 複数画像をどんどんテーブルにINSERTしていきます。
INSERT INTO test_image SELECT 'test2',to_file('@input_stage','test2.png');
INSERT INTO test_image SELECT 'test3',to_file('@input_stage','test3.png');
-- テーブルに格納されるとこんな感じ
SELECT * FROM test_image;
name | picture
-----------+---------------------------------------------------
test_pptx | { "CONTENT_TYPE": "image/png", ・・・
test2 | { "CONTENT_TYPE": "image/png", ・・・
test3 | { "CONTENT_TYPE": "image/png", ・・・
こうしてユーザーテーブルから直接読める非構造データが実現できました!ということは、これをSELECT文で一括で解析したり、タグ付けしてユーザー属性のように扱ったり。
Before:ステージ上の画像を元に機械学習などなんらかの方法で「狙った要素」に絞って解析して取り出す。業務テーブルには「意味のある情報として得られたものだけ」文字列やフラグ列で取り込む
After:画像そのものが業務テーブル上にあって、その場その場で「必要に応じた意味」を取り出せる
え、これってすごくない???
今までってどうだっけ。ディレクトリテーブルからURLsで拾ってくるとか?(机上でお勉強はしてるもののあんまやったことない・・・)Snowflakeは「非構造データも扱えるよ」と言ってきましたが、どうしてもステージ上のファイルURLsにPythonのコードでアクセスしにいくイメージが強くて、SQL過激派の自分としてはどうにもハードルが高かったのですが、ついについに・・・!感涙!
例えばユーザープロフィールと写真がテーブル内の同じ行にあって、背景、服装、家族・ペット・・・いろんな要素でその場で必要な分類をして、いままで業務上は特に注視してこなかった「ペット有」みたいな属性を思いついたタイミングで新たに付けられますね。(ETLとELTの違いとか、RAWデータをデータ基盤に残しておこうの思想に近いものを感じる。)
(追記)
BigQueryも同じ感じのObject Refデータ型をリリースしていた模様 @Next25’
https://zenn.dev/cloud_ace/articles/google-cloud-next25-bq
テーブルに格納した画像を一括completeしちゃう
SELECT SNOWFLAKE.CORTEX.COMPLETE(
'claude-3-5-sonnet',
'この画像につけるハッシュタグを決めてください',
picture -- FILE型の列
)
FROM test_image;
きたこれーーーー!
どシンプルなSELECT文の顔をしてLLMが動く。マルチモーダル動いてるよ!!!

(画像は同じものを名前だけ変えて3枚登録したので、ほぼ同じ回答が生成されてます。)
completeの回答を整形するテクニック
上記の回答は画像をインプットに意図にマッチしたタグを生成してくれて大変ご満悦なのですが、complete関数の回答はデフォルトでは人がしゃべる回答のように、ご丁寧な前後の説明文章がついてきます。
報告書に箇条書きだけ書くな!文章で書け!その箇条書きは何を挙げたものなんや!文章で書け!
と言って育てられたものです。complete・・・できるビジネスマンですね。
でもこうすれば欲しい答えだけ取り出しやすくなります。
SELECT SNOWFLAKE.CORTEX.COMPLETE('claude-3-5-sonnet',
'この画像につけるハッシュタグを決めてください。
回答は以下の形にしてください。
''tags'': {
''type'': ''array''}',
picture)
FROM test_image;

ひやまさん一押しのStructured Outputsにヒントを得たお願いの仕方。JSONの’’をエスケープするため””にしているところはご注意ください。
#ai-datacloud 勉強会はいいぞ
SnowflakeのマニュアルやQuickStartは、無勉で触り始められる気軽さでありながら、一定のやった感を得られる大変良い仕上がりになっています。それをみんなとわいわいやって、いつのまにか一歩進んだ解法、一歩進んだユースケースの議論になっていて、今日第一歩を踏み出した人がすごくクリアに機能を理解できていくような会になっています。
今年ももうサミットまで2カ月を切り、また新たなAIやデータ基盤のトレンドが塗り替えられていくものと思います。ネタが大量投入されたらこの勉強会ももっと盛り上がっちゃうかもね~という話をしていますので、SnowflakeのAI、そして製品問わずAIのいろんな観点までキャッチアップしていきたい方はぜひご参加ください~。