Cortex

コンポーザブルCDPにおけるSnowflakeのマルチモーダルLLMの期待

こんにちは、喜田です。

本記事ではコンポーザブルCDPとは何か、最も簡単にコンポーザブルCDPを実現するSnowflake×TROCCO ACTION、そしてSnowflakeに新たに登場したマルチモーダルLLM機能を用いることで、CDPが担う領域にどのような変革が起きているか。実際に試せるSnowflake用のサンプルコードと共に解説します。

長文ですので、読み物として時間のある時にお楽しみください。
またマルチモーダルLLMのサンプルは実際に試せるネタシナリオになっていますので、そこだけ見たい方はこのあたりまでスキップしてください。

先日 #p_UG イベントでこんなLT発表をしてきました。

TROCCO ACTION for Snowflakeについて

TROCCO ACTIONは、国産のELTツールtroccoで有名なprimeNumber社が提供するコンポーザブルCDPのアクション部分を担う単機能アプリケーションです。2025年4月現在、for Snowflakefor Lookerが提供され、各々のデータ基盤と連携して利用できます。

Snowflakeユーザーはマーケットプレイス経由で簡単に利用でき、Snowflake内のテーブルやビューに含まれる「宛先リスト」を「特定の送信先」に渡すことができます。

今回の宛先リストと送信先について

LINE公式アカウント(企業)では、LINEの友だち(企業を友だち登録してくれてる消費者)にメッセージを配信することができます。

  • 受信者からすると届けられたメッセージはリアルな友人とのトークのように表示されます。
  • 企業側の管理画面(LINEアカウントの中の人)から見ると、個人と1対1でやりとりする「チャット」と集団に対して送付する「メッセージ」は別機能です。
  • 集団にメッセージ配信する宛先をグループ化したものが「オーディエンス」と呼ばれています。

TROCCO ACTIONはLINE公式アカウントでメッセージ配信用の宛先リスト、つまり「オーディエンス」を作成する機能です。宛先のサービス別(LINE広告、TikTok広告、X広告など)に今後も次々登場することが予告されておりLINEオーディエンス作成はその第一弾です。

LINE単体で実施するオーディエンス管理の課題

オーディエンスを管理するとはなんでしょうか。

オーディエンスに含める個々の宛先は「LINEID」で、メール配信におけるメールアドレスのようなものです。すべてのメッセージをすべての宛先に送り付けるのではなく、関心の高い人のみに届くようにします。消費者目線では関心のあることをプッシュしてくれるアカウントは有益なものとなり、これを積み上げてファンになっていきます。反対に、登録はしたけど関心が薄いものに対して通知が届き続けるとブロックしたり利用を避けたりとネガティブな行動を招いてしまいます。邪魔な通知をしなければ悪印象を与えることはありません。

LINE標準のオーディエンス管理機能では、LINE内でトラッキングできるユーザーの行動(前のメッセージをクリックしてくれたかどうか)などで絞ったオーディエンスを作ることができます。

画像左下にある「ユーザーIDのアップロード」機能を使うことで任意の集団を新規オーディエンスとしてまとめることができますが、任意の集団をどう作るかは企業側に任されています。ここがLINE単体で実施できる限界であり、自社が提供している商品やサービスにフォーカスした顧客の興味関心を適切に反映する術はココにかかっています。

とある飲食チェーンが顧客の食に関する興味関心をデータ基盤にもっていたとして、このような情報をLINE側の管理画面でお友達に対してつけたり分類することはできません。適切な顧客に向けたプロモーションをするためにはLINEの外で作った宛先リストをLINEに渡す必要があるのです。
これを実現するのが「データ基盤×TROCCO ACTION」というわけですね。

データ基盤でオーディエンスを作成する価値とは

データ基盤中心で実現するコンポーザブルCDP

CDP(カスタマーデータプラットフォーム)は企業が保有する顧客データの活用手法、またはそのためのデータ基盤やサービスで、1人1人の顧客についてデモグラフィック情報や興味関心データを集めて管理し、顧客の関心に沿ったアクションを実施していくというものです。

これを実現するCDPツールというと、Input/Outputのための豊富なコネクタとGUIを備え、顧客データの収集から宛先の選定、MAツール連携(今回でいうLINEのメッセージ配信など)を一気通貫で実施できる「マーケター用のアプリケーション込みのサービス」が有名です。リッチな製品では導入費用が膨らむことに加え、目的特化のツールであり、全社のデータを集約して横断利用していく文脈から枝分かれして、CDPツールが腹持ちするデータサイロを生んでしまいます。

