Databricks の AI 関数がすごかったので AI/BI ダッシュボードに活用してみる

## はじめに

[Databricks Foundation Model API を使用する AI 関数](https://learn.microsoft.com/ja-jp/azure/databricks/large-language-models/ai-functions#--ai-functions-using-databricks-foundation-model-apis) がめっちゃよかったので紹介したかった.

AI/BI ダッシュボードでの活用例ということで、ノートブックでデータ処理～ダッシュボードで可視化～フォローアップ用のGenieという流れを組んでみる

## 注意事項

2024/09/10時点の情報です。

また、 今回使用している AI 関数は、 [トークンごとの支払いがサポートされているリージョン](https://learn.microsoft.com/ja-jp/azure/databricks/machine-learning/foundation-models/#required)　のみサポートされているので、東日本では実行ができません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7bf00dc1-1632-2d5d-3035-fd07cd991a1d.png)


## シナリオ

[Databricks sample データセット](https://learn.microsoft.com/ja-jp/azure/databricks/discover/databricks-datasets)の[amazon データセット](https://qiita.com/ryoma-nagata/items/5f34c8f40cbced373ab0#amazonreadmemd) を使用していきます。

このデータセットには購入者のレビューが入っているため、分類してやることで効率的にデータをグルーピングし、掘り下げる対象を見つけていくことができるねらいです。

これを [Databricks AI/BI ](https://learn.microsoft.com/ja-jp/azure/databricks/ai-bi/) で可視化分析します


## 準備

データを確認して、一旦検証のテーブルに保存

```python:pyspark

df = spark.read.parquet("/databricks-datasets/amazon/data20K/")

display(df.describe())
display(df)

df.write.mode("overwrite").saveAsTable("main.qiita.raw_amazon")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/796ea18b-68b2-17a3-3a0a-6f55d1648cbf.png)

## ノートブックでデータ処理 （ SQL での AI 処理）

AI function を使った結果を見ていきます。

### 翻訳 (ai_translate)

[ai_translate](https://learn.microsoft.com/ja-jp/azure/databricks/sql/language-manual/functions/ai_translate)を使います。

英語ワカランの民なので、現在この関数は日本語にはチューニングされておらず、サポート外なのですが、ダメ元で日本語訳をかけます

動きました。分類を決めるための概観を知りたかったので十分です

```sql:sql

SELECT * , ai_translate(review, 'ja') FROM main.qiita.raw_amazon
LIMIT 20

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9fc153be-2a28-bd64-006e-613b784f6d98.png)


### 分類 (ai_classify)

[ai_classify](https://learn.microsoft.com/ja-jp/azure/databricks/sql/language-manual/functions/ai_classify)を使います。

こちらも日本語で分類先を定義してみます。

かなり適当に分類先を決めましたが、機能していることがわかります。

```sql:sql

SELECT * 
  , ai_translate(review, 'ja') as review_ja
  , ai_classify(review,array(
    '日用品'
    ,'デジタル機器'
    ,'映画・書籍'
    ,'食料品'
    ,'医薬品'
    ,'家具'
    ,'衣服'
    )) as classify
FROM main.qiita.raw_amazon

LIMIT 20

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b4e2389d-5502-91d3-890f-71514922f972.png)


なお、この程度の分類であればおおむね利用できるレベルでは分類できていましたが、宅配の問題など、しっかり読み取る必要のあるような分類は思うような効果が出せませんでした。

最後に、処理したデータを保存します。
この関数、現時点では処理が重くレート制限もきついみたいなんで、1000件でやりました。


``` sql:sql

CREATE
OR REPLACE TABLE main.qiita.enrich_amazon AS
SELECT
  *,
  ai_translate(review, 'ja') as review_ja,
  ai_classify(
    review,
    array(
      '日用品',
      'デジタル機器',
      '映画・書籍',
      '食料品',
      '医薬品',
      '家具',
      '衣服'
    )
  ) as classify
FROM
  main.qiita.raw_amazon
LIMIT 1000

```


## AI/BI ダッシュボードで可視化

[AI/BI ダッシュボード](https://learn.microsoft.com/ja-jp/azure/databricks/dashboards/)を作っていきます。

基本的な仕組みとしてクエリ結果=データセット作成→ビジュアル化となっていますが、ビジュアルごとにデータセットを作らずに、今回は同じデータセットをソースにすることでビジュアル間のクロスフィルター機能を使うこと意識してみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/82561db2-fc40-a6c7-7c57-2fda87ded1e4.png)

ダッシュボード作成ボタンで作っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0b243461-0083-e768-3174-821007d00973.png)

データを追加。このsqlをビジュアルで表現したい内容に合わせて加工していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ff886c53-8c0e-63eb-182a-94ec028353e7.png)

名前提案してくれるの地味にうれしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b853ddba-ab76-c7e2-08de-44fcabdf564b.png)



### 単純な件数の表示

カウントはクエリを書かなくても用意されています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0702da82-c0a7-b9c7-bc17-f6741a56c09c.png)


### レーティング 2～1 の件数の表示

データを変えていきます。この程度なら SQL 上で問題ありませんが、この手の描画用の加工は固まったらあらかじめテーブル化するようにしましょう。

```sql:sql

select * 
    , case when rating <= 2 then 1 else 0 end low_rating_count

from main.qiita.enrich_amazon

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5cf34f81-10ee-8367-4143-722393c6beee.png)

今度は試しに AI にビジュアルを選んでもらいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9052ef1a-383b-4a50-5531-bf90b50714ac.png)

いい感じです。タイトルも自動付与してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a15f8746-2768-a8aa-31d6-569b9434e5e9.png)

承認して位置を調整

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bf307eae-a8b6-3655-ddc7-e5434e29bbb3.png)

