SnowflakeでAI_COMPLETE関数を用いて画像ファイルを構造化データに変換してみた

SnowflakeでAI_COMPLETE関数を用いて画像ファイルを構造化データに変換してみた

2025.12.05

かわばたです。

本ブログはClassmethod SaaSで加速するゲーム開発 Advent Calendar 2025の5日目のブログとなります!
他のブログも合わせてご覧ください。

https://dev.classmethod.jp/referencecat/gamesol-businesssol-advent-calendar-2025/

2025年11月21日にAI_COMPLETE関数がGAとなりました。
今回はAI_COMPLETE関数を用いて、画像ファイルを構造化データに変換していきたいと思います。

【公式ドキュメント】
https://docs.snowflake.com/en/sql-reference/functions/ai_complete

対象読者

  • 画像ファイルを構造化データに変換して分析することに興味のある方
  • AI_COMPLETE関数について確認したい方

検証環境と事前準備

検証環境

  • Snowflake トライアルアカウント Enterprise版

事前準備

各種データベース等作成します。

-- 自分のデータベース・スキーマを作成
CREATE DATABASE IF NOT EXISTS COMPLETE;
CREATE SCHEMA IF NOT EXISTS COMPLETE.test;

-- 今回使用する画像・動画を格納するステージを作成
CREATE OR REPLACE STAGE frames_stage
    ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE')
    DIRECTORY = (ENABLE = TRUE);

-- 米国など他リージョンのモデル利用を許可する
ALTER ACCOUNT SET CORTEX_ENABLED_CROSS_REGION = 'AWS_US';

claude-3-5-sonnetなど別のモデルを使用したい場合は、クロスリージョン推論を行う必要があります。
ただし、クロスリージョン推論を行うということは、データが一時的に契約リージョン外に転送されることを意味します。 自社内で確認の上利用することを推奨します。

https://docs.snowflake.com/ja/user-guide/snowflake-cortex/cross-region-inference


くらにゃんの画像データを作成したステージにアップロードし使用していきます。
(かわいい...)
くらにゃん1
くらにゃん2
くらにゃん3

2025-11-30_20h49_45

AI_COMPLETE関数について

AI_COMPLETEは、Snowflake上で大規模言語モデル(LLM)を使用して、入力に対する応答(補完)を生成する関数です。 その中でPrompt Object(プロンプトオブジェクト)を引数に取るこの形式は、テキストと画像を組み合わせたマルチモーダル処理などに使用されます。

【参考ブログ】
https://zenn.dev/tsubasa_tech/articles/167f2c3826dc02

実際に試してみた

事前準備した画像ファイルに対して、AI_COMPLETE関数を用いて構造化してみます。

SELECT SNOWFLAKE.CORTEX.COMPLETE('claude-3-5-sonnet',
    'この画像に描かれているキャラクターの特徴(種類、色、表情)をJSON形式で抽出してください。',
    TO_FILE('@frames_stage', 'くらにゃん1.png'));

JSON形式で出力することができました。
2025-11-30_20h56_06

{
    "character": {
        "type": "猫",
        "colors": {
            "main": ["白", "黄色", "黒"],
            "accent": {
                "耳": "ピンク",
                "頬": "ピンク",
                "首輪": "黄色",
                "リボン": "青と紫のグラデーション"
            }
        },
        "expression": {
            "mouth": "笑顔",
            "eyes": "黒い丸い目",
            "overall_mood": "明るく元気な様子"
        },
        "style": "シンプルな線画のかわいいイラスト"
    }
}

精度も良さそう。

JSON形式をさらに構造化します。
テーブルに格納。

CREATE OR REPLACE TABLE cm_1 AS
SELECT SNOWFLAKE.CORTEX.COMPLETE('claude-3-5-sonnet',
    'この画像に描かれているキャラクターの特徴(種類、色、表情)をJSON形式で抽出してください。',
    TO_FILE('@frames_stage', 'くらにゃん1.png'))AS analysis_json_raw;