それに対して、Snowflakeのようなデータ基盤に必要なサービスへの連携用アプリケーション(MA連携、LINE連携など)を上乗せして同等のアクションを実現する構成を「コンポーザブルCDP」と呼びます。リッチなマーケター向けツールと比べて、主要なInput/Outputの接続先がワンパッケージで提供されているわけではありませんが、自社が使いたい宛先に特化してデータ連携する手段があればよく、本記事で紹介しているTROCCO ACTIONのような最小機能のアプリケーションを賢く使うことでコストを最適化できます。

顧客の興味関心をオーディエンスに反映せよ

自社の新商品は「10代女性をターゲット」「こっちは30代男性向け」といったことが明確であればデモグラ情報を使ってオーディエンスを作ることができます。しかし、現代の興味関心はもっと多様化・細分化しており、「商品Aを買って、商品Bをクリックしたけど未購入だった人向けに新商品Cが刺さる」のようなことを探っていく必要があります。

– BIツールで実施するオーディエンス作成 –

「商品Aを買って、商品Bをクリックしたけど未購入だった人向けに新商品Cが刺さる」のようなことを今回のキャンペーン向けに細かく条件を変えて該当者を抽出して・・・という操作はBIツールで実施するのが一般的でした。想定し得る入力条件をBIダッシュボード上に用意し、担当者が思いつく様々なパターンでクエリしてみて、良い結果がでるフィルターの組を探っていきます。現在はBIツールが備えるAI機能で隠れた特徴を探ることも現実的になってきました。

– データ基盤で実施するAI/MLによるオーディエンス作成 –

「新商品Cを初動3日で買った人リスト」があると、それを正解データとして機械学習を用いることで、残りの全顧客のうち過去の行動が似ている人を探して「今後買ってくれそうなリスト」を作成することができます。

このようなAI/MLによって得られる新たな知見は、事業に応じたアイデア次第で無限に生み出すことができます。AI/MLによる自動化で都度のキャンペーンに最適化する負担が減ると、キャンペーン実施サイクルも爆速で回すことができるようになります。

可視化そのものが目的でない「人が探索するためのUI」としてのダッシュボードではもうその実施サイクルに追いつけず、優先度が下がっていくことでしょう。

もう一つ重要なことは、このような未来を実現していくためにデータ基盤側のプロダクトが様々なワークロードに対応して活用の幅を広げるべくAI/ML領域に全力で投資していることです。

AIへの投資と言うなら、CDPに特化した製品であれば、「顧客に配信するメッセージの作文」のようなAI機能を充実させるかもしれません。(というか当然もうできることでもあります。)これはこれでマーケに従事する人には嬉しい機能ですが、蓄積されたデータを糧とするデータ活用の本質よりはアプリケーション層に寄っていて業務担当者の利便性のための機能になっています。そこはあえて単機能のアプリで多くを求めず、他で代替できないところに注力するのがコンポーザブル側の主張です。

「最適なオーディエンス」を「無数のキャンペーンに対して爆速で作成」という真の価値を生み出す部分はデータ基盤の正統進化に大いに期待し、「作成したオーディエンスをAPI連携する」ような決まった機能は最小の単機能アプリに任せるというのがコンポーザブルCDPの思想と言えます。

Snowflakeの正統進化 – マルチモーダルLLM –

ここからはデータ基盤側の進化の話になります。「最適なオーディエンス」を「無数のキャンペーンに対して爆速で作成」するには現在のデータ基盤で何をするのが良いのでしょうか。

Snowflakeは従来より構造化/半構造/非構造データなどすべてのデータを扱えることを謳ってきましたが、扱える=格納できる/検索できるではなく、そこから知見を得るのがデータ基盤に求める目的です。非構造データ(例えば写真)を理解し特徴を抽出したり分類するには機械学習による画像解析などの高度なスキルが必要でした。

マルチモーダルLLMを用いたオーディエンス作成

顧客に紐づけて画像/動画/音声/ドキュメント・・・といったファイルを取り込んだとして、これが顧客の興味関心を捉える目的で利用できるでしょうか?

答えは「Yes」です!実際のSQLでできることを紹介します。

-- 写真をアップする用のステージ(非構造ファイル置き場)を作成

CREATE OR REPLACE STAGE input_stage
    DIRECTORY = ( ENABLE = true )
    ENCRYPTION = ( TYPE = 'SNOWFLAKE_SSE' );

/*
ステージに写真を配置しておく
*/

写真データを含む行をテーブルに挿入します。

-- 写真付きプロフィールテーブルを作成
CREATE TABLE line_id_profile_with_photo (LINEID VARCHAR,DISPLAYNAME VARCHAR,BREED VARCHAR,PHOTO FILE);

