AI Data Cloud勉強会 #01に参加しました

## AI Data Cloud勉強会とは

「AI Data Cloud」とはSnowflakeが提唱している概念で、1プラットフォームでデータとアプリをグローバルレベルで横断的に扱えるようにすることでAI活用を推進しよう、みたいなビジョンです。  

https://www.snowflake.com/ja/

このビジョンの実現のためにSnowflakeはここ半年だけでもかなり多様な機能をリリース・発表しています。それらをキャッチアップしよう、それらを実際に組み合わせて新しいユースケースを創出してみよう！という勉強会がSnowVillage[^1]で開催されています。  
リーダーはData Cloud Summit 24[^2]の会期中に技術解説を交えた現地レポートを発信をしていた[Hiyama](https://qiita.com/toru_hiyama)さんです。  

[^1]: Snowflakeの日本ユーザコミュニティ
[^2]: Snowflakeの年次カンファレンス

## 今回の勉強会の内容

今回はData Cloud Summit 24のWhat's Newなセッションをそれぞれチェックしてきて紹介しよう！という内容でした。  

## What's New: Unleashing Advanced Applications in Snowflake

高度なデータアプリケーションを実現するための様々な機能を包括的に紹介するセッションです。  
このセッションで紹介された機能をHiyamaさんが抜粋して解説してくれました。  

https://reg.summit.snowflake.com/flow/snowflake/summit24/sessions/page/catalog/session/1709764363815001WCg8

### Hybrid Tables

軽量なトランザクションデータを扱えるHTAPなテーブル。  
この「軽量」がネックだと思っていたのですが、ワークフローのステート管理に使えるというのが面白かったです。  
キーノートでもデモがあったので触ってみたくなってきた！  

https://docs.snowflake.com/en/user-guide/tables-hybrid

### Snowpark Container Services

フルマネージドなコンテナサービス。CPUとGPUの両方を選べます。  
つい先日、ジョブ実行ができるようになりました！  
また、Snowflake Native Appと連携することができるようになったため、
今回のSummitでは様々なパートナー企業がこれまでSaaSで提供していたサービスをSnowflake Native App化して提供する旨を発表しています。  

https://docs.snowflake.com/ja/developer-guide/snowpark-container-services/overview

### Full Text Search

全文検索。
まだPrivate Previewのため詳細が公開されていないのですが、半構造化データをストアしたテーブルから所定の単語が含まれるものを抜き出せるようです。  
SEARCH OPTIMIZATION的な設定を事前に行うことで内部的に全文検索用のインデックスを作成するものだと思われます。  

なお、LayerXのcivitaspoさんの記事でも少し触れられています。  

https://tech.layerx.co.jp/entry/snowflake-data-cloud-summit-2024

### Cortex Search

RAGで利用することを想定したマネージドな検索サービスです。テキスト検索とベクトル検索を併用したハイブリッド検索に対応しているようです。  

GitHubでデモプログラムのソースコードが公開されているので、アプリからの使い方は想像することができます。  

https://github.com/Snowflake-Labs/cortex-search

### DevOps

Git統合、Snowflake CLIなど色々と進化しています。  
ちなみにSnowflake CLIは従来のSQLクライアントであるSnowSQLとはまた別のツールで、SQL実行だけではなくStreamlit in Snowflake、Snowflake Native App、Snowpark Container Servicesなどの作成・管理にも対応した開発者ツールです。  

https://docs.snowflake.com/en/developer-guide/git/git-overview

https://docs.snowflake.com/en/developer-guide/snowflake-cli-v2/index

### Snowflake Trail

Snowflake TrailはSnowflakeの様々な機能に対して横断的なオブザーバビリティ(可観測性)を実現する新しい機能です。  
メトリクスやトレース、ログをOpenTelemetryに準拠した仕様で集約できるようです。  
個人的に注目のポイントはSnowpark DataFramesの自動トレースとPythonストアドプロシージャのプロファイラでしょうか。これまでは面倒だった性能のチェックがとても簡単になりそうです。  

https://www.snowflake.com/blog/observability-new-era-with-snowflake-trail/?lang=ja

## Talk to your data: The new era of data analysis by AI

SnowflakeのText-to-SQLであるSnowflake CopilotとCortex Analystを紹介するセッションです。  
このセッションについては私が解説しました。  

https://reg.summit.snowflake.com/flow/snowflake/summit24/sessions/page/catalog/session/1709751738632001PBYd

このセッション、機能紹介以外にもText-to-SQLを実際にビジネスで活用できる水準にするのは難しいんだよという余談もあって、各社が提供してくれていることのありがたみや社内で本格的に使うときにはその精度を自分たちなりに検証しないとなという課題感を感じました。  

### Snowflake CopilotとCortex Analystの違い

| | Snowflake Copilot | Cortex Analyst |
| --- | --- | --- |
| 対象ユーザ | データアナリスト、データエンジニア | ビジネスユーザ |
| インタフェース | ワークシート、Notebooks | REST API |
| 用途 | データ探索とSQL作成を支援 | ビジネス上の質問に直接回答 |
| コンテキスト | Universal Searchによる自動生成 | YAMLファイルで指定されたセマンティックモデル |
| 精度 | それなり | 極めて高い |

### Cortex Analyst

Cortex Analystはセルフサービスのためのデータ分析サービスです。  
裏ではLlama 3とMistral Largeが動いているそうです。  
データエンジニアはセマンティックモデルとUIとなるアプリケーションを作成して、そのアプリケーションを通じてビジネスユーザがビジネス上の質問を投げていくという使い方になります。  
デモにおいてかなり特徴的だったのは、セマンティックモデルで解決できる質問に対してはそのまま結果を回答してくれるのですが、セマンティックモデルで解決できなさそうな質問に対してはセマンティックモデルにどう落とし込むかを聞き返してくれるところでした。  

そのまま結果を回答してくれる例は以下のような感じで、  
Q. 昨年度の書籍の売り上げは？  
A. 書籍：1,149,527  

聞き返してくれる例は以下のような感じでした。  
Q. 前四半期の売り上げは？  
A. 何の売り上げか、前四半期がいつか、それぞれ具体的に指定してください。以下に質問の修正案を提示します。  
　「2021年第4四半期のプロダクトごとの売り上げは？」  
　「2021年第4四半期のリージョンごとの売り上げは？」  
　「2021年第4四半期の合計の売り上げは？」  

ちょっとすごい。  

なお、セマンティックモデルについてはセッションの中ではYAMLファイルで指定するということ以外は情報がなかったのですが、以下のリポジトリでサンプルとして示されているものと同じだと思われます。  

https://github.com/Snowflake-Labs/semantic-model-generator

複数のテーブルやビューからセマンティックモデルを構築することができるようです。  
セマンティックモデルの中で定義しているのは、  

- ディメンション
- 時間ディメンション
- メジャー
- フィルター

です。それぞれ、シノニム(同義語)、ディスクリプション、計算式などを記載することができるようです。  

## Code and database connectors for Snowflake

Snowflakeにおける様々なコネクタについて詳細に紹介するセッションです。  
このセッションについては私が一部分のみを抜粋して解説しました。  

https://reg.summit.snowflake.com/flow/snowflake/summit24/sessions/page/catalog/session/1708733150824001y6xk

### SQL API

SQL APIはREST APIでSQLを投げてデータを取得するという機能で、新しい機能ではなく、以前からある機能です。(勉強会当日は私がちょっと勘違いしていました)  
ドライバを導入できないMicrosoft Power Appsなどからの利用が使いどころになるかもね、という紹介がされていました。  
また、アーキテクチャも紹介されていました。  

https://docs.snowflake.com/ja/developer-guide/sql-api/index

### Snowflake Python API

色々なSnowflakeオブジェクトを取得・操作できるPythonライブラリです。  
タスクやウェアハウスから、イメージリポジトリや特徴量ストアまでかなり幅広いSnowflakeオブジェクトを扱うことができます。  

https://docs.snowflake.com/ja/developer-guide/snowflake-python-api/snowflake-python-overview

### ORMサポート

Entity FrameworkおよびHibernateへの対応がPrivate Previewだそうです。  
勉強会当日はよく分かっていなかったのですが、Entity Frameworkに対応するのは大きいかも。これまでMicrosoftのプラットフォーム上で.NETを使っていたアプリが、大きな改修をすることなくSnowflakeとも接続できるようになるかも…？  

https://learn.microsoft.com/ja-jp/ef/

https://hibernate.org/

また、SQLAlchemy 2.0への対応も発表していました。これまでは1.4.52までしか対応していなかったそうです。  

https://docs.sqlalchemy.org/en/20/

https://docs.snowflake.com/en/release-notes/clients-drivers/sqlalchemy-2024

### Snowflake ADBC Driver

ADBC(Arrow Database Connectivity)は、データベースサーバとデータベースクライアントの間のデータ送受信にApache Arrowを用いるためのAPIです。  
JDBC/ODBCは行ストアが前提のI/Fになっているため、Snowflakeのような内部的に列ストアを採用しているデータベースで使うと効率が悪いということでこちらが注目されています。  

https://arrow.apache.org/blog/2023/01/05/introducing-arrow-adbc/

このADBCについて、Snowflakeに対応したドライバ実装があるということで紹介されていました。  

https://arrow.apache.org/adbc/0.5.1/driver/snowflake.html

メリットは前述の効率だけではありません。Apache Arrowは様々なプログラミング言語への対応が想定されているので、これがあることでいくつかのプログラミング言語…具体的にはC++、Ruby、Rからの接続性が大幅に向上するということです。  

## 次回の勉強会の予定

今回は盛りだくさんで時間内に予定していた内容を紹介しきれませんでした。  
次回は残りの内容として、オーケストレーションの観点、および他のプラットフォームとの関わりという観点でチェックしたWhat's Newを紹介いただく予定です！楽しみですね。  

## SnowVillageに参加するには？

SnowVillageはSlackやオフラインイベントを通じてユーザ同士でコミュニケーションしたり勉強会を開催したりしています。  
[公式サイト](https://usergroups.snowflake.com/snowvillage/)からSlackワークスペースに参加できます。  
日々活発な議論が行われているのでぜひご参加ください！  

https://usergroups.snowflake.com/snowvillage/