エージェントの概念を理解する

エージェントの対話には、テキスト、音声、画像、またはビデオを使用できます。 ユーザーの入力を処理して要求を理解し、入力を評価して関連するタスクを実行します。 エージェントは、情報を要求したり、サービスへのアクセスを有効にしたりして、ユーザーに応答します。

エージェント スコープ

Microsoft Teams のエージェントは、1 対 1 の会話、グループ チャット、またはチーム内のチャネルに参加できます。 各スコープは、会話型エージェントに固有のオポチュニティと課題を提供します。

チャネル グループ チャット 1 対 1 のチャット
大規模なリーチ 減少したメンバー 従来の方法
簡潔な個々のやり取り @mention エージェントへ Q&A エージェント
@mention エージェントへ チャネルと同様 冗談を言ったりメモを取ったりするエージェント

チャネル

チャネルには、複数のユーザー (最大 2000 人) 間のスレッド形式の会話が含まれます。 これにより、エージェントに大規模なリーチが与えられる可能性がありますが、個々のやり取りは簡潔でなければなりません。 従来の複数ターンの操作は機能しません。 代わりに、対話型のカードやダイアログ (TeamsJS v1.x ではタスク モジュールと呼ばれていました) を使用するか、会話を 1 対 1 の会話に移動して、多くの情報を収集する必要があります。 エージェントは、 @mentionedされているメッセージにのみアクセスできます。 Microsoft Graph および組織レベルのアクセス許可を使用して会話から追加のメッセージを取得できます。

次の場合、エージェントはチャネルでより適切に機能します。

  • ユーザーが追加情報を取得するための対話型カードを提供する通知。
  • 投票やアンケート調査などのフィードバック シナリオ。
  • 単一の要求または応答サイクルは対話を解決し、結果は複数のメンバーで会話をする場合に役立ちます。
  • 素晴らしい猫の画像を取得したり、ランダムに勝者を選んだりするソーシャル エージェントまたは楽しいエージェント。

グループ チャット

グループ チャットは、3 人以上のユーザー同士で行われる非スレッドの会話です。 チャネルよりもメンバーは少なく、一時的な会話が多いのが特徴です。 チャネルと同様に、エージェントは直接 @mentioned されたメッセージにのみアクセスできます。

チャネルでより適切に機能するエージェントは、グループ チャットでもより適切に機能します。

1 対 1 のチャット

1 対 1 のチャットは、会話型エージェントがユーザーと対話するための従来の方法です。 1 対 1 の会話エージェントの例をいくつか示します。

  • Q&A エージェント
  • 他のシステムでワークフローを開始するエージェント。
  • ジョークを言うエージェント。
  • メモを取るエージェント。 1 対 1 のエージェントを作成する前に、会話ベースのインターフェイスが機能を提示するための最良の方法であるかどうかを検討してください。

アクティビティ ハンドラーとエージェント ロジック

ニーズを満たすエージェント アプリを作成するには、Microsoft Teams アクティビティ ハンドラーとエージェント ロジックを理解することが不可欠です。 これら 2 つの重要なコンポーネントが連携して会話ロジックを整理します。

  • Teams アクティビティ ハンドラー: チャネルの作成、チーム メンバーの追加、Teams 環境に固有のその他のアクションなど、Teams 固有のイベントと相互作用を処理します。 Teams SDK v2 では、ハンドラーはクラス継承を介してではなく、 App インスタンスに直接登録されます。

  • エージェント ロジック: App オブジェクトにはエージェントの会話ロジックが格納され、ユーザー入力に基づいて意思決定を行う責任があります。 受信アクティビティは、アクティビティー・タイプとオプションのパターン・マッチングに基づいて、適切なハンドラーにルーティングされます。

Teams アクティビティ ハンドラー

