初めてのエージェントフロー:JSON をループ処理して 1 件ずつ取り出す方法 中級NO4

【今回の記事では、AIエージェントの核心である専用ロボットを作成して連携します】

エージェントフローとは何か?

トピック(家の中のチーム)ではできない作業を代わりに実行してくれる 外部の専用ロボット です

トピック:家の中で会話しながら動くチーム

トピックは、家の中で暮らしている家族のような存在。

  • 会話の流れを理解する
  • 状態(コンテキスト)を共有する
  • 変数を渡し合う
  • すぐに連携できる

つまり、家の中でできることはトピックだけで完結します。

エージェントフロー:家の外で働く専用ロボット

一方、エージェントフローは 家の外に待機しているロボットです。

  • トピックから指示を受けると起動する
  • 家の外(Power Automate)で作業する
  • 結果を持って家の中に戻ってくる
  • トピックではできない作業を代行する

例えるなら:

  • 外の倉庫に行って在庫を確認するロボット
  • 外部 API にアクセスするロボット
  • Excel や SharePoint を操作するロボット
  • 大量データを処理するロボット

つまり、トピックの能力を拡張する外部作業員です

今回の記事では、エージェントフローと連携しながらJSONデータを操作します

トピック内ではJSONデータから1つづつデータを抽出して、メッセージで表示します

はじめに

今回の記事から本格的にJSONデータを扱うとともに、エージェントフローも初めて作成してみます

最初に「JSON」と「エージェントフロー」について、重要なポイントを事前に解説いたします

JSONを扱うということ

前回の記事でJSONの文法などは解説しました

ただし、

ここからエージェントフローと絡めて本格的にJSONデータを扱ううえでは、絶対に知っておいて頂きたいことがあります

ここを知っていないと後々かなり混乱しますので、絶対におさえておきましょう!

変数化

複数の便箋に文章を書いて、郵便ポストに入れる場面を想像してみてください

ここで複数の便箋はJSONデータと同じようなものだと思ってください

文章を書いた便箋はどうしますか?

郵便局で設定したルールに基づいたサイズの封筒に入れますよね?

封筒に入れるから郵便局でも「郵便」として認識できます

Copilot Studio内でも同様です

指定した方法で変数に入れてはじめて、JSONデータをCopilot Studio内で扱えるようになります

ここを意識しておくと、以降の話がスムースになります

構造化

便箋を封筒に入れたらおしまいではないですよね

封筒に入れたら、宛先や自分の住所などを封筒の上に記載しますよね

以前の記事で「郵便API(郵便番号データ配信サービス)」について触れました

郵便が届くように「郵便番号」からはじまって、住所を構造的に示すことで「どの配達員」でも郵便を指定の場所に届けられるようにします

これはCopilot Studio内でも同様です

構造を示さなかったらJSONはただの文字列になり、どう一つ一つを抽出していいかがわかりません

ですので、JSONデータの構造化が変数化の次に重要になります

テーブル化

ここまでJSONについては「変数化」「構造化」についてお話しました

最後はテーブル化です

封筒に入れて宛先を構造化して示した郵便も、複数の便箋を1枚1枚取り出してもらわないといけません

JSONデータも同様です

1レコード1レコード(エクセルで言えば行にあたる)を取り出せるようにしないといけません

この辺りは後で、実際の例でお話したいと思います

エージェントフローを扱うということ

このブログ記事の冒頭で、エージェントフローは家の外で働く専用ロボットという風に表現しました

家の外で働くということはどういうことか?

家の中だけではできない作業を、 外の道具を使って実行してもらう。

そのためには、 同期・更新・通信 の 3 つがとても重要になります

これらの点もこの記事でぜひおさえておいて頂きたいです

同期(Sync)

道具は家の外にありますので、家の中(トピック)と 同じ情報を共有している状態を保つことが重要になります

例: トピックが送った JSON をフローが正しく受け取る。