### レーティングの分布をみる

棒グラフで分布を確認します。1000件で切っちゃったので rating=5 がなくて残念です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7de6c18f-ad9d-9677-86e1-4dda459b5170.png)

### AI 分類での分類を見る

次は AI 分類をビジュアルに活用します。多くが日用品とデジタル機器であることがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/52c8a927-7bb2-07ff-71af-ea70e99d6a62.png)

### テーブルとしての情報も表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8c315f9a-c547-b75a-d8dd-9bfef0efc46f.png)

条件付き書式も設定してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9bda3c62-1169-ea8a-3e4b-5260022e28ac.png)


### クロスフィルターの動作を確認

円グラフからデジタル機器をクリックするときちんとそのレビューに絞られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2ba11d4f-1ef8-c1bc-bc18-a6d99c467c80.png)


## Genie スペースの作成

フォローアップ用のGenie スペースを作成します。

右上のケバブメニューで Genie スペースを作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/61fe2d18-91f1-beb8-d4e4-1e497ed4a561.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b64d6f42-d1f4-e8b7-71a8-037481f6078b.png)

ダッシュボードから作成された Genie にはあらかじめ[Example SQL　Queries](https://learn.microsoft.com/ja-jp/azure/databricks/genie/#provide-instructions)が設定されていることがわかります。例文を選択してチャットしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/feaf88ee-c84b-087c-7081-734552f3b142.png)

### 件数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a1d63af3-39f3-4725-4819-377cdba6702a.png)

### 低いrating の件数
きちんとダッシュボードで使っていたクエリをベースにしていますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c56af9c0-484a-5fb4-06d5-74b1ef2cf377.png)


### rating の分布

こちらも正常に出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/38b71268-08eb-1c60-23ea-2061465101b7.png)

### ダッシュボードでリンク確認

最後にダッシュボードから Genie スペースへの導線を敷くために、URLを取得します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/dcc3e7d1-4864-00b3-9a70-3fda9e353f41.png)

genie へのリンクから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/97598e84-de00-cb53-bf68-6c68c856a664.png)

先ほどのURLを張り付けると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0c6fa767-a913-7c7b-33a3-352a2c8f1b3f.png)

ダッシュボード上に Genie 起動ボタンが追加されます。（内容は先ほどのURL に対してのmarkdownでのリンク）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bd0da996-1840-c6a6-9fd3-2f7ceb2f2552.png)

これで AI / BI ダッシュボードの完成です


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/31568bd3-e623-4713-d10c-7df060e6b9ad.png)