👏

Copilot Studio × Power Automateで作る!実用性重視の「ハイブリッド型」タスク管理AIエージェント

に公開

はじめに

Microsoft Agent Hackathon powered by Tokyo Electron Deviceハッカソンで、チームのタスク管理を効率化するAIエージェントSmartAssign-AIを開発しました。

複数人でプロジェクトを進行するチームリーダーやメンバー、複雑な管理ツールの定着が難しい組織を対象としたAIエージェントで、「AIチャットボットにタスク管理を任せたいけど、言った通りに登録されない(ハルシネーション)のが怖い…」というエンタープライズ特有の課題を解決するため、「生成AIの柔軟性」と「システム(Power Automate)の確実性」のメリットを組み合わせたハイブリッドな構成に挑戦しています。

まずは、実際の動作がわかるデモ動画(約3分)をご覧ください。

https://youtu.be/0JRRN63MBkQ

VOICEVOX:玄野武宏


主な機能

本エージェントは、日々のタスク管理における主要なアクションをチャット上で完結できます。動画内でも紹介している3つのコア機能は以下の通りです。

1. タスクのアサイン(AI提案 / 手動指名)

今回の開発においてメインの機能です。「タスク追加」と話しかけることで、タスクのアサインをする動きが作動します。タスクのアサイン時、状況に合わせて2つのアプローチを使い分けることができます。

  • AIに提案してもらう: 誰にタスクを振り分けるか迷った際、タスク名を入力すると、AIがメンバーの所持スキル、現在の負荷状況を裏側で分析し、「〇〇さんはこのスキルを持ち合わせているため適任です。」「〇〇さんは現在タスクが少ないため適任です。」と理由付きで最適な担当者を提案します。
  • 自分で指名する(手動): 急ぎの場合や担当者が決まっている場合は、ボタンからメンバーを直接指名します。生成AIを介さず直接データベースに書き込むため、一瞬かつ確実に登録されます。

2. タスクのアサイン確認

「タスクの確認」と話しかけることで、メンバーが現在抱えているタスクを即座に照会できます。裏側でPower AutomateがSharePointから最新のデータを取得し、チャット上に一覧として正確に表示するため、タスクの抜け漏れ防止に役立ちます。

3. マネージャー向け「チームサマリー」

「チームサマリー」と話しかけると、データベースから全メンバーのタスクデータを一括取得します。その生データをAIのプロンプトに渡し、「誰の負荷が高いか」「全体的な進捗はどうか」を人間らしく温かみのある文章で要約レポートとして出力します。


アーキテクチャ

本アプリケーションは、以下のMicrosoft技術を組み合わせて構築しています。

  • フロントエンド / エージェント基盤: Copilot Studio
  • バックエンド / ロジック実行: Power Automate
  • データベース: SharePointリスト

AIにデータベースを直接触らせるのではなく、Power Automateを介在させることで、エンタープライズ用途に耐えうる堅牢性を担保しました。データベースの中は以下の画像のようになっています。

「名前、ロール、スキル、人事評価(今回作成したAIエージェントには未使用)、タスク数、負荷ステータス、タスク名」の列があります。
このデータベースに含まれている人のデータは、AIに考えてもらい作成したものであり、実在する人物ではありません。


実装上の工夫

開発において、特にこだわった技術的な工夫は以下の3点です。

1. 「AIの提案」と「人間の手動選択」のハイブリッドUI

すべての操作をAIの自由対話に任せるのではなく、タスク追加の冒頭で「AIに提案してもらう」か「自分で指名する」かの明確な分岐(選択肢)を設けました。実業務のスピード感に寄り添ったUXを実現しています。

2. 「ダングリング・カンマ」問題の完全排除

SharePointリスト上でタスク名をカンマ区切りで蓄積・削除する処理において、タスクが0件になった際などに , (カンマとスペース)のゴミデータだけが残ってしまう不具合に直面しました。
これを防ぐため、Power Automateのフロー内に以下のPower Fx(数式)を組み込み、データ操作時のフォーマットを制御しています。

if(empty(trim([既存のタスク])), [新タスク], concat([既存のタスク], ', ', [新タスク]))

3. ハルシネーションの排除

社内のタスク管理という「事実のみ」を扱うシステムの性質上、Copilot Studioの「Web検索」機能は無効に設定しました。外部の無関係な情報を取り込んで適当な回答を生成してしまうリスクを根本から絶っています。


プロンプトの工夫

Copilot Studioの生成AI機能を最大限に活かすため、以下の2つのアプローチでプロンプトを設計しています。

1. トリガー説明文による「交通整理」(マイナスプロンプト)

「タスクの追加」「サマリー」といった似た機能の誤作動を防ぐため、各トピックの説明文に**「〇〇の機能には絶対に使用しないでください」**という制約(マイナスプロンプト)を明確に記述し、ユーザーの意図をAIに正確に仕分けさせています。

2. カスタムプロンプトによる「動的レポート生成」

「チームサマリー」機能では、Power Automateでかき集めた全メンバーのタスク状況(String型の生データ)を、Copilot Studioのカスタムプロンプトに変数として流し込んでいます。

【設定したプロンプトの抜粋】

あなたは優秀なプロジェクトマネージャーです。以下のチームのタスク状況データを分析し、①全体的な進捗の所感、②タスクが集中して負荷が高いメンバーへの配慮を含めて、人間らしく温かいトーンで要約して教えてください。
【データ】
[TaskData(動的変数)]

単なるデータの羅列ではなく、AIに「役割」を与え、負荷状況の分析と温かみのあるテキストに変換させることで、付加価値の高い機能に昇華させました。


おわりに

今回の開発を通じて、生成AIの「得意なこと(要約・提案)」と「苦手なこと(厳密なDB操作)」の境界線を学ぶことができました。また、Copilot Studioの使用が初めてでわからないことだらけだったのですが、開発の流れを学ぶことができたと感じます。今回の経験を、今後の開発にも活かしていきたいと思います。

最後までお読みいただき、ありがとうございました。

Discussion