一番問題となるのは、変数の受け渡しです

トピックからは2つ変数を渡すようになっているのに、エージェントフローは3つ受け取るようになっている場合などです

変数の受け渡しは、常に整合性が取れていないと正しくエージェントフローが動きません

更新(Update)

ここで言う更新とは、外で処理した結果を家の中の会話に 反映させることです

例えば、エージェントフローとトピック間での同期を設定したとします

その後に、エージェントフローの内容を更新させたとします

この場合、エージェントフロー内で「公開」という処理をしないと更新内容はトピックに反映しません

家の外にいるロボットなので、この辺りは気を遣う必要があります

通信(Communication)

家の中と外が 正しい形式でデータをやり取りすることももちろん重要です

例:

  • JSON 形式で渡す
  • JSON 形式で返す
  • キー名を揃える
  • 型(文字列/数値)を揃える

これができていないと、家の中と外が噛み合わないので、常に意識しておく必要があります

実際に作成する

今回作成するエージェントとエージェントフロー

今回はハンバーガーショップのメニューをJSONデータをもとに表示する、エージェントを作成します

全ては以下のJSONデータが起点になります

[
  {
    "Category": "ハンバーガー",
    "ProductName": "ガッツバーガー",
    "Price": 500
  },
  {
    "Category": "ハンバーガー",
    "ProductName": "チーズバーガー",
    "Price": 600
  },
  {
    "Category": "ハンバーガー",
    "ProductName": "たまごバーガー",
    "Price": 650
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Sサイズ",
    "Price": 200
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Mサイズ",
    "Price": 300
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Lサイズ",
    "Price": 400
  },
  {
    "Category": "シェイク",
    "ProductName": "チョコレートシェイク",
    "Price": 220
  },
  {
    "Category": "シェイク",
    "ProductName": "バナナシェイク",
    "Price": 220
  }
]

ところで、

見出しで「エージェント」と「エージェントフロー」を分けて表示したのには意味があります

下の画像(クリックで拡大可)のようにエージェントフローはエージェントとは別に作成し、複数のエージェントで共有が可能なのです

ですので、この後はエージェントを作成しながら、エージェントフローは別途作成することになります

新しくエージェントを作成する

まず新しくエージェントを作成します

そして、メニュー表示トピックを別途作成します

このトピックでは①エージェントフロー呼び出し、②JSONデータ受取、③抽出を行います

①を行うためには、まずはエージェントフローを作成します

エージェントフローの作成

トリガー設定

エージェントフローはCopilot Studio画面左の「フロー」から作成します

次に開いた画面で「新しいエージェントフロー」を作成するクリックします

この後、トリガーを設定します

ここで話を「エージェントフローは 家の外に待機しているロボットです」という話に戻しましょう

エージェントフローを起動するには、イベントが必要なのです

「トリガーの追加」ではエージェントフローを起動させるためのイベントを追加します

トリガーの追加ボックスで「エージェント」の文字列で検索します

すると上の画像のように「エージェントがフローを呼び出したとき」アクションを設定できるようになります

JSONの設定

次に下の画像にて「データ操作」で検索を行ってください

そうすると「データ操作」コネクタ一覧が表示されます

コネクタとは家電の専用リモコンみたいなものです

クーラーのリモコンから電源を入れることもできるし、温度も調整できます

エージェントフローには以下のようなリモコンが用意されています

  • エクセルのコンセント
  • TEAMSのコンセント
  • メールのコンセント

リモコンにアクセスすれば色んな家電が利用できます

ここで本題に戻ります

データ操作コネクタから「作成」を選んでください

上の画像の黄色の箇所に、下のJSONデータを貼り付けてください

