はじめに
この記事は、社内ヘルプデスクや総務など、日々同じような問い合わせ対応に追われている非エンジニア職向けです。
「またこの質問か…」「前にも同じこと答えた気がする…」
そんな経験、ありませんか?
この記事では、Power Automate + Copilot Studioを使った、FAQを自動追記してくれるAgentとワークフローを紹介します。
このフローは従来型のチャットボット同様FAQから回答を生成するだけではなく、まだFAQにはない新規問い合わせの追記までやってもらう仕組みとなっています。
2026年7月時点での情報です。
ライセンス・課金条件は構成や契約内容、今後のアップデートにより変更される可能性があります。
導入の際はMicrosoft公式ドキュメントおよびご自身の環境でご確認ください。
記載の内容に誤りがある場合、早急に修正しますのでXのDMよりご連絡いただければ幸いです。
全体のイメージ
ざっくり言うと、こういう流れです。
問い合わせが届く
↓
Agentが「新規の質問」か「既出の質問」かをFAQリストと突き合わせて判断
↓
【既出の場合】→ FAQリストから回答を引用して自動返信
【新規の場合】→ Agentが回答案を作成 → 担当者が内容を確認 → OKならFAQリストに自動追記&回答送信
ポイントは、
新規の質問に答えるたびにFAQリストが自動で増えていくことです。
使えば使うほど、次から「既出」判定される質問が増えていきます。
また、上記のフローは
「新規の質問は回答をいきなり自動送信せず、必ず人の目を通す」
という仕組みになっています。
これによって、誤回答がそのまま出てしまうリスクを抑えつつ、FAQリストの品質を保ちます。
実際に動作させてみた動画はこちら
FAQを自動追記してくれるAgentとワークフローを作ろう pic.twitter.com/a47QhJFn90
— やなぎだ (@y4nag1d) July 19, 2026
フローの全体像はこちら
早速作ります
使うものは以下の2つです。
- Power Automate(クラウドフロー)
- Copilot StudioのAgent
ステップ⓪ 問い合わせの受付口とFAQリストを作る
今回はMicrosoft Formsで問い合わせを受け付け、SharePoint Listsに追記していく形にしました。
※フォームとListの作り方は省略します
※既存質問としていくつか質問と回答を追加しています
ステップ① 問い合わせを受け取って、送信者情報を揃える
新しい応答が送信されるとき(トリガー):
作成したFormsに質問が投稿された際に起動させる

フォームID → ステップ⓪で作成したFormsを指定
応答の詳細を取得する(Forms):
フォームの回答内容(件名・本文にあたる項目)を取得

フォームID → ステップ⓪で作成したFormsを指定
応答ID → 新しい応答が送信されるとき から取得できるID(triggerOutputs()?['body/resourceData/responseId'])を設定
ユーザー プロフィールの取得:
回答者の表示名を取得し、後続のメールで「〇〇様」と呼びかけられるようにする

ユーザー (UPN) → 応答の詳細を取得する から取得できる、
投稿者のメールアドレス(outputs('応答の詳細を取得する')?['body/responder'])を設定
Formsのトリガーだけだと回答者の表示名は直接取れないようです。
「ユーザー プロフィールの取得」を1アクション挟んで表示名を取得しておくと、後段のメール文面で「〇〇様」と名前を表示できるようになります。
ステップ② Agentに「新規か既出か」を判断させる
新規or既出か判断(FAQ判定Agent):
ここでCopilot Studioで作った「FAQ判定Agent」に、届いた問い合わせ内容とFAQリストを見比べさせ「これはもう回答済みの質問か、初めての質問か」を判断させます。
Copilot Studio側で作ったAgentを呼び出すためそちらでAgentの構築が必要です。
※細かい作り方は省略します。
まずはCopilot Studio側。「FAQ判定Agent」各種設定は以下の通りです。

