ボットの概念を理解する
ボットの対話は、テキスト、音声、画像、またはビデオを使用できます。 ユーザーの入力を処理して要求を理解し、関連するタスクを実行するために入力を評価します。 ボットは、情報を要求したり、サービスへのアクセスを有効にしたりして、ユーザーに応答することができます。
ボットスコープ
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 環境に固有のその他のアクションが含まれます。 Teams アクティビティ ハンドラーを利用することで、ボットは Teams プラットフォーム内でより統合されたシームレスなユーザー エクスペリエンスを提供できます。
ボット ロジック: ボットの会話ロジックを格納するボット オブジェクトは、ユーザー入力に基づいて意思決定を行う役割を担います。 ターン ハンドラーを公開します。これは、ボット アダプターからの受信アクティビティを受け入れるメソッドです。 ボット ロジックにより、会話の各ターンが適切に処理され、ボットの全体的な一貫性と有効性に貢献します。
これら 2 つのコンポーネントが連携して、魅力的な会話エクスペリエンスを作成します。 アクティビティ ハンドラーはユーザーの言う内容を処理しますが、ボット ロジックは最適な応答を把握します。 これらを組み合わせることで、次の機能が有効になります。
- 会話のコンテキストを理解する
- インタラクションのパーソナライズ
- 情報の効率的な取得
- アダプティブ会話フローの維持
アクティビティ ハンドラーとボット ロジックを理解することで、スマートで使いやすい会話 AI と従来のボット ソリューションを設計して実装できます。
Teams アクティビティ ハンドラー
アクティビティ ハンドラーは、ボットの機能の中核であり、ユーザーの操作を管理および処理します。 これは、Microsoft Bot Frameworkのアクティビティ ハンドラーに基づいており、Teams 以外のアクティビティを処理する前にすべての Teams アクティビティをルーティングします。 これは、ユーザーの入力とボットの応答の中間として機能します。
- 受信メッセージを受信します。
- ユーザー入力からキー データを取得します。
- 自然言語処理 (NLP) を使用してユーザーの意図を識別します。
- 会話コンテキストと状態を維持します。
- ユーザーの入力と意図に基づいて応答を生成します。
アクティビティ ハンドラーは、ユーザー エクスペリエンス、効率、精度、スケーラビリティ、柔軟性を向上させます。
Teams ボットがアクティビティを取得すると、アクティビティ ハンドラーを介してルーティングされます。 すべてのアクティビティは、ターン ハンドラーと呼ばれる基本ハンドラーを通過し、適切なアクティビティ ハンドラーを呼び出します。 Teams ボットは、bot Framework の ActivityHandler
クラスから取得される TeamsActivityHandler
クラスから派生します。
注:
ボット アクティビティの処理に 15 秒以上かかる場合、Teams はボット エンドポイントに再試行要求を送信するため、重複した要求が表示される場合があります。
ボットは Bot Framework を使用して構築されます。 ボットがメッセージを取得すると、ターン ハンドラーに通知され、 OnMessageActivityAsync
ハンドラーに送信されます。 これは Teams でも同じように機能します。 ボットが会話の更新プログラムを取得すると、ターン ハンドラーから OnConversationUpdateActivityAsync
に送信されます。 Teams アクティビティ ハンドラーは、まず Teams 固有のイベントを検索します。 存在しない場合は、Bot Framework のアクティビティ ハンドラーに渡されます。
Teams アクティビティ ハンドラー クラスには、次の 2 つの主要な Teams アクティビティ ハンドラーがあります。
-
OnConversationUpdateActivityAsync
は、すべての会話更新アクティビティをルーティングします。 -
OnInvokeActivityAsync
は、すべての Teams 呼び出しアクティビティをルーティングします。
特定の Teams のアクティビティ ハンドラーのロジックを実装するには、「ボット ロジック」セクションに示すように、ボット内のメソッドをオーバーライドする必要があります。 これらのハンドラーの基本実装はありません。 したがって、オーバーライドに必要なロジックを追加します。
Teams 固有のアクティビティ ハンドラーのロジックを設定するには、「ボット ロジック 」セクションに 示すように、ボット内のメソッドをオーバーライドする必要があります。 これらのハンドラーには既定の実装がないため、オーバーライドで必要なロジックを追加するだけです。
Teams のアクティビティ ハンドラーのコード スニペット:
OnTeamsChannelCreatedAsync
protected override Task OnTeamsChannelCreatedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsChannelDeletedAsync
protected override Task OnTeamsChannelDeletedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsChannelRenamedAsync
protected override Task OnTeamsChannelRenamedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsTeamRenamedAsync
protected override Task OnTeamsTeamRenamedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsMembersAddedAsync
protected override Task OnTeamsMembersAddedAsync(IList<TeamsChannelAccount> teamsMembersAdded, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsMembersRemovedAsync
protected override Task OnTeamsMembersRemovedAsync(IList<TeamsChannelAccount> teamsMembersRemoved, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken);
{
// Code logic here
}
OnTeamsMessageEditAsync
protected override async Task OnTeamsMessageEditAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsMessageUndeleteAsync
protected override async Task OnTeamsMessageUndeleteAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsMessageSoftDeleteAsync
protected override async Task OnTeamsMessageSoftDeleteAsync(ITurnContext<IMessageDeleteActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
ボット アクティビティ ハンドラーの例
次のコードは、チャネル チーム スコープのボット アクティビティの例を示しています。
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
var mention = new Mention
{
Mentioned = turnContext.Activity.From,
// EncodeName: Converts the name to a valid XML name.
Text = $"<at>{XmlConvert.EncodeName(turnContext.Activity.From.Name)}</at>",
};
// MessageFactory.Text(): Specifies the type of text data in a message attachment.
var replyActivity = MessageFactory.Text($"Hello {mention.Text}.");
replyActivity.Entities = new List<Entity> { mention };
// Sends a message activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(replyActivity, cancellationToken);
}
次のコードは、1 対 1 のチャットのボット アクティビティの例を示しています。
// Handle message activity
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Remove recipient mention text from Text property.
// Use with caution because this function is altering the text on the Activity.
turnContext.Activity.RemoveRecipientMention();
var text = turnContext.Activity.Text.Trim().ToLower();
// Sends a message activity to the sender of the incoming activity.
await turnContext.SendActivityAsync(MessageFactory.Text($"Your message is {text}."), cancellationToken);
}
ボット ロジック
ボット ロジックには、ボットのアクションと相互作用を決定する基本的なルールと意思決定フレームワークが組み込まれています。 ボットがユーザー入力を解釈し、応答を作成し、会話に参加する方法について説明します。
Teams では、ボット ロジックによって 1 つ以上のボット チャネルからの受信アクティビティが処理され、応答で送信アクティビティが生成されます。 これは、Teams アクティビティ ハンドラー クラスから派生したボットに当てはまります。これは、最初に Teams アクティビティをチェックします。 Teams アクティビティがないか確認したら、他のすべてのアクティビティが Bot Framework のアクティビティ ハンドラーに渡されます。
主要な Bot Framework ハンドラー
注:
- 追加および削除されたメンバーのアクティビティを除き、このセクションで説明するすべてのアクティビティ ハンドラーは Teams 以外のボットと同様に動作し続けます。
-
onInstallationUpdateActivityAsync()
メソッドは、ボットを Teams に追加するときに Teams ロケールを取得するために使用されます。
アクティビティ ハンドラーは、メッセージ スレッドの代わりに新しいメンバーがチームに追加されるチームのコンテキストで異なります。
ActivityHandler
で定義されているハンドラーの一覧には、次のイベントが含まれます。
イベント | ハンドラーまたは SDK メソッド | 説明 |
---|---|---|
任意のアクティビティの種類を受信しました | OnTurnAsync() |
このメソッドは、受信したアクティビティの種類に基づいて、他のハンドラーのいずれかを呼び出します。 |
メッセージ アクティビティを受信しました | OnMessageActivityAsync() |
このメソッドをオーバーライドして、 Message アクティビティを処理できます。 |
受信したメッセージ更新アクティビティ | OnMessageUpdateActivityAsync() |
このメソッドをオーバーライドして、メッセージ更新アクティビティを処理できます。 |
受信したメッセージ削除アクティビティ | OnMessageDeleteActivityAsync() |
このメソッドをオーバーライドして、メッセージ削除アクティビティを処理できます。 |
会話更新アクティビティを受信しました | OnConversationUpdateActivityAsync() |
このメソッドは、ConversationUpdate アクティビティで、ボット以外のメンバーが会話に参加または退出した場合にハンドラーを呼び出します。 |
ボット以外のメンバーが会話に参加しました | OnMembersAddedAsync() |
このメソッドは、会話に参加するメンバーを処理するためにオーバーライドできます。 |
ボット以外のメンバーが会話を退出しました | OnMembersRemovedAsync() |
このメソッドは、会話を退出するメンバーを処理するためにオーバーライドできます。 |
イベント アクティビティを受信しました | OnEventActivityAsync() |
このメソッドは、Event アクティビティで、イベントの種類に固有のハンドラーを呼び出します。 |
トークン応答イベント アクティビティを受信しました | OnTokenResponseEventAsync() |
このメソッドは、トークン応答イベントを処理するためにオーバーライドできます。 |
トークン応答以外のイベント アクティビティを受信しました | OnEventAsync() |
このメソッドは、他の種類のイベントを処理するためにオーバーライドできます。 |
その他のアクティビティの種類を受信しました | OnUnrecognizedActivityTypeAsync() |
このメソッドは、それ以外の場合は処理されないアクティビティの種類を処理するためにオーバーライドできます。 |
Teams に固有のアクティビティ ハンドラー
TeamsActivityHandler
では、コア Bot Framework ハンドラー セクションのハンドラーの一覧が拡張され、次のイベントが含まれます。
イベント | ハンドラーまたは SDK メソッド | 説明 |
---|---|---|
channelCreated |
OnTeamsChannelCreatedAsync() |
このメソッドは、作成される Teams チャネルを処理するためにオーバーライドできます。 詳細については、「会話更新イベントで作成されたチャネル」を参照してください。 |
channelDeleted |
OnTeamsChannelDeletedAsync() |
このメソッドは、削除される Teams チャネルを処理するためにオーバーライドできます。 詳細については、「会話更新イベントで削除されたチャネル」を参照してください。 |
channelRenamed |
OnTeamsChannelRenamedAsync() |
このメソッドは、名前が変更される Teams チャネルを処理するためにオーバーライドできます。 詳細については、「会話更新イベントでチャネルの名前が変更されました」を参照してください。 |
teamRenamed |
OnTeamsTeamRenamedAsync() |
return Task.CompletedTask; このメソッドは、名前が変更される Teams チームを処理するためにオーバーライドできます。 詳細については、「会話の更新イベントでチーム名が変更されました」を参照してください。 |
MembersAdded |
OnTeamsMembersAddedAsync() |
このメソッドは ActivityHandler の OnMembersAddedAsync メソッドを呼び出します。 このメソッドは、チームに参加するメンバーを処理するためにオーバーライドできます。 詳細については、会話更新イベントに追加されたチーム メンバーに関するページを参照してください。 |
MembersRemoved |
OnTeamsMembersRemovedAsync() |
このメソッドは ActivityHandler の OnMembersRemovedAsync メソッドを呼び出します。 このメソッドは、チームを離れるメンバーを処理するためにオーバーライドできます。 詳細については、会話更新イベントで削除されたチーム メンバーに関するページを参照してください。 |
messageEdit |
OnTeamsMessageEditAsync() |
このメソッドをオーバーライドして、Teams メッセージ編集イベントを処理できます。 |
messageUndelete |
OnTeamsMessageUndeleteAsync() |
このメソッドをオーバーライドして、Teams メッセージの削除を取り消すイベントを処理できます。 |
messageSoftDelete |
OnTeamsMessageSoftDeleteAsync() |
このメソッドをオーバーライドして、Teams メッセージの論理的な削除イベントを処理できます。 |
Teams の呼び出しアクティビティ
OnInvokeActivityAsync
Teams アクティビティ ハンドラーから呼び出される Teams アクティビティ ハンドラーの一覧には、次の呼び出しの種類が含まれています。
呼び出しの種類 | ハンドラーまたは SDK メソッド | 説明 |
---|---|---|
CardAction.Invoke |
OnTeamsCardActionInvokeAsync() |
コネクタがカード アクション呼び出しアクティビティを受け取ると、このメソッドが呼び出されます。 |
fileConsent/invoke | OnTeamsFileConsentAcceptAsync() |
ユーザーがファイル同意カード受け入れると、このメソッドが呼び出されます。 |
fileConsent/invoke | OnTeamsFileConsentAsync() |
コネクタがアクティビティカードファイルの同意を受け取ると、このメソッドが呼び出されます。 |
fileConsent/invoke | OnTeamsFileConsentDeclineAsync() |
ユーザーがカードファイルの同意を拒否すると、このメソッドが呼び出されます。 |
actionableMessage/executeAction | OnTeamsO365ConnectorCardActionAsync() |
コネクタがアクション アクティビティのコネクタ カードMicrosoft 365 グループ受け取ると、このメソッドが呼び出されます。 |
signin/verifyState | OnTeamsSigninVerifyStateAsync() |
コネクタが signIn 検証状態アクティビティを受け取ると、このメソッドが呼び出されます。 |
task/fetch | OnTeamsTaskModuleFetchAsync() |
ダイアログ (TeamsJS v1.x のタスク モジュールと呼ばれます) がフェッチされたときにロジックを提供するには、派生クラスでこのメソッドをオーバーライドできます。 |
task/submit | OnTeamsTaskModuleSubmitAsync() |
ダイアログが送信されたときにロジックを提供するために、派生クラスでこのメソッドをオーバーライドできます。 |
このセクションに記載されている Invoke アクティビティは、Teams の会話ボット用です。 Bot Framework SDK は、メッセージ拡張機能に固有の呼び出しアクティビティもサポートしています。 詳細については、「メッセージ拡張機能とは」を参照してください。
ボット アクティビティ ハンドラーについて理解したので、会話と、ボットが受信または送信するメッセージに応じてボットがどのように動作するかを確認しましょう。
推奨事項
ボットとユーザーの間のダイアログが広範になると、タスクの完了に要する時間が長くなり、複雑になります。 過剰なコマンド (特に広範なコマンド) をサポートするボットは、成功しないか、ユーザーによって肯定的に表示されます。
チャットでのマルチターン エクスペリエンスを回避 する広範なダイアログでは、開発者が状態を維持する必要があります。 この状態を終了するには、ユーザーがタイムアウトするか、[ キャンセル] を選択する必要があります。 また、このプロセスは面倒です。 たとえば、次の会話シナリオを参照してください。
ユーザー: Megan との会議をスケジュールして。
BOT: 200 件の結果が見つかりました。姓と名を含めます。
ユーザー: Megan Bowen との会議をスケジュールして。
ボット: かしこまりました。Megan Bowen との会議を何時にご希望ですか?
ユーザー: 午後 1 時に。
ボット: 何日のですか?
6 つ以下のコマンドをサポート する現在のボット メニューには表示されるコマンドが 6 つしかないため、それ以上のコマンドを頻度で使用する可能性は低くなります。 幅広いアシストを提供するボットより、特定の分野を深く掘り下げるボットの方がうまくいきます。
より迅速な対話のためにナレッジ ベースのサイズを最適化するボットの欠点の 1 つは、ランクなしの応答を使用して大規模な取得サポート情報を維持するのが難しいことです。 ボットは、長いリストから答えを調べ出すようなものではなく、短く簡潔なやり取りに最適です。
その他のボット機能を調べる
従来のボット機能に加えて、Teams ボット アプリで使用できる高度な機能を調べることができます。
コード サンプル
サンプルの名前 | 説明 | .NET | Node.js | Python |
---|---|---|---|---|
Teams 会話ボット | このサンプル アプリでは、Bot Framework v4 で使用できるさまざまなボット会話イベントを使用する方法を示します。 | 表示 | 表示 | 表示 |
ボット サンプル | Bot Framework v4 サンプルのセット。 | 表示 | 表示 | 表示 |
次の手順
関連項目
Platform Docs