検証!! AI BuilderでDataverse以外の表データをデータソースとして扱えるか!?

::: note info
この記事は**2024.12.18**時点の情報です。
数日後には不要になる可能性があります。
:::

# はじめに
`Power Automate`と`Power Apps`で非常に気軽にAIの機能が使える、それが[AI Builder](https://learn.microsoft.com/ja-jp/ai-builder/overview)。
この`AI Builder`では**強力な生成 AI 機能**`Azure OpenAI Service`の`GPT 4o Mini`または`GPT 4o`モデルを使用することができます。

https://learn.microsoft.com/ja-jp/ai-builder/

https://learn.microsoft.com/ja-jp/ai-builder/create-a-custom-prompt

やはり生成AIというと、この`GPT`のモデルが気軽に使えるということは非常にうれしいことです。

`Microsoft`はAIのガイドも豊富に提供しており、プロンプトのイロハから生成AIの活用シーンまでくまなく`Microsoft learn`で紹介しています。

https://learn.microsoft.com/ja-jp/ai-builder/create-a-custom-prompt#download-ai-builder-prompt-engineering-guide

事前構築されたプロンプトにより、下記はサクッと用意することができます。
1. テキストの要約
1. テキストから情報の抽出  
1. テキストの分類
1. テキストの感情分析  
1. 苦情への応答
1. テキストの匿名化と編集
1. 言語の検出
1. 単語の頻度分析
1. テキストの種類の特定 
1. 2つのテキストから類似性や相違性の測定

一方で実際に **これがやりたい！**となるのは、**あるデータソースからデータを照合し、回答するような機能ではないでしょうか。**
いわゆる`RAG（検索拡張生成）`というやつです。

# 独自のデータを試用した生成シナリオ
`2024.12.18`では、データ オプションを利用して、`Dataverse`テーブルをナレッジソースとした回答が生成できます。
`Dataverse`テーブルを用いて、値を抽出し回答に使えます。

https://learn.microsoft.com/ja-jp/ai-builder/use-your-own-prompt-data

こちらの機能は`Power Automate`、`Power Apps`、`Copilot Studio`で利用することができます。

[公式の学習コンテンツから利用方法を学べます。](https://learn.microsoft.com/ja-jp/training/modules/ai-builder-grounded-prompts/?source=recommendations)

https://learn.microsoft.com/ja-jp/training/modules/ai-builder-grounded-prompts/?source=recommendations

前置きが長くなりましたが、ここからが本題です。
`SharePoint Lists`や`Excel`からやってみたいんだけどな・・・
と思ったそこのあなた！そうですよね！**まずはそこからですよね！！**

**ということで挑戦的な手法を用いて、実現する方法を考えてみました！**

# プロンプトに表データを書き込む
`超`がつくレベルの無理やりな手法ですが、プロンプトの中に`テキスト`形式で表を入れてみました。
`構造化されたテキスト形式の表データ`というと真っ先に思い浮かぶのは`CSV` 次点で`Markdown`が挙げられます。

消費するトークンが気になりますが、いったんプロンプトに全部含めて機能するか検証してみました。

## カスタム プロンプト
簡単に下記のように設定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/48cd448c-0d24-f169-164b-d1cd6da7a798.png)

```plaintext:カスタムプロンプト
以下にテキスト形式でCSV形式で表データが記載されています。出力はHTML文字列で返してください。
{Question}

# CSVデータ
{Table}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/1a823598-8b30-90fd-26c9-aa2501185006.png)

引数とするのは`Question - 質問`と`Table - CSVテーブル`です。

結果をプレビューするのは、やはり`Power Apps!!`
**Power Apps Loverとしてそこはゆずれません！**

`HTML文字列`で出力することを定義づけるため、[JSON 出力](https://learn.microsoft.com/ja-jp/power-platform/release-plan/2024wave1/ai-builder/define-specific-output-formats-prompt-builder)を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/aceca968-e008-8920-6283-99b520ea8ff4.png)

```json:カスタム形式
{
  "response": "HTML文字列"
}
```

https://learn.microsoft.com/ja-jp/power-platform/release-plan/2024wave1/ai-builder/define-specific-output-formats-prompt-builder

GPTで作成した`Product`というCSVデータで試してみましょう。

## Power Appsから呼び出す
今回の目的は`インポートされたExcel`や`Excel Online`、`SharePoint Lists`を想定した読み取りです。
`Power Apps`でCSV形式の文字列にかえます。

### インポートされたExcel
テーブル形式にしてPower Appsにインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b5699fa2-75b4-e308-ed39-891dd2bdcd12.png)

テキストへの変換は、[Concat 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-concatenate)で無理くり実施します。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-concatenate

```javascript: CSV変換を表すテキスト
$"ProductID,ProductName,Category,Price,StockQuantity,Rating,Features
{
    Concat(
        Product,
        $"{Char(34)}{ProductID}{Char(34)},{Char(34)}{ProductName}{Char(34)},{Char(34)}{Category}{Char(34)},{Char(34)}{Price}{Char(34)},{Char(34)}{StockQuantity}{Char(34)},{Char(34)}{Rating}{Char(34)},{Char(34)}{Features}{Char(34)}{Char(10)}"
    )
}"
```

列がハードコーディングになっていてイケてないですね。

このうち [Char 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-char)は下記を意味しています。
 - `Char(34)`:　`ダブルクォーテーション " `
 - `Char(10)`: `改行`

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-char

ダブルクォーテーションは`引用符`としての利用です。
果たして機能するのでしょうか。

## 検証！
```plaintext:実験1
製品名を一覧化してください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e2ecf1a8-c540-39a4-ea21-6cd44cc992fe.png)

```json:結果1
{
  "response": "<ul><li>Mouse</li><li>Printer</li><li>Monitor</li><li>Router</li><li>Tablet</li><li>Keyboard</li><li>Laptop</li><li>Smartphone</li><li>Smartwatch</li><li>Earbuds</li></ul>"
}
```

い、意外とそれらしい！！それらしいぞぉ！

```plaintext:実験2
最も高価な製品とその価格を教えてください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/50bfceea-0482-4097-aab4-3425bfb057ed.png)