[
  {
    "Category": "ハンバーガー",
    "ProductName": "ガッツバーガー",
    "Price": 500
  },
  {
    "Category": "ハンバーガー",
    "ProductName": "チーズバーガー",
    "Price": 600
  },
  {
    "Category": "ハンバーガー",
    "ProductName": "たまごバーガー",
    "Price": 650
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Sサイズ",
    "Price": 200
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Mサイズ",
    "Price": 300
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Lサイズ",
    "Price": 400
  },
  {
    "Category": "シェイク",
    "ProductName": "チョコレートシェイク",
    "Price": 220
  },
  {
    "Category": "シェイク",
    "ProductName": "バナナシェイク",
    "Price": 220
  }
]

下の画像がJSONデータを貼り付けた状態です

この上の状態がなんなのか?

前述のJSONデータの変数化になります

これでJSONデータが変数としてエージェントフロー、エージェントで利用できます

ただ、

このままだとなぜこの状態が変数化なのかがピンとは来ないと思いますので、詳細はまた後で解説させて頂きたいと思います

次に進みます

次にもう一度アクションを追加してください

トピックへの連絡

追加したアクションの画面で「エージェントに応答する」を検索して「エージェントに応答する」アクションを追加します

以下が「エージェントに応答する」アクションが追加された状態です

次に上の画像の黄色の箇所「+出力を追加する」ボタンをクリックしてください

そうすれば「出力の種類」を選択できるので、「テキスト」を選択してください

これで、家の中にいるトピック達がロボットが出力する内容を受け取れます

まずトピックへの連絡にJSONと名前を付けましょう

後で、トピックは「JSON」という名前でエージェントフローの出力内容を受け取れます

これが前述の「JSONを扱うということ」で解説した変数化です

データ操作コネクタ「作成」アクションにJSONデータを入れて出力することでエージェントフロー、エージェントでJSONデータを変数化して扱うことができます

話を戻します

その後、「応答に使用する値を入力してください」の欄をクリックして前のアクションの内容を選択できるようにしてください

下の画像の黄色の箇所をクリックすることで、前のアクションの出力を利用できるようになります

よく意味がわからない?という方は前のアクションの名前を変えてみてください

アクションの右側の3点リーダーをクリックすると「名前を変更する」が選択できるようになります

下の画像はアクションの名前を変えた状態です

これで、次のアクションにて前後の意味合いを明確にしたうえで選択がしやすくなります

実際に指定するのは、下の画像のように「作成JSON」の下にある「出力」です

この点はご注意ください

トピックとの連携設定

これでアクションの設定は完了したので、右上の「下書きを保存する」をクリックしてください

次に下の画像の「無題」の右横、「概要」をクリックしましょう

次に開いた画面で「編集」をクリックします

そうすると、フロー名やフローの内容を設定できます

ここで、前述の内容「エージェントフローを扱うということ」に戻ります

「エージェントフローを扱うということ」で述べたのですが、「同期」「更新」「通信」が重要です

「同期」「更新」のためにはエージェントフローに分かりやすい名前を付けることが重要です

今回は「JSON取得」と名前を付けました

ここから更にもう一点、「同期」「更新」のために追加処理があるので上の画像の「デザイナー」をクリックしてください

次に開いた画面で「公開」というボタンがあります

こちらで「公開」処理を行ってはじめて「エージェントフロー」がトピックに同期・更新されます

公開する前に一度、エージェントフローを保存して「名前」を付け、その後「公開」するのがポイントです

この点は本当に重要なので、ぜひ意識しておきましょう

これでエージェントフローの処理は終了です

トピックの完成

エージェントフロー呼び出しのノードを追加

再度「メニュー表示」トピックに戻りましょう!

ここから「ツールを追加する」カードを追加します

次にツールを検索します

これで作成したエージェントフローを呼び出せるようになりました

次に「メッセージを送信するカード」を設定します

上の画像の変数:Xマークをクリックするとエージェントフローで名前を付けた「エージェントフローの出力」が選択できます

ここからトピック間の連携を下の図のように完成させましょう!

上がトピック間とエージェントフロー間の連携が完了した時に図になります

この時点では会話の開始トピックから「メニューの表示」トピックを呼び出せるようになっていません