-- テーブルにデータを投入
INSERT INTO line_id_profile_with_photo(LINEID,DISPLAYNAME,PHOTO) SELECT 'Ubd237n30y112dadc8ccbf01da526dg41','KosukeKida' ,to_file('@input_stage','photo1.png');
INSERT INTO line_id_profile_with_photo(LINEID,DISPLAYNAME,PHOTO) SELECT 'AaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2','AbeAkira'   ,to_file('@input_stage','photo2.png');
INSERT INTO line_id_profile_with_photo(LINEID,DISPLAYNAME,PHOTO) SELECT 'BbBbbbbbbbbbbbbbbbbbbbbbbbbbbbbb3','BabaBunya'  ,to_file('@input_stage','photo3.png');
INSERT INTO line_id_profile_with_photo(LINEID,DISPLAYNAME,PHOTO) SELECT 'CcCccccccccccccccccccccccccccccc4','ChibaChiaki',to_file('@input_stage','photo4.png');
INSERT INTO line_id_profile_with_photo(LINEID,DISPLAYNAME,PHOTO) SELECT 'DdDddddddddddddddddddddddddddddd5','DomotoDaigo',to_file('@input_stage','photo5.png');


-- 投入したデータを確認
SELECT lineid,displayname,photo,breed FROM line_id_profile_with_photo;

これらの画像はそれぞれが飼っているペットを投稿してもらったとしましょう。

まだ画像投入時点ではBREED列が空です。

テーブル内の全行を対象に、画像をLLMに読み取らせてBREED(種)を生成します。

-- 写真(ペット)から犬種・猫種を生成してBREED列に格納
UPDATE line_id_profile_with_photo SET 
breed = ai.breed
FROM (
      SELECT snowflake.cortex.complete(
          'claude-3-5-sonnet',
          '映っている動物の種類を以下の形式で返してください。日本語名にしてください。
           ''breed'':{''type'':''array''}',
          photo
          ) AS ai_check
        ,parsed.value::string AS breed
        ,DISPLAYNAME
      FROM
        line_id_profile_with_photo,
        LATERAL FLATTEN(input => TRY_PARSE_JSON(ai_check):breed) AS parsed
     ) AS ai
WHERE
  line_id_profile_with_photo.displayname = ai.displayname
;

現実には既存ユーザーが後から写真を投入するケースがありますので、UPDATEに適切なWHERE条件を付与することで差分のみを更新できます。

-- 差分データの投入
INSERT INTO line_id_profile_with_photo(LINEID,DISPLAYNAME) SELECT 'EeEeeeeeeeeeeeeeeeeeeeeeeeeeeeee6','EgawaEriko' ;
INSERT INTO line_id_profile_with_photo(LINEID,DISPLAYNAME) SELECT 'FfFfffffffffffffffffffffffffffff7','FuruyaFumi' ;
SELECT lineid,displayname,photo,breed FROM line_id_profile_with_photo;

-- 画像を追加
UPDATE line_id_profile_with_photo SET photo = to_file('@input_stage','photo6.png') WHERE DISPLAYNAME = 'EgawaEriko' ;
UPDATE line_id_profile_with_photo SET photo = to_file('@input_stage','photo7.png') WHERE DISPLAYNAME = 'FuruyaFumi' ;

-- 写真(ペット)から犬種・猫種を生成してBREED列に格納
UPDATE line_id_profile_with_photo SET 
breed = ai.breed
FROM (
      SELECT snowflake.cortex.complete(
          'claude-3-5-sonnet',
          '映っている動物の種類を以下の形式で返してください。日本語名にしてください。
           ''breed'':{''type'':''array''}',
          photo
          ) AS ai_check
        ,parsed.value::string AS breed
        ,DISPLAYNAME
      FROM
        line_id_profile_with_photo,
        LATERAL FLATTEN(input => TRY_PARSE_JSON(ai_check):breed) AS parsed
      WHERE
        breed IS NULL -- breedが未入力の行のみ対象
     ) AS ai
WHERE
  line_id_profile_with_photo.displayname = ai.displayname
;

生成した値は末尾のWHERE条件(副問い合わせ内との結合条件)によって元テーブルに結合してUPDATEしていますので、少々複雑なつくりをしていますが、この書き方をベースに列名やLLMへの問いかけの部分を工夫すれば対応できそうです。

犬派・猫派をターゲットとするキャンペーンを実施するには

写真から純粋に抽出した犬種・猫種は今回のマーケティングのターゲットとしては細かすぎたので、もっと粗い粒度で「犬派・猫派」に再分類することを考えます。

写真には犬でもない、猫でもない不思議な動物が映っていたり、犬に詳しくないと犬種だけ見ても犬かどうか判断できなかったりして、映っているモノや粒度が千差万別です。このような写真から直接有益なグループを作成するといったユースケースは普及していないと思いますが、生成AIに種を抽出してもらったあとは簡単にこの先に進めます。