```json:結果2
{
  "response": "最も高価な製品は「Monitor」で、価格は1165です。"
}
```

プレーンテキストで返ってきました。

```plaintext:実験3
軽さがポイントの製品を教えてください。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/3d667bd7-9dd2-81a1-acec-d04c38108e41.png)

`Lightweight`という特長を抽出できています。

```json:結果3
{
"response": "<table>
  <tr>
    <th>ProductID</th>
    <th>ProductName</th>
    <th>Category</th>
    <th>Price</th>
    <th>StockQuantity</th>
    <th>Rating</th>
    <th>Features</th>
  </tr>
  <tr>
    <td>101</td>
    <td>Mouse</td>
    <td>Wearables</td>
    <td>737</td>
    <td>384</td>
    <td>4.3</td>
    <td>Lightweight and portable<br>High-resolution display<br>Long battery life</td>
  </tr>
  <tr>
    <td>104</td>
    <td>Router</td>
    <td>Gaming</td>
    <td>659</td>
    <td>14</td>
    <td>4.4</td>
    <td>Lightweight and portable<br>High-resolution display<br>Long battery life</td>
  </tr>
  <tr>
    <td>113</td>
    <td>Laptop</td>
    <td>Wearables</td>
    <td>896</td>
    <td>94</td>
    <td>5</td>
    <td>Lightweight and portable<br>High-resolution display<br>Long battery life</td>
  </tr>
  <tr>
    <td>122</td>
    <td>Laptop</td>
    <td>Home Appliances</td>
    <td>1206</td>
    <td>263</td>
    <td>3.2</td>
    <td>Lightweight and portable<br>High-resolution display<br>Long battery life</td>
  </tr>
  <tr>
    <td>148</td>
    <td>Router</td>
    <td>Electronics</td>
    <td>1290</td>
    <td>422</td>
    <td>4.4</td>
    <td>Lightweight and portable<br>High-resolution display<br>Long battery life</td>
  </tr>
</table>"
}
```

Power Appsで文字列変換をかましているので`Excel Online`でも`SharePoint`でも同様の結果が得られます。

**SharePoint Lists**の場合は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/1a8a77e9-a8ca-2469-c3e4-a85d33275847.png)

```plaintext: 質問
評価が高い製品をリストアップして教えてください。
```

ソースが長いのでキャプチャだけ出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/56589090-db45-9f04-5e0d-19fd6934d6ec.png)

# おわりに
[Concat 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-concatenate)で変換をかましているので、そりゃあそうだと思われる方もいると思います。
しかしFAQから回答を生成したりするのに、意外と役に立ちそうです。

Power Automateではデータ操作アクションで[CSV テーブルの作成](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-create-csv-table-action)が存在するため、より簡単に使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/15374ac3-3d5a-c5d7-d9ad-242dccdbcf9f.png)

結果を`Teams`に投稿してみました。

https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-create-csv-table-action

**AI活用 はじめの一歩**に採用できればいいなーくらいです。
回りくどい方法ではあるので、活用される場合はよく吟味して採用してください。