ですので、会話の開始トピックに移動して「メニューの表示」トピックを呼び出さるようにしましょう

これで会話の開始トピックからエージェントフローを呼び出す「メニューの表示」トピックをよびださせるようになりました

ここで一度、新しいテストセッションを動かしてみましょう

新しいテストセッションを動かすと、下の画像のようにエージェントフローで設定したJSONデータが表示されます

JSONから個のデータを取り出す

JSONデータの構造化

ここからは前述の「JSONを扱うということ」の「構造化」の話になります

「メニューの表示」トピックにまた戻ります

上の画像の「メッセージを送信する」カードは削除しておきましょう

次に変数管理から「値を解析する」をクリックしてください

次に、下の画像のように追加した「値を解析する」カードに、エージェントフローから受け取った変数:JSONを設定します

次は「データ型」を設定します

下の画像のようにデータ型の種類は、下向きの矢印から一覧を表示しましょう

ここで、上の画像の一番下の「サンプルデータから」を選択しましょう

そうすると次の画面が開きます

上の画像の画面には変数化したJSONデータを貼ります

[
  {
    "Category": "ハンバーガー",
    "ProductName": "ガッツバーガー",
    "Price": 500
  },
  {
    "Category": "ハンバーガー",
    "ProductName": "チーズバーガー",
    "Price": 600
  },
  {
    "Category": "ハンバーガー",
    "ProductName": "たまごバーガー",
    "Price": 650
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Sサイズ",
    "Price": 200
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Mサイズ",
    "Price": 300
  },
  {
    "Category": "ポテト",
    "ProductName": "ポテト Lサイズ",
    "Price": 400
  },
  {
    "Category": "シェイク",
    "ProductName": "チョコレートシェイク",
    "Price": 220
  },
  {
    "Category": "シェイク",
    "ProductName": "バナナシェイク",
    "Price": 220
  }
]

下の画像がJSONデータを貼った状態です

この状態から右下の確認ボタンを押します

下の画像が「確認ボタン」を押した後の状態です

次に「スキーマを編集する」をクリックしましょう!

下の画像がクリックした後の画像ですが、赤字の3行に注目しましょう!

Category」「Price」「ProductName」これらはJSONデータが構造化されたということです

もう少し詳細には解説すると、3つの列(カラム)から構成されるテーブル形式の構造化が行われたということになります

加えて、各列のデータ形式も定義されています

これでJSONデータを構造化して扱えるようになりました

テーブル化

最後に下の画像のように構造化したJSONデータを格納する変数を設定しましょう

今回はmyTableとして変数を設定しました

これで、エクセル形式であれば下の画像のような状態でデータが格納されるようになります

次に変数管理から「リスト全体をループする」カードを設定しましょう

次の画像が上のカードを追加した後の状態です

次に「ループする項目」を設定しましょう!

設定するのは、JSONデータを構造化した「myTable」がループする項目です

ループ値の変数は上の画像の「LoopValu1」のまま使用しましょう

テーブルから行(レコード)や値の取り出し

ここからはテーブル内の各レコードや値を取り出しましょう

上の画像の+ボタンにカードを追加すると、エクセルで言えば1行1行単位で処理をすることになります

それでは実際に+ボタンを追加しましょう

メッセージを送信するカードを追加して変数:xボタンを追加すると、テーブルの行の内容を色んな切り口で抽出できます

選択できる内容をもう少し詳細に確認してみましょう

上の画像であれば、「テーブル」の「Price列」の内容を数字で抽出するという内容になります

それでは、上の画像のように抽出した内容がなんなのかを明確にして「メッセージを送信する」カードを作成しましょう

ちなみにLoopIndex1というのは、抽出内容には存在しないのですが、自動的にCopilot Studioが設定しておいてくれるものです

それでは実際に新しいテストセッションを開始してみましょう!

JSONデータがユーザーが可視化できる形で表示することができています!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です