アクティビティ ハンドラーはエージェントの機能の中核であり、ユーザー操作を管理および処理します。 Teams SDK v2 の場合:

  • App オブジェクトをインスタンス化し、ハンドラーを登録します。
  • ハンドラーは、型指定されたコンテキスト オブジェクト (TypeScript でIActivityContext 、C# で IContext<TActivity> 、Python で ActivityContext[TActivity] ) を受け取ります。
  • 応答とプロアクティブ メッセージは、 ctx.reply() または ctx.send() 経由で送信されます。

Teams エージェントがアクティビティを受信すると、SDK は登録済みハンドラーを介してアクティビティをルーティングします。 Teams 固有のイベント (チャネルのライフサイクル、メンバーの変更など) は個別の名前付きイベントとして表示されるため、手動で channelData.eventType を調べる必要はありません。

注:

エージェント アクティビティの処理に 15 秒以上かかる場合、Teams はエージェント エンドポイントに再試行要求を送信するため、重複する要求が表示される可能性があります。

アクティビティ ハンドラー コード スニペット

次のスニペットは、チャネルおよびチームのライフサイクル イベントの Teams アクティビティ ハンドラーを示しています。

エージェントは、 Microsoft.Teams.Apps パッケージを使用してビルドされます。 OnMessage()、OnChannelCreated() などの拡張メソッドを使用して、Appとチェーン ハンドラーの登録をインスタンス化します。すべてのハンドラーは IContext<TActivity> オブジェクトを受け取ります。

OnChannelCreated

using Microsoft.Teams.Apps;

WebApplicationBuilder builder = WebApplication.CreateSlimBuilder(args);
builder.Services.AddTeamsBotApplication();

WebApplication app = builder.Build();
TeamsBotApplication teams = app.UseTeamsBotApplication();

teams.OnChannelCreated(async (context, cancellationToken) =>
{
    var channel = context.Activity.ChannelData.Channel;
    var team    = context.Activity.ChannelData.Team;
    // Code logic here
});

OnChannelDeleted

teams.OnChannelDeleted(async (context, cancellationToken) =>
{
    // Code logic here
});

OnChannelRenamed

teams.OnChannelRenamed(async (context, cancellationToken) =>
{
    // Code logic here
});

OnTeamRenamed

teams.OnTeamRenamed(async (context, cancellationToken) =>
{
    // Code logic here
});

OnMembersAdded

teams.OnMembersAdded(async (context, cancellationToken) =>
{
  foreach (var member in context.Activity.MembersAdded)
  {
        // Code logic here
    }
});

OnMembersRemoved

teams.OnMembersRemoved(async (context, cancellationToken) =>
{
  foreach (var member in context.Activity.MembersRemoved)
  {
        // Code logic here
    }
});

OnMessageUpdate / OnMessageDelete

メッセージの編集は OnMessageUpdate 経由で処理されます。 論理的な削除は OnMessageDelete を使用して処理されます。

teams.OnMessageUpdate(async (context, cancellationToken) =>
{
    // Code logic here
});

teams.OnMessageDelete(async (context, cancellationToken) =>
{
    // Code logic here
});

エージェント アクティビティ ハンドラーの例

次のコードは、エージェント アクティビティの例を示しています。

using Microsoft.Teams.Apps;

WebApplicationBuilder builder = WebApplication.CreateSlimBuilder(args);
builder.Services.AddTeamsBotApplication();

WebApplication app = builder.Build();
TeamsBotApplication teams = app.UseTeamsBotApplication();

teams.OnMessage(async (context, cancellationToken) =>
{
    var senderName = context.Activity.From.Name;
    await context.SendAsync($"Hello <at>{senderName}</at>.", cancellationToken);
});

app.Run();

エージェント ロジック

エージェント ロジックには、エージェントのアクションと相互作用を指示する基本的なルールと意思決定フレームワークが組み込まれています。 エージェントがユーザー入力を解釈し、応答を作成し、会話に参加する方法の概要を示します。

Teams SDK v2 では、エージェント ロジックは 1 つ以上のエージェント チャネルからの着信アクティビティを処理し、発信アクティビティを生成します。 すべてのアクティビティのルーティングは App インスタンスによって処理されます。ハンドラーを登録すると、SDK はそれらにアクティビティを自動的にディスパッチします。

コア アクティビティ ハンドラー

App クラスは、ハンドラーを登録するための拡張メソッドを公開します。 メソッドは Fluent チェーンの App を返します。

イベント 延長方法 説明
任意のアクティビティの種類を受信しました OnActivity(handler) すべてのアクティビティに対して呼び出される Catch-all ハンドラー。
メッセージ アクティビティを受信しました OnMessage(handler) 着信テキスト メッセージを処理します。 パターン マッチングの最初の引数として正規表現文字列を渡します。
会話の更新を受信した OnConversationUpdate(handler) 未加工の会話更新アクティビティ。
非エージェント メンバーが参加済み OnMembersAdded(handler) MembersAdded.Length > 0時に発生します。
エージェント以外のメンバーが残りました OnMembersRemoved(handler) MembersRemoved.Length > 0時に発生します。
インストールが追加されました OnInstall(handler) エージェントがインストールされました。

Teams 固有のアクティビティ ハンドラー

イベント 延長方法 説明
チャネルを作成しました OnChannelCreated(handler) Teams チャネルが作成されました。
チャネルが削除されました OnChannelDeleted(handler) Teams チャネルが削除されました。
チャネルの名前が変更されました OnChannelRenamed(handler) Teams チャネルの名前が変更されました。
チャットの名前が変更されました OnTeamRenamed(handler) チーム名が変更されました。
編集されたメッセージ OnMessageUpdate(handler) メッセージが編集されました。
メッセージが論理的に削除されました OnMessageDelete(handler) メッセージが論理的に削除されました。

Teams の呼び出しアクティビティ

呼び出しの種類 延長方法 説明
CardAction.Invoke OnExecuteAction(handler) カード アクション呼び出しアクティビティが受信されました。
task/fetch OnTaskFetch(handler) ダイアログ (タスク モジュール) がフェッチされました。
task/submit OnTaskSubmit(handler) ダイアログ (タスク モジュール) が送信されました。
fileConsent/invoke OnFileConsent(handler) ファイル同意カード アクティビティが受信されました。
signin/verifyState SDK によって自動的に処理されます (OAuth フロー) サインイン 状態の確認アクティビティ。

エージェント アクティビティ ハンドラーについて理解を深めたので、エージェントが会話や送受信するメッセージによってどのように動作するかを見てみましょう。

推奨事項

エージェントとユーザーの間の広範な対話は、タスクを完了するための遅くて複雑な方法です。 過剰なコマンド、特に広範囲のコマンドをサポートするエージェントは、成功しないか、ユーザーから肯定的に見られません。

  • チャットでの複数ターン エクスペリエンスを避ける 長時間のダイアログでは、開発者は状態を維持する必要があります。 この状態を終了するには、ユーザーがタイムアウトするか、 キャンセルを選択する必要があります。 また、このプロセスは面倒です。 たとえば、次の会話シナリオを参照してください。

    ユーザー: Megan との会議をスケジュールして。

    エージェント: 200件の結果が見つかりました。これには名と姓が含まれています。

    ユーザー: Megan Bowen との会議をスケジュールして。

    エージェント:わかりました、ミーガン・ボーウェンと会いたいのは何時ですか?

    ユーザー: 午後 1 時に。

    エージェント:どの日に?

  • 6 つ以下のコマンドをサポートする 現在のエージェント メニューには表示されるコマンドが 6 つしかないため、それ以上のコマンドがどの頻度でも使用される可能性は低いです。 幅広いアシスタントになろうとするのではなく、特定の分野に深く入り込むエージェントは、よりうまく働き、うまくいきます。

  • より迅速な対話のためにサポート情報のサイズを最適化する エージェントの欠点の 1 つは、ランク付けされていない応答で大規模な検索サポート情報を維持するのが難しいことです。 エージェントは、短く迅速な対話に最適であり、長いリストで答えを探し回ることはありません。

注:

Teams プラットフォームは、トランスポート層セキュリティ (TLS) バージョン 1.2 のみをサポートします。 それに応じてエージェント環境を構成してください。

その他のエージェント機能を調べる

従来のエージェント機能に加えて、Teams エージェント アプリで利用できる高度な機能を調べることもできます。

コード サンプル

サンプルの名前 説明 TypeScript C# Python
Teams 会話エージェント このアプリは、基本的なエージェント イベントを示します。 表示 表示 表示