入力された問い合わせもしくは類似の問い合わせが「問い合わせ対応FAQ一覧」のリストに存在するか確認し、存在したら「YES」存在しなかったら「NO」を出力
根拠のURLは出力しないでください。後続のフローに影響が出ます。
質問の詳細を追加で質問されたら、FAQにある回答を出力します。
その時は回答本文のみ出力。URLなどは不要です。
このAgentはプロンプトに記載の通り、FAQリストに存在するか確認し、
存在(既出の質問)したら「YES」存在しなかったら「NO」を出力します。

※今回ツール類は利用していません。
次にPowerAutomate側のアクションの設定です。

「メッセージ」はCopilot Studioに入力するプロンプトを指している項目です。
以下のようにFormsの内容を変数として与えます。
タイトル:
@{outputs('応答の詳細を取得する')?['body/r7306ddee2ff34097874a57695ebb973a']}
問い合わせ内容:
@{outputs('応答の詳細を取得する')?['body/rb1b998e5b5fd459d871b3afa674b7703']}
※r7306ddee...の部分には固有のIDが入ります
条件分岐:
Copilot Studioで作った「FAQ判定Agent」が出力した判断結果をもとにフローを条件分岐させます。
Agent側を「既出の質問ならYESを出力」という作りにしているため、YESが来たらTrueに流すという分岐にしてみます。

※「FAQ判定Agent」の出力 outputs('新規or既出か判断')?['body/lastResponse']にYESが含まれていればTrueの設定値
これで「FAQ判定Agent」が出力したYES/NOによって既出か新規か次のフローが分岐するようになりました。
ステップ③ 既出の場合 質問者へ回答を送信
既出の場合はFAQリストに載っている回答をそのまま引用して、自動でメール返信します。
ここは過去の問い合わせ内容と回答をそのまま出力するので担当者の確認なしで回答を送信します。
FAQリストの回答取得:
自身のやり方では先ほどの「FAQ判定Agent」にもう一度別のプロンプトを投げています。
会話IDの項目にoutputs('新規or既出か判断')?['body/conversationId']を入れることで先ほどのAgentのセッションから継続して会話ができます。
※チャット上でこんな感じで会話が継続しているイメージです。

この「FAQリストの回答取得」の出力としては
2個目の出力「経費精算は、費用発生日を含む月の~」が出力されるということです。
回答メールの送信_既出:
取得した回答をメール本文に差し込んで送信
宛先 → 応答の詳細を取得する の「Responders' Email」
件名 → お好みで(例:「【自動回答】お問い合わせいただいた件について」)
本文の回答部分 → FAQリストの回答取得 の出力(outputs('FAQリストの回答取得')?['body/lastResponse'])を差し込み
本文には、ステップ①で取得した表示名(「〇〇様」の呼びかけ)や、Formsから受け取った問い合わせ件名・内容も差し込んでおくと、「何の問い合わせに対する回答か」が一目でわかるメールになります。
ステップ④ 新規の場合(前半) 回答素案の生成と担当者への送信
新規の質問はいきなり自動送信せず、必ず担当者の目を通すという設計にしています。
これによって、間違った回答がそのまま外に出てしまうリスクを抑えつつ、FAQリストの品質を保ちます。
承認依頼はTeamsに以下のように届きます。

※システム名は架空のものです
ステップ④ 新規の場合(前半)では
- Agentが素案の作成を行う
- Agentの素案を人間の担当者に送信(確認依頼)するための承認の作成
の2つを行います。
回答素案作成:
既出判定用とは別の「回答素案作成Agent」に、件名・本文を渡して回答案を作らせます。
Copilot Studio側の「回答素案作成Agent」の各種設定は以下の通りです。

入力された質問に対して、社内業務規程集.docxから回答を作成します。
回答は本文のみ出力
FAQリストにない質問の回答を作成してもらうため、こちらのAgentには社内規程のドキュメントを読み込ませています。

こちらのAgentについてもツール類は使用していません。
PowerAutomate側のアクション設定は以下の通りです。

