[Power BI] データをAzure Open AIで拡張しよう😀

# はじめに

2023年最後の投稿。
今年はChat GPTを中心に、社会にAIが普及した一年でした。Power BIやFabricでもCopilotが登場し、私の環境でも少しずつ触れるようになってきました。様々な場面でAIを活用することができるようになってきた昨今ですが、もちろんPower BIのレポート作成においても、Azure Open AIのAPIを利用してデータを拡張することが可能です。手元のデータをAIを利用して拡張すれば、さらに幅の広いレポート作成ができるようになります。

手順がわかれば、あとは**プロンプトを書き換えるだけでいろいろなシナリオに対応**できます。年末年始のお休みで試してみてください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/f5d0ff25-e78c-8220-345a-ea3e58b4d304.png)
**「Power BIとAI」** をテーマに、Microsoft Designerで作成。

# やってみたこと

ブログのRSSを取得し、本文の内容をもとに、Azure Open AIに要約を作成してもらいます。

# 手順

1. 事前準備
    - サンプルデータの準備
    - Azure Open AI のAPIを利用できるようにしておく
1. パラメーターを作成
1. 空のクエリを作成→詳細エディターで関数のひな型を作成する
1. 関数を作成
1. 用意したサンプルデータの列にカスタム関数列を作成

# 事前準備① サンプルデータ

日本マイクロソフト Power BI サポートチームのブログからRSSを取得します。

**Japan CSS Support Power BI Blog**
https://jpbap-sqlbi.github.io/blog/powerbi/pbi_activity_log_usage_metrics/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/80f6ec8a-2719-f764-09cc-51f0edb1207b.png)

```RSS.rss
https://jpbap-sqlbi.github.io/blog/atom.xml
```

RSSの読み込みは「Web」コネクターを利用します。 Power Query エディターの **新しいソース →　Web** と進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/16b03680-991d-2274-89c9-01f1fc3d8814.png)

取り込めたら、Table形式になっている列を適当に展開しておきましょう。　**content列に記事全文が入っている**のが確認できます。展開をしたうえで、「記事全文」と列名も変更しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/15a05d42-51f3-3971-c6a4-3bef185e36c9.png)

# 事前準備② Azure Open AI APIのエンドポイントとKEYを取得する。

この辺のドキュメントを参考にAzure Open AIを利用できるようにしておく。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/chatgpt-quickstart?tabs=command-line%2Cpython&pivots=programming-language-studio

リソースを作成後に、エンドポイントとKEYは **チャットプレイグラウンドの「コードを表示」** から取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/002e83e6-7944-aa5d-91de-c67a54068e8f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/622092e9-0cab-591a-9865-9a937970a1f5.png)

# パラメーターを作成する

サンプルデータとKEYが用意できたら、Azure Open AIを利用する準備を進めます。
Power Queryエディターの**パラメーターの管理**から、新規パラメーターを作成します。

パラメーター名や各種項目は、Azure Open AIに渡したいデータと合わせて任意に設定しましょう。今回は記事の要約を作成したいので、**article**とし、型はテキストです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/c28eeef2-2c11-4f31-112d-44e50b4edf70.png)

パラメーターの作成が終わると、Power Query エディターはこんな感じで表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/6286bc6f-d751-8051-8b09-937109d0be42.png)

# 関数のもとになる「空のクエリ」を作成 → 詳細エディターで開いて編集

次に、このパラメーターを利用した関数のもとになるクエリを作成します。Power Query エディターの**新しいソース → 空のクエリ**を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e4c33cd8-8ad7-819f-1b27-a934775f64a5.png)

新たにできたクエリは「要約」という名前にしておきます。そのうえで、**詳細エディター** を開きます。以下のクエリを貼り付けて、`<Endpoint-URL>` と `<API-KEY>` は自身のものに置き換えます。パラメーター類も適切な数字に置き換えてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/5dd7ec06-af7b-064a-1c0f-4b666abc99e2.png

:::note
SystemRole、UserRoleのプロンプトと、各種パラメーターはご自身のシナリオに応じて自由に変更してください。パラメーター類の詳細はこちらを参照
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/reference
:::

```
let
    URL = "<Endpoint-URL>",
    Key = "<API-KEY>",
    Header = [#"Content-Type" = "application/json", #"api-key" = Key ],
    SystemRole = "{""role"": ""system"", ""content"": ""# 命令　あなたは優秀なAIアシスタントです。ブログURLを与えるので、それをもとに200文字以内で要約ください。HTMLタグはすべて除去して、日本語で回答してください。冒頭に「Microsoftの公式ウェブサイトに掲載されている記事です。」はつけなくていいです。## 制約条件 英語は日本語に翻訳すること。出力結果は必ず日本語にしてください。""}",
    UserRole = "{""role"": ""user"", ""content"":""" & article & """}",
    Contents = "{""messages"" : ["
        & SystemRole
        & ","
        & UserRole
        & "],
        ""temperature"": 0.4,
        ""top_p"": 0.95,
        ""frequency_penalty"": 0,
        ""presence_penalty"": 0,
        ""max_tokens"": 16000,
        ""stop"": null
        }",
    Response = Json.Document(
        Web.Contents(
            URL,
            [
                Headers = Header,
                Content=Text.ToBinary(Contents)
            ]
        )
    ),
    choices = Response[choices]{0}[message][content]
in
    choices
```

# 関数を作成

作成した「要約」クエリをもとに関数を作成します。右クリックして **「関数の作成」** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e0a6be4b-9085-1d85-c411-0c1f3ee8516d.png)

名前は「要約関数」にしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/ab11805a-d1bd-5f5f-33b5-600adf1707c3.png)

関数を作成すると自動的に今まで作成した成果物がフォルダに入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/6a95d8ae-c4a1-7e41-fc09-86bd4a835d04.png)

# 関数をデータに適用する

作成した関数をデータに適用していきます。
**「列の追加」** タブから **「カスタム関数の呼び出し」** をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/73bd3493-9dd6-c2ba-3002-ce7a83841546.png)

新しく作成する列名、呼び出す関数、その関数を適用する列名を選択します。今回の場合は、新しく「記事要約」という列を作成。さきほど作成した要約する関数を、「記事全文」列に適用していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/8fdebc4a-b31d-e27f-9729-13274b8707c7.png)

# 要約完成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/efd98f53-cd9c-70fb-2c2a-2a8d8281d0d4.png)


https://jpbap-sqlbi.github.io/blog/powerbi/performance/

この記事が、以下のように要約されました。

↓

> Power BI Serviceでデータ更新を行う際に、メモリの制限を超えてしまうエラーが発生することがあります。このエラーが表示された場合、クエリや計算がメモリを多く使用している可能性があります。クエリや計算を単純化するか、Power BI Premiumを使用している場合は、容量管理者に連絡してクエリごとのメモリ制限を増やしてもらうことができます。詳細はリンク先をご確認ください。

# まとめ

今回は200字での要約を支持していますが、これを文字数を増やしたり減らす、文体を固くする、柔らかくする、プロンプト次第で自由に変更可能です。場合によってはモデルを自社データを使用して拡張したりすれば、自由自在にデータ拡張が可能です。

2024年もPower BI（Fabric）とAzure Open AIに活躍してもらうことは多いと思いますが、引き続き楽しみながら勉強していきたいと思います😁