Cortex

SnowflakeのAI_SQLと再帰CTEで遊ぶ(SnowVillage AI-DataCloud勉強会 6月+α)

こんにちは、喜田です。

突然ですが、Snowflakeのコミュニティ SnowVillage をご存じでしょうか?!Slackワークスペース SnowVillageを中心としたオンラインでのコミュニケーションに加え、ユーザー発信によるイベントの企画・運営など、毎月(毎週?!)のように行われている超活発なエンジニアコミュニティです。

私自身もアクティブに参加しており、その中で今最も推せるチャンネルが #ai-datacloud かなと思っています。Snowflakeが生成AI系の新機能を出すたびに夜な夜な集まって試して議論するような動きをしており、おそらく世界最速でSnowflakeのAI機能を学び、他に一切出回っていない活用アイデアのタネが生まれるような場になっています!

AI-DataCloud勉強会(2025.6.25 AI_SQL回)

今回のネタはSnowflake Summit 25で発表されて話題のAI_SQL!弊社ではAIエンジニアの石原が中心となって一通りの機能調査をしており、その調査結果とともに、活用アイデア等を提示していただいているNTTデータさんのブログも拾って発表してくれました。

  • AI_SQLは従来からあるcortex_llmファンクションのアップデートであること
    • 従来からの後継機能(complete、classifyなど)
    • 新機能(filter、aggなど)
    • 特に新機能について活用アイデアをブログ記事から読み込んだり、試したりしました。
  • ディスカッション
    • AI_SQLの適用範囲
    • AI_AGGの性能報告
    • もっとこんなことできそうアイデア

AI_SQLの適用範囲

上記のブログで示されているいくつかの活用アイデアに対して、参加者でひとしきり眺めて、各々が試してみた類似パターンの話や、これは思いつかなかったが便利そう、などの話をしました。また、実際に試してみると結果が返らなかったりして、想像したもののAI_SQLには苦手であることが確認されたケースもありました。インプットされた文字列に対して、マルチな文字列加工処理をその場限りで定義して実行できそう、という案が示されましたが、できるようでいて精度・実行時間などに問題がありそうです。

関連して、ちょうど先日Data Superheroesの松井さんと画像のような議論をしてました。

入力された文章の意味的なマッチを判断するのがAI_FILTERであり、
・文字列を決まったルールに沿って加工する
・ロジカルで精緻な条件判定
・表記ゆれのある固有名詞を名寄せする
などでは使いづらそうということが見えてきました。

生成AIでありがちな例ですが、

「こんにちは、はじめまして。私の名前は喜田です。」
 ↓
説明して!
 ↓
「喜田さんがはじめての相手に対する挨拶をしています。」

「こたんたにたたちたは🦊」
 ↓
たぬき言葉の暗号を解いて(「た」を抜いて意味の通る文章にして)
 ↓
「こんにちは」(文章の意味を無視した文字列加工では精度がでない)

のようなことは実際に確認できており、AI_SQLにもどんなお願いをするのが良いかは今後もユースケースごとに確認ポイントになりそうという議論ができました。

AI_AGGの性能に関する報告

私が試したAI_AGGに限ってですが、仮に5000行のテーブルをGROUP BYして、groupkeyの種別50種に対して100行がサマリされるようなケースで所要時間を測りました。

  • WHERE groupkey = 1 のような条件を付与し、つまり5000行中の100行だけを絞ってAI_AGGに渡します。AI_AGGが返す結果は1行です。この場合に10秒程度を要しました。
  • WHERE groupkey IN (1,2) のような条件を付与し、つまり5000行中の200行に絞ってAI_AGGに渡します。AI_AGGは各集計行に対して呼ばれるので2回実行され、2行の結果が返ります。この場合に20秒程度を要しました。
  • WHERE groupkey IN (1,2,….,10) のような条件を付与し、つまり5000行中の1000行に絞ってAI_AGGに渡します。AI_AGGは各集計行に対して呼ばれるので10回実行され、10行の結果が返ります。この場合に100秒程度を要しました。
  • WHERE条件なし、groupkeyは 1,2,…,50 まですべて、5000行中の5000行がAI_AGGに渡ります。AI_AGGは各集計行に対して呼ばれるので50回実行され、50行の結果が返ります。この場合に500秒程度を要しました。

試しにウェアハウスサイズを引き上げたり、マルチクラスタ―ウェアハウスの設定をいれても所要時間は変わらず、AI_AGGに関してはスケールアップ/スケールアウトによる効果が見えないことが分かりました。

推測ですが、たかが5000行、結果に至ってはたかが50行の検索なので、実行計画作成時点で軽くみられて、1コア割り当てしかされていないのではないか?と見ています。(元のマイクロパーティションの数による?)
最終的に1コアがAI_AGGの処理を直列に50回実行しているような動きになってしまっているのではないかと見ており、根拠となるような詳細なクエリプロファイルの調査など今後やっていこうと思っています。