SELECT
    -- まずJSONとしてパース
    TRY_PARSE_JSON(analysis_json_raw) AS json,

    -- 基本情報の抽出
    json:character.type::STRING AS char_type,           -- 結果: 猫
    json:character.style::STRING AS char_style,         -- 結果: シンプルな線画のかわいいイラスト

    -- 表情(expression)の抽出
    json:character.expression.mouth::STRING AS mouth,   -- 結果: 笑顔
    json:character.expression.overall_mood::STRING AS mood, -- 結果: 明るく元気な様子

    -- リボン,耳
    json:character.colors.accent."リボン"::STRING AS ribbon_color, -- 結果: 青と紫のグラデーション
    json:character.colors.accent."耳"::STRING AS ear_color,       -- 結果: ピンク

    -- main
    json:character.colors.main::ARRAY AS main_colors_list

FROM 
    cm_1;

2025-11-30_21h13_48

画像の情報を表形式のデータまで変換することができました。

複数の画像ファイルを処理

ステージ内にある複数の画像ファイルについて構造化処理をしていきたいと思います。

CREATE OR REPLACE TABLE cm_2 AS
SELECT
    -- 結果がどの画像のファイルか分かるようにパスを表示
    relative_path AS file_name,   
    -- Cortex Complete関数の実行
    SNOWFLAKE.CORTEX.COMPLETE(
        'claude-3-5-sonnet',
        'この画像に描かれているキャラクターの特徴(char_type、char_style、mouth,mood,ribbon_color,ear_color,main_colors_list)をキーとしてJSON形式で抽出してください。',
        TO_FILE('@frames_stage', relative_path) -- ここで動的にファイルパスを渡す
    ) AS extraction_result
FROM 
    DIRECTORY(@frames_stage)
WHERE 
    -- 必要に応じて拡張子でフィルタリング(例: PNGのみ)
    relative_path LIKE '%.png';

下記のような形で格納できました。

2025-11-30_21h24_19

JSON形式をさらに構造化します。

SELECT
    -- まずJSONとしてパース
    TRY_PARSE_JSON(extraction_result) AS json,

    -- 基本情報の抽出
    json:char_type::STRING AS char_type,           -- 結果: 猫
    json:char_style::STRING AS char_style,         -- 結果: シンプルな線画のかわいいイラスト

    -- 表情(expression)の抽出
    json:mouth::STRING AS mouth,   -- 結果: 笑顔
    json:mood::STRING AS mood, -- 結果: 明るく元気な様子

    -- リボン,耳
    json:ribbon_color::STRING AS ribbon_color, -- 結果: 青と紫のグラデーション
    json:ear_color::STRING AS ear_color,       -- 結果: ピンク

    -- main
    json:main_colors_list::ARRAY AS main_colors_list

FROM 
    cm_2;

出力結果は下記になりました。

2025-11-30_21h25_53

ゲーム業界のマルチモーダルな分析のユースケースを考えてみる

SaaSで加速するゲーム開発 Advent Calendarということで、ゲーム業界のマルチモーダルな分析のユースケースを考えてみます。

  1. 自動バグ検出と再現性の向上
  • プレイ画像:画面のレンダリング結果
  • システムログ:エラーコード、メモリ使用量
  • 音声:ゲーム内SE(効果音)の欠落やズレ
  • 分析内容:ログにはエラーが出ていないが、画面上ではテクスチャが崩れていたり、音ズレが発生している箇所をAIが自動で検出
  1. 文脈を考慮したハラスメント検知
  • 音声チャット(Voice):声のトーン、発話内容
  • テキストチャット:送信されたメッセージ
  • ゲームプレイ行動:フレンドリーファイア、意図的な放置、執拗な追跡
  • 分析内容:単なる「強い言葉」と「悪意あるハラスメント」を区別

画像や動画・音声・テキストデータを分析対象として組み合わせることで、より正確な判断や意思決定に役立てることができるのではないかと考えています。

まとめ

AI_COMPLETE関数を用いて画像ファイルを構造化データに変換しましたが、思ったより簡単に行うことができました。
また、AI_COMPLETE関数以外にもAIを用いた関数があるためSnowflakeでできることの幅が格段に上がっています。
マルチモーダルなデータ分析をするためのあらゆるデータのハブとしてSnowflakeが担ってくれる部分が多いことを改めて感じました。

最後に

最新の内容をいち早く支援しています

弊社クラスメソッドでは、Snowflake Intelligenceはもちろんdbt Projects on Snowflakeなどの最新機能に関する情報発信を定期的に行っており、これらの最新機能に関する技術支援も可能です。

https://classmethod.jp/news/20250710-dbt-projects-on-snowflake/

この記事が何かの参考になれば幸いです!

この記事をシェアする

FacebookHatena blogX

関連記事