エージェント → 回答素案作成Agent
メッセージ →
タイトル:
@{outputs('応答の詳細を取得する')?['body/r7306ddee2ff34097874a57695ebb973a']}
問い合わせ内容:
@{outputs('応答の詳細を取得する')?['body/rb1b998e5b5fd459d871b3afa674b7703']}
※「FAQ判定Agent」と同様にFormsの内容を変数として与えます。
承認を作成:
作成された素案を担当者に承認依頼として送るためのTeams承認を作成します。

承認の種類 → カスタム応答 - 一つの応答を待機
応答オプション →
Item 1 このまま承認
Item 2 修正して承認
詳細の項目 →
Agentの回答素案:
@{outputs('回答素案作成')?['body/lastResponse']}
このまま送信する場合は「このまま承認」、
修正が必要な場合は下のコメント欄に修正後の回答本文を貼り付けた上で「修正して承認」を選択してください。
※Agentの出力を変数として承認画面で出させたいため@{outputs('回答素案作成')?['body/lastResponse']}を入れています。
ポイントは応答オプションです。
①内容に問題がなければそのまま通す
②内容が間違っていれば担当者がその場で修正
という2パターンの動きを作りたいため、標準の「承認/却下」ではなく
応答オプション1 このまま承認
応答オプション2 修正して承認
という設定値をカスタム応答で作成しています。
「修正して承認」は承認画面のコメント欄に修正後の回答本文を入力し、それを最終回答として採用する動きになります。

※標準の「承認/却下」ではなく「このまま承認/修正して承認」になってます
ステップ④(前半)まででガワだけができた状態なので、後半にて動作させるための残りの詳細な設定方法についても解説します。
承認を待機:
「承認を作成」で作った承認のIDを受け取って、担当者の応答(内容の確認結果)が来るまでフローを止めさるため「承認を待機」を挿入します。

承認ID → 作成した承認のIDoutputs('承認を作成')?['body/name']を設定
ステップ④ 新規の場合(後半) 担当者の確認と質問者への回答送信
ステップ④ 新規の場合(後半)では
- 承認の分岐作成
- SharePoint Listsへの追記
- ユーザーへのメール通知
の3つの作成を行います。
スイッチ:

受け取った値をどのケースに振り分けるかの判定材料として使います。
承認結果を判定材料にしたいため、
オン → 「承認を待機」の「結果」outputs('承認を待機')?['body/outcome']を入力
ここで先ほどの
応答オプション1 このまま承認
応答オプション2 修正して承認
に対応する動きを作成します。
なお、「既定」については他2つと異なり、入り口になる項目を作成していないため設定は不要です。
ケース1「このまま承認」:

「作成(Compose)」アクションを挿入。
アクションの名前→「最終回答_このまま」にリネーム
入力 → Agentの素案(outputs('回答素案作成')?['body/lastResponse']) を設定
※アクション名のリネームは後続のcoalesce式で参照するためです
ケース2「修正して承認」:

「作成(Compose)」アクションを挿入。
アクションの名前→「最終回答_修正版」にリネーム
入力 → 承認コメント(outputs('承認を待機')?['body/responses'][0]['comments'])を設定
※ケース1同様、後続のcoalesce式で参照するためアクション名をリネームします
outputs('承認を待機')?['body/responses'][0]['comments']について
承認者のコメントは「承認を待機」の出力の responses に入っていますが、承認者を複数人設定できる仕様のため、1人でも配列(応答の一覧) として返ってきます。
そのまま参照すると ["修正後の回答本文"] のように角括弧とダブルクォーテーション付きで出力されてしまうため、[0] で1番目の応答を指定し、['comments'] でコメント本文だけをプレーンなテキストとして取り出しています。
項目の作成(SharePoint):
FAQリストに「件名・問い合わせ内容・最終回答」を新規追加

