生成AIとDWHを用いたDatabricksワークショップ

先日、あるお客様向けに以下の資料を用いたハンズオンワークショップを実施しました。

<script defer class="speakerdeck-embed" data-id="03bb7c990d504f7c91c716a677c064d9" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

構成や資料の準備、座学は私が行ったのですが、ハンズオン自身はお客様のデータを使ったこともあり、お客様にリードいただきました。結果として非常に興味深い内容になりましたので、ここでは公開されているデータを用いてハンズオンの流れをまとめます。

# ターゲット

これまでにBIやDWHを操作したことがある、これから取り組みたいと考えている方。

# ユースケース

Databricksに格納されているテーブルを用いたデータ集計やレポーティング。

# ワークショップの流れ

二年前であれば存在していなかった新機能を活用します。生成AIを活用することで、(ほとんど)SQLを記述することなしに、データ集計やレポート作成が可能になることを体験いただきます。

![Screenshot 2024-10-25 at 11.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a61ff4c-0b13-d18e-fe7a-f503f0e825db.png)

- [**AI Playground**](https://docs.databricks.com/ja/large-language-models/ai-playground.html)
    - 生成AIの挙動(同じインプットでも常に同じアウトプットにはならない、システムプロンプトの効果など)に慣れてもらう。
- [**Databricks SQL**](https://www.databricks.com/jp/product/databricks-sql) + [**Databricksアシスタント**](https://docs.databricks.com/ja/notebooks/databricks-assistant-faq.html)
    - SQL基礎の座学を実施しつつ、Databricksならほとんど日本語でタスクをこなせることを説明。
    - CSVファイルの取り込みからカタログエクスプローラのオリエンテーション。
    - アシスタントの力を借りながら売り上げデータに対するクエリーを洗練
    - ビジュアライゼーション、ダッシュボード、フィルタの作成からダッシュボードの公開までをウォークスルー
- [**Databricks AI/BI(Genieメイン)**](https://www.databricks.com/jp/product/ai-bi/genie)
    - 上と同じデータを使ってGenieスペースを作成。
    - アシスタントの力を借りても数十分かかっていた作業が、Genieなら数分で完遂できることを体感いただく。

# AI Playground

AI Playgroundの画面のオリエンテーションを行ったら、早速自由に触っていただきます。

![Screenshot 2024-10-25 at 11.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5e799566-c459-8171-f993-196da6d2fa46.png)

![Screenshot 2024-10-25 at 11.31.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6053fdeb-dc06-53c2-b9f5-335fe841e7db.png)

右上の **+** ボタンをクリックすると、問い合わせするモデルを横並びに表示させることができます。同時に複数のモデルに問い合わせができるので、結果を比較して翻訳の精度を高めることなどが可能です。

![Screenshot 2024-10-25 at 11.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/86546f5c-7a21-aab5-12d3-1038b2e964d8.png)

システムプロンプトでモデルの挙動をコントロールすることも可能です。

![Screenshot 2024-10-25 at 11.34.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/dce8e26a-4afd-0b77-c6a0-a1461b2dfb72.png)

ここでは、以下を体験していただきます。

- モデルによって挙動が異なること、得手不得手があること
- 指示(システムプロンプト)によって、モデルの挙動をある程度制御できること
- 同じモデルに同じ問い合わせをした場合、必ずしも同じ回答が返ってくるわけではないこと

# Databricks SQL + Databricksアシスタント

## SQL座学

日本語でデータ分析ができるといえども、背後で生成されるSQLが何であるのかは感触を掴んでいただきたいと思います。

![Screenshot 2024-10-25 at 11.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/21b98cc3-96e8-c037-2ede-2089b1e74b88.png)
![Screenshot 2024-10-25 at 11.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/480d1e3d-b20b-7fd8-7bdf-4eeea6e7f9d9.png)

怖がらないでください。今日のハンズオンではアシスタントやGenieの力を借りて、SQLをほとんど記述することなしにデータ分析を行なっていただきます。

## データの取り込み

ここでは、[こちら](https://github.com/metatron-app/metatron-doc-discovery/blob/master/_static/data/sales-data-sample.csv)で公開されている売り上げデータを使用します。CSVファイルをローカルにダウンロードします。

データを取り込む際には、Unity Catalogのカタログとスキーマ(データベース)を指定する必要があります。適当なものがない場合には、以下のSQLを実行して、自身のメールアドレスを用いたスキーマを作成しておきます。

```sql
DECLARE database_name = "takaakiyayoi_catalog." || regexp_replace(current_user(), '[\.@]', '_');
CREATE DATABASE IF NOT EXISTS IDENTIFIER(database_name);
SELECT database_name;
```
```
takaakiyayoi_catalog.takaaki_yayoi_databricks_com
```

サイドメニューの**データ取り込み**をクリックし、**テーブルを作成または変更**をクリックします。

![Screenshot 2024-10-25 at 11.39.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/24c81bee-6cf6-25af-8732-0728870d12f6.png)

ダウンロードしたCSVをドラッグ&ドロップします。

![Screenshot 2024-10-25 at 11.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/76d38542-48d4-f604-508f-32f315d100b6.png)

プレビュー画面が表示されるので、既存のスキーマあるいは上のSQLで作成したスキーマを選択し、**テーブルを作成**をクリックします。

![Screenshot 2024-10-25 at 11.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e9c5d5c6-e1c3-c44c-787d-5d0b3351d409.png)

これでデータが取り込まれ、テーブルが作成されました。

![Screenshot 2024-10-25 at 11.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4eebf591-8edb-c6c7-2504-b7b39dcde4ad.png)

カタログエクスプローラの画面をオリエンテーションします。

![Screenshot 2024-10-25 at 11.46.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0f58ba6f-011e-efab-c1c3-367b501afe4d.png)

![Screenshot 2024-10-25 at 11.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bbfb5f9c-aa3e-aa69-4edb-40b52c6fbc74.png)

## SQLエディタとアシスタント

サイドメニューからSQLエディタに移動します。

![Screenshot 2024-10-25 at 11.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/48520643-8362-2161-2a5b-aae66b249719.png)

画面のオリエンテーションを行います。左上のアイコンからはカタログエクスプローラ同様にカタログ内のオブジェクトを一覧できること、エディタの右上のアシスタントボタンはエディタに記載されている内容にフォーカスして動作することを説明します。

![Screenshot 2024-10-25 at 11.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4e84f433-0606-ac28-326d-a3b10518c1f6.png)

前のステップで作成したテーブルを検索し、テーブル名を右クリックあるいは3点リーダーをクリックして表示されるメニューから**tableパスをコピー**をクリックします。これによって、テーブルの完全なパス`takaakiyayoi_catalog.takaaki_yayoi_databricks_com.sales_data_sample`がクリップボードにコピーされます。

![Screenshot 2024-10-25 at 11.51.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55a06157-7d12-2e5c-00f9-1f71c2b647fb.png)

次にエディタ右上のアシスタントボタンをクリックします。するとエディタ上部にプロンプト入力ボックスが表示されます。

![Screenshot 2024-10-25 at 11.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ef23e855-6712-c9fc-a6c6-81d857fad760.png)

プロンプトボックスにテーブルパスを貼り付けて、以下のように編集します。

> takaakiyayoi_catalog.takaaki_yayoi_databricks_com.sales_data_sampleの内容を表示

プロンプトボックス右の送信ボタンを押します。

![Screenshot 2024-10-25 at 11.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0d0eb00c-1af8-af2e-10d3-a310ca195d6b.png)

これで、指示に従ってSQLが下のエディタに挿入されます。**承認**を押して確定します。ここで、生成AIの性質上、期待しない結果が出てくることがあること、自分でやりたいことに応じて編集可能であることを説明します。

![Screenshot 2024-10-25 at 11.54.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f6c9a961-0ce9-f29b-daee-5a0306714518.png)

エディタ左上の **実行(1000)** ボタンを押してSQLを実行します。

![Screenshot 2024-10-25 at 11.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0316067a-a064-51e3-58b1-a6096a678448.png)

取得結果が表示されます。上記の**1000**は取得件数を1000件に絞っていることを意味しています。

![Screenshot 2024-10-25 at 12.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2c1108ca-040e-d235-7ee0-a4e1f1e192f4.png)

実行ボタンの右の下向き矢印を展開して**LIMIT 1000**のチェックを解除すると全件取得することになりますが、ここでは解除しません。

![Screenshot 2024-10-25 at 12.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/37aa7a22-5e21-9c72-0b8c-b8c41253ad26.png)

またアシスタントを呼び出します。シンプルなSQLをベースにより複雑なSQLの構築をアシスタントに指示します。

上の結果を見ると、注文日が`OrderDate`、売り上げが`Sales`であることがわかります。これらのカラムに対して処理を行います。以下のプロンプトを入力します。

> OrderDateをyyyy-mm、Salesの合計

これによって、月毎のSalesの合計を計算するSQLが生成されるはずです。

![Screenshot 2024-10-25 at 12.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7cdccf9e-0d07-93e2-95cf-2ca588f53a17.png)

前と同じように承認して実行します。

![Screenshot 2024-10-25 at 13.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6169a2bc-c936-9e65-72c3-6c37fed9cb3c.png)

期待した通りに動いていますが、よく見ると並び順がメチャクチャです。さらにアシスタントに修正させましょう。

> OrderDateの小さい順

![Screenshot 2024-10-25 at 13.01.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/837a8272-ddfc-216d-41fe-eeba49508ff5.png)

これで並び順も綺麗になりました。ここまで、SQL自体は一行も書いていません。すべて日本語でアシスタントに指示することで集計処理を実現しています。

![Screenshot 2024-10-25 at 13.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/627e57e8-4106-02bc-eb0c-6552c6c4493a.png)

## グラフの作成

ここまではいい感じに進んでいますが、表形式のデータを見ていても味気ないのでグラフを作成します。**未加工の結果**の右にある **+** をクリックし、**可視化**を選択します。

![Screenshot 2024-10-25 at 13.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/12c49b55-c39f-08cb-e988-464d99462bb8.png)
![Screenshot 2024-10-25 at 13.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3675277b-abaf-6ad9-33d6-dccc38dd4783.png)

可視化の設定画面が開くので、`Visualization type`で**Line**を選択します。

![Screenshot 2024-10-25 at 13.05.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0d0b8f9f-6e09-175c-e91a-a15af3f4bfb4.png)

`X column`で**OrderDate**を選択します。

![Screenshot 2024-10-25 at 13.06.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1891da30-b06b-283d-09ba-a0b0e79737cc.png)

`Y columns`の下の**Add column**をクリックします。

![Screenshot 2024-10-25 at 13.07.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7d1639fb-3d3e-34d9-6dfc-1f8b080c9403.png)

**TotalSales**を選択し、その右が**Sum**(合計)になっていることを確認します。これで、右側に売上の推移を示す折れ線グラフが表示されるはずです。右下の**保存**をクリックします。

![Screenshot 2024-10-25 at 13.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/898bbf79-0ee1-b839-8512-16b4d7d66066.png)

## ダッシュボードの作成

SQLエディタの下部に作成したグラフが表示されます。これでグラフを作成することができましたが、ここまで来たらダッシュボードにして共有したいと考えることでしょう。なので、ここからダッシュボードを作成します。

上で追加したグラフのタイトルの右側の下向き矢印をクリックしてメニューを展開します。**ダッシュボードに追加**を選択します。

![Screenshot 2024-10-25 at 13.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/18d49a5e-e4a0-db47-4b5d-6e3c3dddaa53.png)

ダッシュボードの作成ダイアログが表示されます。

![Screenshot 2024-10-25 at 13.17.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c54f14bd-036d-964f-ed22-7afabb958c12.png)

必要に応じてダッシュボードの名称を変更し、追加するグラフを選択します。**クエリーを保存して作成**をクリックします。

![Screenshot 2024-10-25 at 13.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a1a8c777-8ac8-5106-d5dc-13e4070da9a7.png)

クエリー(とクエリーから作成したグラフ)の保存先を聞かれるので、場所を選択して保存します。

![Screenshot 2024-10-25 at 13.19.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/26276667-c973-fca6-a64c-c43216fb3009.png)

これでダッシュボードのドラフトが作成されます。

![Screenshot 2024-10-25 at 13.19.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fe3cec57-e811-2f75-05e3-3d0cb709d7dc.png)

ドラッグでグラフの位置やサイズを変更することができます。グラフの部品を選択すると、右側に設定画面が表示されます。

![Screenshot 2024-10-25 at 13.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0ca80653-b971-9f69-e3da-14bdf95cf1e9.png)

ここでは、フィルターを追加してみます。特定の期間にフォーカスするために活用できます。画面下のツールバーの一番右のアイコンをクリックします。

![Screenshot 2024-10-25 at 13.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ad2c0458-bcd6-b2d9-97c9-ce20f3e7e286.png)

フィルターウィジェットの配置場所が選択できるようになるので、好きな場所に配置します。

![Screenshot 2024-10-25 at 13.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/17c98fe2-505c-4a7a-3f11-30df16fa36ba.png)

配置したらサイズを調整します。

![Screenshot 2024-10-25 at 13.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/09239ccb-76a3-921f-37cb-9f97942e00ab.png)

右側に設定画面が表示されていますので、ここで設定を行います。

- 複数の値を選択できるように、**単一値**から**複数の値**に変更します。
- フィルタリングの対象となるフィールド(列)を選択します。**フィールド**の右の **+** をクリックして、**OrderDate**を選択します。これで、OrderDateにフィルターを適用できるようになります。

![Screenshot 2024-10-25 at 13.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/36c6897b-15ba-d16e-7b6b-fd2505e4ed8f.png)

このように2011年のデータのみにフォーカスすることができます。

![Screenshot 2024-10-25 at 13.26.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b077f83e-203b-37fa-8a09-96eff4272723.png)

## ダッシュボードの公開

ここまでダッシュボードの設定を行ってきましたが、このダッシュボードは**下書き**の状態です。他のユーザーが参照できるようにするには、ダッシュボードを**公開**する必要があります。

画面右上の**公開**ボタンをクリックします。

![Screenshot 2024-10-25 at 13.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9e64a95c-76c3-02d5-ee11-3a5711396afe.png)

公開設定のダイアログが表示されます。

![Screenshot 2024-10-25 at 13.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/72e4bcf5-476e-7489-55ba-0336fa9d38ae.png)

まず、一番上の**資格情報**です。これは、ダッシュボードを参照する際に**誰の資格情報**を用いるのかを設定するものです。

- デフォルトの**資格情報を埋め込む**は、ダッシュボードを作成しているあなたの資格情報をダッシュボードに埋め込むことを選択します。これは、仮に参照ユーザーがダッシュボードでアクセスしているテーブルにアクセス権を持っていなかったとしても、ダッシュボードを作成したあなたがアクセス権を持っていれば、そのユーザーはダッシュボードを経由してそのテーブルデータを参照できることを意味します。プロトタイピングや機密性の低いデータを取り扱っている際にはこちらのモードでも大きな問題はありません。
- しかし、機密性の高いデータを取り扱っており、厳密な権限管理を実現したいのであれば、もう一つの**認証情報を埋め込まない**を選択すべきです。これによって、ダッシュボードの参照者自身の権限でテーブルにアクセスすることを強制できます。

![Screenshot 2024-10-25 at 13.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/46d86a84-b693-a444-a931-cb8325db3492.png)

**公開**をクリックすると、公開するダッシュボードにアクセスできるユーザーを選択する画面に遷移します。どのユーザー、グループにどのような権限を与えるのかを設定します。

![Screenshot 2024-10-25 at 13.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ca3236e0-5381-4680-6f6a-b8993a462eab.png)

設定したら右上の✖︎をクリックします。公開状態のダッシュボードに遷移します。

![Screenshot 2024-10-25 at 13.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/73726ef1-c82b-d042-e51a-cd5ae35ea6c5.png)

下書きに戻るには、画面上部中央のドロップダウンから**下書き**を選択します。

![Screenshot 2024-10-25 at 13.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8086e69a-319a-a9cb-801f-70727ce55c33.png)

ここまでで、以下を実施してきました。

- CSVファイルを取り込んでテーブルを作成
- アシスタントを活用したテーブルへの問い合わせ
- グラフ、ダッシュボード、フィルタの作成、ダッシュボードの公開

このような取り組みをもっと簡単にできないでしょうか？そこで、Genieの出番です。魔神の力を借りましょう。

# AI/BI Genie

サイドメニューから**Genie**にアクセスします。画面右上の**New**をクリックします。

![Screenshot 2024-10-25 at 13.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0c237d43-b9e0-015e-ba39-4407e1d46c47.png)

Genieとやり取りするには、Genieスペースという部屋を作成します。ここで、Genieが分析に行う際に参照するテーブルなどを設定します。

スペースの名前、SQLの実行で使用するSQLウェアハウス、そしてテーブルを設定します。テーブルは前のステップで使用したものと同じテーブルを選択します。

![Screenshot 2024-10-25 at 13.45.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4d0fa3ac-7855-09b6-33ea-b1e44cb44ff7.png)
![Screenshot 2024-10-25 at 13.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/387bb74a-9b7d-bdf3-dffe-95e037a146e2.png)

画面右下の**Save**をクリックすると、あなたのGenieスペースが作成されます。

右下のプロンプトボックスに問い合わせを入力することで、Genieが分析を行なってくれます。

> 月別の売り上げの推移

Genieは**対話型**で動作します。質問が不明瞭な場合にはGenieから質問されることもあります。やり取りを通じて分析結果を取得します。

![Screenshot 2024-10-25 at 13.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/641f678f-750e-2848-e776-947e0e5ef4b8.png)

集計結果などデータを取得した際には、その下にクイックにグラフを作成するためのボタンが表示されます。**折れ線グラフ**をクリックします。

![Screenshot 2024-10-25 at 13.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/02593c90-92e9-855a-7b66-49a15d60bcd4.png)

SQLエディタを使用した際には少なくとも10分以上要した作業が今回は数分で完了しました。

また、Genieには[AI Playground](#ai-playground)で触れたシステムプロンプト相当の機能もあります。画面右の**指示**のアイコンをクリックします。ここに表示されるボックスに指示を入力することで、Genieの挙動をカスタマイズすることができます。

例えば、以下のような指示文を入れます。

```
- あなたは売り上げデータの日本人の専門家です。質問に対して日本語で回答します。
- 結果は必ず1000で割ってください。
```

こうすることで、あなたのやりたいことに合わせたGenieを活用できるようになります！

![Screenshot 2024-10-25 at 13.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/765c0b89-072e-69ca-6ac6-6cb1956119c3.png)
![Screenshot 2024-10-25 at 13.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/508248e9-f0cc-29e3-7ff0-f3e6d49add82.png)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)