細分化されすぎた興味関心を、マーケティングで使いやすい粒度に再分類しなおします。

-- ペット写真から犬種・猫種を判定して格納
-- 犬種・猫種という細かすぎる属性を「犬派/猫派/その他」に分類
SELECT
   LINEID
  ,DISPLAYNAME
  ,PHOTO
  ,BREED
  ,SNOWFLAKE.CORTEX.CLASSIFY_TEXT(breed,['犬', '猫', 'その他']):label::VARCHAR AS AUDIENCE
FROM
  line_id_profile_with_photo
;

この例の良いところは、今後も次々と展開される新商品キャンペーンに対して、犬猫だけではなく都度適切な分類を簡単にLLMに指示できるところです。考え得る粒度としては犬種は相当細かく、それを再分類するのに便利な一般名詞です。明日の業務では今日と変わって「和犬か洋犬か」「大型犬~小型犬」のような分類が必要であれば当然でき、現実にはありえない無茶な分類(ティラノサウルスを飼っている恐竜オーナー様がデータに忠実に生み出されました🦖)だってお手の物です。

-- 同じSQLの分類の指示のみ変更
SELECT
   LINEID
  ,DISPLAYNAME
  ,PHOTO
  ,BREED
  ,SNOWFLAKE.CORTEX.CLASSIFY_TEXT(breed,['恐竜', '爬虫類', 'その他']):label::VARCHAR AS AUDIENCE
FROM
  line_id_profile_with_photo
;

このように作りだしたマーケティングに有益な犬派、猫派、恐竜派といった属性を使って、TROCCO ACTIONでLINEオーディエンスとして連携し、恐竜派のお友達にメッセージを送ります。

顧客基盤としては(格納先のデータ量などシステム課題は別にして)個々の消費者の生活に近い写真データは関心事が反映されやすく、SNSキャンペーン等でも比較的集めやすくなるのではないでしょうか。

現実にいまユーザーに関連して写真データを収集しているというケースは珍しいと思いますが、技術面が整っていけば、消費者からは面倒なアンケート入力よりも日常の体験の一貫として写真の方が投稿しやすかったり、ファンを育てるような顧客とのコミュニケーションの到達点として良いかもしれません。

今回は、画像に対応したマルチモーダルLLMがSnowflakeに登場したので、顧客基盤に画像を取り込むという視点で考えてみましたが、モデルが音声、動画、ドキュメントに対応してくれればほとんど同じ使い方ができることは目に見えています。

このようなデータ基盤の正統進化がこの半年、1年でまだまだ起きてきます。

マーケティング目的では何ができるようになっていくか、それはマーケに特化したCDP製品でも実現できるものか。全社統合のデータ基盤を核に置いたコンポーザブルCDPだからこそできるのか。その他の様々な業務領域では何ができるようになっていくのか。

AI時代のデータ活用を皆さまと一緒に考えていければと思います。

ピックアップ記事

  1. 最速で理解したい人のためのIT用語集

関連記事

  1. Python

    Streamlit in Snowflakeによるダッシュボード作成

    こんにちは、エクスチュアの石原です。前回に引き続き、Stre…

  2. Snowflake

    Snowflake Summit2023 振り返り

    1. はじめに6月26日~29日にラスベガスにて開催されたS…

  3. Data Clean Room

    SnowflakeのData Clean Roomを基礎から一番詳しく解説(2回目)

    こんにちは、喜田です。複雑なSnowflakeのデータクリー…

  4. Sansan

    Sansanで名刺を取り込んだらSlackで社内共有する(Zapier利用)

    こんにちは。CEOの原田です。当ブログにて、エクスチュア株式会社が…

  5. Data Clean Room

    セッション資料:Snowflakeで始めるData Clean Room!DCRって…

    2023年8月25日 Snowflakeユーザグループ主催のセミナ…

  6. Snowflake

    SnowflakeのHybrid Tableのマニュアルを読み解く

    こんにちは、喜田です。実はこれまでSnowflake…

カテゴリ

最近の記事

  1. コンポーザブルCDPにおけるSnowflakeのマルチモーダ…
  2. boxMCPサーバーを使ってみた
  3. #ai-datacloud勉強会でマルチモーダルに触れた日
  4. Matillion ETLを安全に使いたい人へ送る、SSL対…
  5. LangGraphのソースコードから見る今更聞けないAIエー…
  1. YOTTAA

    YOTTAA:ECサイトで見るべき8つのサイトパフォーマンス指標について
  2. Tableau

    Tableau-折れ線グラフ
  3. IT用語集

    API(Application Programming Interface)って…
  4. Azure

    Google Cloud StorageとAzure Blob Storage間…
  5. Google BigQuery

    Google Apps Scriptを使ってスプレッドシートからBigQuery…
PAGE TOP