サイトのアドレス → FAQリストのあるSharePointサイトを指定
リスト名 → ステップ⓪で作成した「問い合わせ対応FAQ一覧」を指定
各列にはFormsから受け取った内容と、確定した回答を入れます。
タイトル → 応答の詳細を取得する の「問い合わせ件名」
問い合わせ内容 → 応答の詳細を取得する の「問い合わせ内容」
回答 → スイッチで組み立てた最終回答coalesce(outputs('最終回答_このまま'), outputs('最終回答_修正版'))を入力
coalesce(outputs('最終回答_このまま'), outputs('最終回答_修正版'))について
coalesce関数は「先に見つかった空でない値を採用する」という関数です。
スイッチでは「このまま承認」「修正して承認」のどちらか一方のケースしか実行されないため、実行された側の「作成」アクションだけが値を持っています。
coalesceを使うことで、どちらのケースが実行されても「実行された方の値」が自動で回答列に入る、という仕掛けです。
これで、承認者が確定した回答がFAQリストに1行追加されます。
次に同じ質問が来たときは、ステップ②のFAQ判定Agentがこの行を見つけて「既出(YES)」と判定してくれる、というわけです。
回答メールの送信_新規:
問い合わせた本人に回答メールを送信します。
宛先 → 応答の詳細を取得する の「Responders' Email」
件名 → お好みで(例:「【自動回答】お問い合わせいただいた件について」)
本文の回答部分 → 項目の作成と同じcoalesce関数で最終回答を差し込み
メール本文への差し込みも「項目の作成」と全く同じ式でOKです。
これで、FAQリストに登録された回答と、質問者に届く回答が必ず一致します。
HTMLを用いたメール本文の装飾について
「回答メールの送信」アクションの本文は、プレーンテキストだけでなくHTMLでの装飾ができます。
せっかく自動化するなら、届くメールの見栄えも整えたいところですので、今回はこんな見た目のメールにしています。

やり方は、メール送信アクションの本文欄で「コードの表示(>アイコン)」に切り替えて、HTMLを直接貼り付けるだけです。
HTML内の任意の場所に、これまでのステップと同じ要領で動的コンテンツや式を差し込めます。今回のメールで使っている差し込みは3箇所です。
<!-- 宛名:ユーザープロフィールの取得から表示名 -->
@{outputs('ユーザー_プロフィールの取得_(V2)')?['body/displayName']} 様
<!-- 問い合わせ内容の引用:応答の詳細を取得するからFormsの回答 -->
@{outputs('応答の詳細を取得する')?['body/xxxxx']}
<!-- 回答本文:スイッチで確定した最終回答 -->
@{coalesce(outputs('最終回答_このまま'), outputs('最終回答_修正版'))}
※Formsの質問項目ごとに固有のIDが入ります。動的コンテンツから選択すれば自動で入ります
なお、このHTML自体の作成はガッツリAIに手伝ってもらいました。「社内ヘルプデスクの自動回答メールをHTMLで作って」とお願いすれば土台はすぐ出てくるので、そこに動的コンテンツを差し込むだけです。
完成
これで一連のフローが完成しました。
改めて動作をおさらいすると、
- 問い合わせが届くと、FAQ判定Agentが既出か新規かを自動判定
- 既出なら、FAQリストの回答を引用してそのまま自動返信
- 新規なら、回答素案作成Agentが案を作り、担当者がTeams上で確認・修正してから返信
- 確定した回答はFAQリストに自動追記され、次から「既出」として扱われる
という流れが、人の確認を挟みつつ自動で回るようになっています。
おわりに
問い合わせ対応の負担は、「答えを探す・作る」部分よりも「答えた内容が蓄積されずに毎回ゼロから探している」ことが原因になっているケースも多いのではと思います。
今回紹介した仕組みは、Power AutomateとCopilot StudioのAgent機能だけで組めます。
ヘルプデスク的な問い合わせ対応をしている方は、ぜひ試してみてください。
「うちの場合はこう応用できそう」「ここはこうした方がいい」など、コメントで教えてもらえると嬉しいです。