このことから、データエンジニアリング領域(分析用データのためのデータ加工過程)でAI_SQLを乱用するというよりは、もっとアプリケーション層で、条件にマッチした数行の結果を最終的なレポートとして作文するようなシーンで有用と判断しています。

AI_SQLで遊ぶ(AI_COMPLETEと再帰CTE)

AI_SQLを用いて、AI_CLASSIFYで分類→AI_AGGで分類ごとにサマリ→AI_FILTERで特徴が一致するものを抽出 のように段階を踏んだAI任せの抽出のようなことができそうというアイデアが示されました。

それを聞いて思いついた「再帰CTEと組み合わせたAI同士によるディスカッション」を勉強会後に試してみたのでコードを残しておきます。なかなか面白いことになってます。

CREATE TABLE short_story (story_no integer,story varchar);

INSERT INTO short_story VALUES(1,'The Forest of Forgetting
Beginning
Once upon a time, on the outskirts of a quiet village, there was a mysterious place known as The Forest of Forgetting.
They said that anyone who entered would forget all their sadness and pain.
One day, a girl named Mina, burdened with a heavy sorrow, quietly stepped into the forest.

Development
The forest was bathed in gentle light, and the rustling of the trees sounded like a lullaby.
The tears that had been running down Mina’s cheeks faded with the scent of the woods, and soon, even the ache in her heart disappeared.
“If I stay here,” she thought, “maybe I’ll be okay.”
Mina decided to live near a small lake deep within the forest.

Turn
A few days later, a traveler wandered into the forest and found Mina.
“They’ve been searching for you in the village,” he said. “Your family and friends are worried. Come home.”
But Mina tilted her head in confusion.
“…I’m sorry. What’s a village? I thought I was born here.”

Conclusion
The traveler walked away with sadness in his eyes.
Mina, meanwhile, stayed by the lake, playing with the birds and humming softly to herself.
“There’s nothing sad here,” she whispered with a smile.
');


ChatGPTに制作してもらったお話です。The Forest of Forgettingに踏み入れたものは辛いことや悲しかったことを忘れてしまう。本人は幸せだが果たしてそれは本当の幸せと言えるのでしょうか・・・というダークで美しい童話です。

この童話をAI_SQLに食わせて、立場を示してコメントをしてください+前の人(AI)が書いたコメントも含めてさらにコメントしてください・・・を繰り返していくということをします。

WITH RECURSIVE r(story_no,discussion_no,previous_text,discussion_text) AS (
  SELECT
    story_no,
    0,
    story AS previous_text,
    '(original story)' AS discussion_text
  FROM short_story

  UNION ALL

  SELECT
    r.story_no,
    discussion_no + 1,
    previous_text || discussion_text AS previous_text,
    AI_COMPLETE(
      'mistral-large',
      CONCAT('悲観的/楽観的/情緒的/論理的などの立場を示し、discussに対する感想を日本語で返してください。: <discuss>', previous_text , '</discuss>')
      )::varchar
  FROM r
  WHERE discussion_no < 3
  )
SELECT * FROM r
;

再帰CTEについて

WITH句はデータ基盤においても良く使われる表現ですが、WITH RECURSIVEと言う構文をご存じでしょうか。
WITH RECURSIVEで作られたCTEは、CTE定義内のFROM句に自身を書くことができます。(下から4行目、FROM rのところ)

直前ターン(n-1)のr を参照し、今ターン(n)の回答を生成しUNION ALLでrの結果セットに1行追記します。次ターン(n+1)では今ターン(n)のrを参照し、回答を生成しUNION ALLでrの結果セットに1行追記します。
このままだと無限にターンが積みあがってしまいますので、終了条件(WHERE discussion_no < 3)を入れて議論の修了ポイントを明示しています。

最終的に、議論を指定のターン数重ねた CTE r が完成し、クエリの主部ではSELECT * FROM r だけをやってシンプルに結果を取得します。

最終的に行われたAI同士の議論

The Forest of Forgetting
Beginning

Once upon a time, on the outskirts of a quiet village, there was a mysterious place known as The Forest of Forgetting.
They said that anyone who entered would forget all their sadness and pain.
One day, a girl named Mina, burdened with a heavy sorrow, quietly stepped into the forest.
Development
The forest was bathed in gentle light, and the rustling of the trees sounded like a lullaby.
The tears that had been running down Mina’s cheeks faded with the scent of the woods, and soon, even the ache in her heart disappeared.
“If I stay here,” she thought, “maybe I’ll be okay.”
Mina decided to live near a small lake deep within the forest.
Turn
A few days later, a traveler wandered into the forest and found Mina.
“They’ve been searching for you in the village,” he said. “Your family and friends are worried. Come home.”
But Mina tilted her head in confusion.
“…I’m sorry. What’s a village? I thought I was born here.”
Conclusion
The traveler walked away with sadness in his eyes.
Mina, meanwhile, stayed by the lake, playing with the birds and humming softly to herself.
“There’s nothing sad here,” she whispered with a smile.

1ターン目

(original story)

2ターン目

悲観的な立場: この話は、忘れることが人類の悲しみを解決することはできないという悲観的な視点を示しています。Minaは自分の悲しみを忘れることができましたが、その代わりに自分自身の過去や身元を忘れてしまいました。これは、忘れることによって得られる快感は一時的であり、本質的な解決策を提供していないことを示唆しています。
楽観的な立場: 一方で、この話は忘れることが人生を楽しむための手助けとなる可能性も示しています。Minaは忘れることで、悲しみや痛みから自由になり、自然との共存を楽しむことができました。彼女は、忘れることで新しい自分を見つけることができました。
情緒的な立場: この話は、忘れることの喜びと悲しみを強く感じさせます。Minaが森での生活を楽しむシーンは、忘れることの快感を感じさせます一方で、彼女が過去を忘れることによって生じる孤独や寂しさは、忘れることの悲しみを強く感じさせます。
論理的な立場: 論理的に見ると、この話は忘れることの利点と欠点を示しています。忘れることによって得られる快感は一時的であり、本質的な解決策を提供していないこと、また忘れることによって生じる孤独や寂しさは、忘れることの欠点であることがわかります。

とにかく、この話は忘れることについての様々な視点を提示し、読者に忘れることの意味を考えさせてくれます。

3ターン目

悲観的な立場:
この話は、人生の苦しみや哀れさを逃れようとするものが、結局はそれ自体を失うことになるという、悲劇的な結末を描いています。森の中での平和な生活は、実は幻想の世界に過ぎず、真実の世界には戻れなくなることを意味しています。この点から見ると、この話は深く悲観的であると言えます。
楽観的な立場:
一方で、この話は、人生の苦しみを超えて、心の平和を得るために必要なことを示しているともいえます。森の中での生活は、彼女の心の傷を癒し、新しい人生を始めるための機会を与えています。彼女が過去を忘れることで得た自由さと、森の中での幸せな生活を見る限り、この話は楽観的な視点からも解釈ができます。
情緒的な立場:
この話は、人間の情感を強く描いています。彼女が森に入る前の哀れや苦しみ、森の中での平和な生活、最後に彼女が過去を忘れることによる悲しみという、様々な情感が描かれています。この点から見ると、この話は強く情緒的であると言えます。
論理的な立場:
一方で、この話は、人間の記憶や認知に関する問題を提起しています。彼女が過去を忘れることで得た自由さと、それによって生じる問題について考察することができます。この点から見ると、この話は論理的な視点からも解釈ができます。

以上、悲観的/楽観的/情緒的/論理的な立場からの感想をご覧いただけました。

AIおしゃべり、めちゃくちゃ捗っとるやないですか。今回は指示が甘くて1ターンの中で立場を変えて回答してくれちゃってますが、ちゃんと指示したら各ターンでそれぞれの人格にあった回答をしてくれて、より議論が深まるみたいなことができそうです。

なお、、、、所要時間と課金額はお察し・・・・ということで、試すときは自己責任でお願いしますね。

Trying Out dbt Fusiondbt Fusion使ってみた前のページ

Cortex Analystを使ってみた次のページ

ピックアップ記事

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

関連記事

  1. Snowflake

    dbt Projects on Snowflake使ってみた

    こんにちは、中村です。ついにdbt Projects on …

  2. Snowflake

    【速報】Snowflake Summit Builder Keynote 要約

    こちらの記事はSnowflake Summitで行われたキーノートス…

  3. DBエンジニアが学ぶSnowflake

    【DBエンジニアが学ぶSnowflake】①Snowflakeを語りたい!

    今回は「Snowflakeの特徴・見どころ」を語りたいと思います!見解…

  4. Snowflake

    TROCCO入門

    こんにちは、エクスチュアの照沼です。みなさん、ELTツールと…

  5. Snowflake

    [Snowflake Summit 2025] Snowflake Postgres の続報と考察

    こんにちは、喜田です。Snowflake Summitで発表…

  6. Data Clean Room

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

    こんにちは、喜田です。この記事では、複雑なSnowflake…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


カテゴリ
最近の記事
  1. 【dbts25】Snowflake×PostgreSQLのニ…
  2. TROCCO dbt連携編
  3. KARTEの「フレックスエディタ(β)」登場!ノーコードでこ…
  4. dbt Projects on Snowflake使ってみた…
  5. Cortex Analystを使ってみた
  1. DBエンジニアが学ぶSnowflake

    【DBエンジニアが語るSnowflake】②このロールがすごい!!!
  2. Google Tag Manager

    Google Tag Manager: 離脱リンクのクリックをトリガーにする
  3. Adobe Analytics

    検索エンジン-自然とは-Adobe Analyticsの指標説明
  4. Tableau

    Tableau Desktop 2020.1の新機能を全て解説してみた。
  5. Tableau

    Tableauの「WEB編集」機能について理解する
PAGE TOP