Note
本記事では 、標準ハーネスで駆動されるエージェントやエージェントフローで使用される機能について説明します。
Copilot Studio でのエージェントの会話の重要な部分は自然言語の理解です。これは、AI がユーザーの意図を理解する能力です。 たとえば、顧客が "ギフト カードを使用しようとしましたが、機能しません" と言う場合があります。エージェントは、その正確なフレーズがトリガー フレーズとしてリストされていない場合でも、ギフト カードが機能しないことに関連するトピックに顧客をルーティングします。
自然言語理解の基本的な側面の 1 つに、ユーザーの対話の中でのエンティティの特定があります。
エンティティとは、特定の種類の現実世界の主体を表す情報の単位です。 たとえば、電話番号、郵便番号、市区町間、または人の名前などを表します。 エンティティによって付与された知識により、エージェントはユーザー入力から関連情報を認識し、後で使用できるように保存できます。
事前構築済みエンティティ
エージェント内のエンティティを使うと、情報を似たもの同士のグループにまとめて保存できます。
Copilot Studio では、作成済みのエンティティのセットがサポートされています。これは、年齢、色、数字、名前など、実際のダイアログで最もよく使用される情報の種類を表します。 Money エンティティを例として使用してみましょう。
Copilot Studio でエージェントを開き、ページの上部にある Settings を選択し、Entities を選択します。 使用可能なすべてのエンティティの一覧が表示されます。
[ Money] を選択します。 エンティティの詳細パネルが開きます。 このエンティティの説明と、ユーザーの入力からお金や通貨に関する情報を抽出する方法について説明しています。
たとえば、このエンティティを収集するように構成された Question ノードからの質問に対してユーザーが "1,000 ドルかかる" と答えると、エージェントは "1000 ドル" が 金額 の種類の情報に対応することを認識します。 エージェントがこの情報を抽出して変数に保存すると、周囲の情報がテキストであったとしても、"1000" が数値として保存されます。
ユーザー定義エンティティ
事前構築済みエンティティは、一般的に使用される情報の種類を対象とします。 特定の目的に使うエージェントを作成する場合、そのエージェントの言語理解モデルにドメイン固有の知識を教える必要がある場合もあります。
たとえば、アウトドア ショップのエージェントを作りたいとします。 この場合、会話で "アウトドア用品" カテゴリを認識するようにエージェントに教える必要があります。
まず、ユーザー定義エンティティを作成します。 この場合、エージェントにすべてのアウトドア製品カテゴリの知識を与えるエンティティを作成することができます。
エージェントの [設定] ページに移動し、[ エンティティ] を選択します。
エンティティの追加>新しいエンティティを選択します。
クローズしたリスト エンティティまたは正規表現 (regex) エンティティのいずれかを選択します。
クローズド リスト エンティティ
クローズド リスト エンティティを使用すると、アイテムのリストを定義できます。 これらのエンティティは、管理しやすく、シンプルなアイテムラベルを持つ小さなリストに使うのが良いでしょう。 ユーザーまたはセッションごとに異なり、実行時にのみ使用できるコンテキスト固有の情報をエージェントで認識する場合は、 オープン リスト エンティティを使用します。
エンティティを作成 で、クローズド リスト を選択します。
開いたパネルで、新しいエンティティの名前 ( Camping アクティビティなど) を入力します。
必要に応じて、説明を追加します。
リスト項目 リストで、このエンティティに関連付ける値を入力します。 たとえば、 ハイキング や ヨガなどです。
または、このエンティティに追加するすべての値を一覧表示する ファイルをアップロード することもできます。
値を入力すると、次のことができます。
- 値を選択して変更します。
- 削除する値の横にあるごみ箱アイコンを選択します。
- 値の横にある シノニム を選択 (または既存のシノニムを選択) して、[ シノニムの編集] パネルを 開きます。
リスト内の各値に対して同義語を加えてマッチングロジックを拡張します。 たとえば、 ハイキングの場合、 トレッキング と 登山を シノニムとして追加できます。
必要に応じて、このエンティティの スマート マッチング をオンにします。
スマート マッチングは、エージェントの言語理解モデルによってサポートされるインテリジェンスの一部です。 スマートマッチングが有効な場合、エージェントはエンティティの値に対して曖昧な論理を用いてユーザー入力を解釈します。
特に、エージェントはスペルミスを自動修正し、マッチング ロジックを意味的に拡張することができます。 たとえば、エージェントは自動的に 「ソフトボール」 を 「野球」 にマッチさせることができます。
エンティティの作成または編集を終えたら、「 保存」を選択します。 変更を破棄するには、Close を選択します。
クローズド リスト エンティティに値をアップロードする
クローズド リスト エンティティの詳細パネルから、エンティティに関連付けられた値のセットとシノニムを追加または置換できます。
シノニム (存在する場合) を含め、エンティティに必要なすべての値を一覧表示するテキスト ファイル (最大 3 MB) を準備します。 1 行に 1 つの値を使用し、シノニムの区切り記号としてパイプ (
|) を使用します。 例えば次が挙げられます。hiking|trekking hiking|mountaineering yoga cycling|bicycling cookingアイテムのリスト で、ファイルのアップロード を選択します。
[ ファイルのアップロード] で、目的のオプションを選択します。
- エンティティの新しい値とシノニムを追加するには、[追加] を選択 します。
- 既存のすべての値とシノニムをファイルの一覧で置き換えるには、置換 を選択します。
ファイルをウィンドウにドロップします。 あるいは、「 クリックして閲覧」を選択し、ファイルに移動して選択してください。
表示される値とシノニムを確認し、追加 を選択します。
クローズド リスト エンティティの値をダウンロードする
クローズド リスト エンティティの詳細パネルから、エンティティに関連付けられた値とシノニムのセットをリストしたテキスト・ファイルをダウンロードできます。
リストアイテムの「ダウンロード」を選択してください。
結果のテキスト ファイルを保存するか、テキスト エディターで開いて内容を確認します。 各エンティティの値は、個別の行に表示されます。 値に複数のシノニムがある場合は、次のように別々の行に表示されます:
hiking|trekking hiking|mountaineering
正規表現 (regex) エンティティ
正規表現 (regex) エンティティを使用すると、入力から情報を照合および抽出するために使用できる論理パターンを定義できます。 正規表現のエンティティは、ユーザーの入力に対する複雑なパターン マッチングに最適です。 また、ユーザーが会話の中で入力内容をフォーマットしたり、入力したりする方法に対し、特定のバリエーションを許容する必要がある場合にも使用できます。
たとえば、正規表現エンティティを使用して、追跡 ID、ライセンス番号、クレジットカード番号、IP アドレスなどのアイテムを識別することができます。
エンティティの作成 で、正規表現 (RegEx) を選択します。
開いたパネルに、新しいエンティティの名前を入力します。
必要に応じて、説明を追加します。
入力からエンティティ項目を一致させて抽出するために使用する正規表現パターンを入力します。
Copilot Studio NLU および CLU 言語の理解では、.NET正規表現構文を使用します。 NLU+ は JavaScript 正規表現構文を使用します。
既定では、パターン マッチは大文字と小文字を区別します。 大文字と小文字を区別しないようにするには、パターン文字列で
(?i)正規表現オプションを使用します。 正規表現エンティティ ペインにはいくつかの基本的な例が含まれています。 構文の詳細と、さまざまな例については、正規表現言語 - クイック リファレンス を参照してください。複数のパターンに対応するために正則表現が必要な場合は、交互演算子
|を使って正規表現を連結してください。 たとえば、2 つの正規表現パターンを組み合わせて、製品 ID コードの新旧両方の形式を検索することができます。エンティティの作成または編集を終えたら、「 保存」を選択します。 変更を破棄するには、Close を選択します。
会話でのエンティティの使用
これで、エージェントは作成したCamping アクティビティエンティティとその他のカスタム エンティティに基づいて屋外用ギアについて知識を持ち、エージェントでそれらを使い始めることができます。
エージェントの [トピック] ページに移動します。
収集するエンティティの トピック を開きます。
ノードの追加アイコン
を選択し、質問するを選択します。識別するの下で、カスタム エンティティ に作成したエンティティを選択します。
オプションで、ボタンとして表示するアイテムを選択することも可能です。 例えば、ユーザーが入力として便利に選択できるボタンとしてカテゴリを表示したい場合は、「 ユーザーの選択 」を選択し、リストから希望するオプションを選択します。 このリストには、カスタムエンティティを作成した際に追加したアイテムが含まれています。
ユーザーの応答を保存する変数の名前を変えてもいいですよ。
エンティティ リテラルと信頼度スコアをエージェントが利用できるようにする
監査やそれ以降のメッセージングなどの目的で、顧客の入力から正確な単語を使用できます。 エンティティのリテラルを公開するには、このエンティティを収集する Question ノードのエンティティ認識プロパティにメタデータを含めるをオンにします。
たとえば、このオプションをオンにすると、ユーザーがアクティビティに対して要求した開始日を保持する変数StartDateの型が 、日付ではなくレコードになります。
StartDate.Literal は顧客の言うことを保持し (例: "tomorrow")、 StartDate.Value は対応する日付を保持します。 メッセージでこれらの要素を使用すると、エージェントに次のような会話を行うことができます。
エージェントの質問: "いつ開始しますか?
顧客の応答: "明日"
エージェント メッセージ: "大丈夫、明日の予約を取ります (2026年4月2日)。"
エージェントが品質の低い音声入力やバックグラウンドノイズに遭遇する可能性が高い場合、音声認識や言語理解の結果は、必ずしも信頼できるとは限りません。
StartDate.ConfidenceScoreに基づいて条件付きロジックを追加して、エージェントが結果が良好か疑わしいか、または低いかを判断し、それに応じて受け入れる、あいまいさを解消する、または再プロンプトを行うことができます。
会話ターンでエンティティに対して複数の値を受け入れる
1 つのユーザー入力から同じエンティティの複数の値をエージェントが認識して抽出できるように、収集するエンティティに対して複数の値を受け入れるようにQuestion ノードを構成できます。 質問ノードは、1 つの値を返す代わりに、会話全体で使用できる値のコレクションを返します。
この動作を有効にすると、エージェントは次の操作を行います。
- 選択したエンティティに一致する複数の値を識別します
- 各値を個別に抽出します
- 結果をテーブル型の変数に格納します
このコレクションを使用すると、値をループ処理したり、ダウンストリーム処理のために変換したりするなどのアクションを実行できます。 この機能は、ユーザーが 1 つの発話で複数の項目、基本設定、または応答を提供する場合に便利です。
たとえば、ユーザーが「インド、ドイツ、日本のビザを持っている」と言った場合、エージェントは各国を個別の値として認識し、それらをコレクションとして格納します。
複数のエンティティ値を反復処理するには:
リストをループ処理するノードを追加します。
[ ループする項目の選択] で、[ 質問 ] ノードから変数を選択します。
ループ内で、現在の項目を参照してアクションを実行するか、応答を生成します。 例えば、あなたは次のことができます:
各値の条件を評価する
アクションまたはフローを呼び出す
動的応答を生成する
Power Fx を使用して、リストを別の形式に変換します。 たとえば、コンマ区切りの文字列を作成するには、次のようにします。
Concat(Topic.Var1, Text(Value), ",")
スロットの充填
スロットフィリング とは、抽出したエンティティをオブジェクトに保存することに関連する自然言語の理解概念です。 Copilot Studio では、スロットの埋め込みとは、抽出されたエンティティ値を変数に配置することです。 各事前構築済みエンティティに関連付けられている変数の基本型の詳細については、「 エンティティ」を参照してください。
テスト チャットで 「あることをやってみたい」と入力すると発生するキャンプ活動トピックを例にして説明します。
トピックが正常にトリガーされ、エージェントがアクティビティのタイプを尋ね、質問 ノードのオーサリング時に指定されたボタンの選択肢も表示します。 トピック間トラッキングのオプションをオンにすると、ダイアログツリーではエージェントがこのQuestionノードに向かっていることが表示されます。
顧客は、いずれかのボタンを選択することで、定義済みの選択肢を使用できます。 あるいは、「トレッキング」のような語を入力して、それが「ハイキング」に対応していることを確認することもできます。これは、それらの語が同義語として定義されているためです。
追跡ビューは、ダイアログが製品カテゴリの値が "Hiking" であるパスに正しくルーティングされていることを示しています。
スロットの入力は、エージェントが抽出されたエンティティ値 "Hiking" を、この質問ノード (この例のシナリオではmyActivity) のユーザー応答を保持する変数に格納するときに発生します。 スロット充填の動作を見るには、 エージェントをテストする際に変数の値を観察してください。 [変数] パネルの [テスト] タブには、変数の値が "Hiking" であることが示されています。
プロアクティブスロットフィリング
プロアクティブ スロット フィルを使用することもできます。これにより、ユーザーは、異なるエンティティにマップされる複数の情報を一度に指定できます。 エージェントは、どの情報がどのエンティティに属するかを理解します。 意図したマッピングが不明な場合は、選択肢を提示することで、ユーザーにより具体的な説明を促します。
この例では、ユーザーは「私は退屈だが、登山が好きだ」と書きました。このメッセージには、ユーザーが屋外アクティビティのヘルプを求めるトリガー フレーズと、ハイキングのシノニムである 2 つ目の情報 "mountaineering" が含まれます。 この場合、エージェントは野外活動を選択するためのエンティティと、活動の種類の両方を入力します。
トラッキング ビューでは、エージェントがこのユーザー入力を受け取り、アクティビティのタイプを求める 質問 ノードをインテリジェントにスキップすることがわかります。
エージェントは常にユーザーの入力を積極的に聞き、事前に情報を記憶しているので、不必要なステップを適宜スキップすることができます。
もう一度テストを再開して、別のケースを試してみましょう。 このラウンドでは、アクティビティにかかる時間 (期間 エンティティを使用) や価格帯 (お金 エンティティを使用) などを尋ねる 質問 ノードを追加できます。
今回、製品カテゴリの質問が提示されたとき、製品カテゴリだけをエージェントに伝える代わりに、ユーザーは 「100 ドル以下のハイキングブーツを買いたい 」と言うことができます。たとえば、この例では、エージェントは正しいハイキング商品カテゴリにルーティングするだけでなく、積極的にハイキングギアの種類とターゲット価格帯の情報を尋ねるスロットを埋めることができます。
ノード レベルでプロアクティブ スロットの充填を手動で制御できます。 特定のノード内で、スロットが以前のユーザー応答からすでに埋まっているかどうかにかかわらず、常に質問を表示するようにしたい場合は、その質問ノードの[質問をスキップ]オプションをオフにしてください。
Questionノードの3つの点(...)を選択し、Propertiesを選択します。 質問プロパティ パネルが表示されます。
質問のプロパティ パネルで、質問行動 を選択します。
質問行動 パネルの 質問をスキップする で、毎回尋ねる を選択し、ページの上部にある 保存を選択します。
オープン リスト エンティティを使用する
オープンリストエンティティは、事前定義されているのではなく、実行時に外部データソースから値が入力されます。 アカウント名、受取人、処方箋など、ユーザーやセッションごとに異なる状況特有の情報をエージェントが認識するのに役立ちます。 テキストと音声の両方のモダリティで動作します。 オープンリストエンティティの最も一般的なユースケースは 、基本的なボイスエージェントです。
外部データ ソースの場合は、Excel ファイルやデータベースなどのデータ セットを使用できます。 Dataverse コネクタを使用すると、エージェントがバックオフィス システムと対話して、呼び出しのコンテキストで使用するために適切なデータをプルできます。 Power Fx やその他の方法を使用してデータを生成することもできます。
動的インライン エンティティとして使用するテーブルを作成する
エージェントが実行時に内容を入力 できるテーブル型 の変数を作成します。 このシステムを使用すると、エージェント自体に変更を加えることなく、サポートされている値を特定のニーズに合わせてカスタマイズできます。 エージェントが認識できる値のセットは、呼び出し元に基づいて、会話の開始時に変更される可能性があります。 サポートされている値は、会話中に変化して、コンテキストに対する質問をより適切に調整することもできます。
Note
テーブルには、100 個以下のエントリを含める必要があります。
テーブルは基本的に同じ型の値のリストです (例: ["value1", "value2"])。 動的インライン エンティティの場合は、文字列の一覧を使用 します。 シノニムをサポートする場合は、次のスキーマを持つ レコード の一覧を使用します。
| 特性 | タイプ | Description |
|---|---|---|
| DisplayName | String | エンティティに使用できる値 |
| Synonyms | 文字列の配列 | 値の 1 つ以上のシノニム |
例えば次が挙げられます。
[
{
"DisplayName": "value1",
"Synonyms": ["synonym1", "synonym2", "..."]
},
{
"DisplayName": "value2",
"Synonyms": ["synonym1", "synonym2", "..."]
},
{
"DisplayName": "value3",
"Synonyms": ["synonym1", "synonym2", "..."]
}
]
トピックで動的インライン エンティティを使用する
エージェントの [トピック] ページに移動し、動的エンティティを収集するトピックを選択します。
質問ノードを追加するか、既存のものを使用します。
[ 識別] で、 リスト変数から [オプション] を選択します。
[ リスト変数] で、動的エンティティに適用できる値を保持するテーブルの名前を入力または選択します。
必要に応じて、エージェントのユーザーからの応答を格納する変数の名前を変更します。
音声エージェントの場合は、オプションに DTMF キーを割り当てるオプションを必要に応じて選択します。 実行時に、 DTMF キー は各オプションに自動的に割り当てられます。
会話ターンで複数のエンティティのいずれかを受け入れる
状況によっては、エージェントは、特定の会話ターンで複数の有効な回答のいずれかを受け入れることがあります。 たとえば、エージェントは、顧客にアカウント番号または電話番号を入力するよう求める場合があります。 また、エージェントが顧客に情報がないことを示させ、顧客サービス担当者にすぐにエスカレートするのではなく、状況に応じて顧客をルーティングすることもできます。
質問ノードを追加します。
[ 識別] で、 複数のエンティティの 1 つを選択します。
このノードで受け入れるエンティティごとに、[ 新しいエンティティ ] を選択し、目的のエンティティを選択します。 質問ノードは、最大 5 つの異なるエンティティをサポートできます。
[ Save user response as]\(ユーザー応答の保存 \) で既定の変数名を選択し、[ 変数のプロパティ ] パネルを開き、名前を意味のある名前 (識別子など) に変更 します。
認識されたエンティティ値を格納する変数は レコード型であり、このノードでサポートされているエンティティごとに 1 つの要素 (
Identifier.account、Identifier.phone、Identifier.unknownなど) が含まれます。顧客から提供された情報に従って会話をルーティングする条件を追加します。 is not Blank 演算子 (または is Blank) を使用して条件を設定することをお勧めします。
"複数のエンティティの 1 つ" の認識動作
この種類の認識では、会話ターンで一連の可能なエンティティから 1 つの エンティティが識別されます。 顧客が、対応する Question ノードで識別用に構成された 2 つ以上のエンティティを含むステートメントを入力すると、エージェントはリスト内の最初のエンティティ のみを 識別します。 したがって、それに応じて、そのような質問ノードに続く 質問 と条件付きロジックを作成してください。
たとえば、 質問 ノードがライブラリ カード番号、電話番号、または "知らない" のいずれかをこの順序で認識するように構成しているとします。 顧客が 「電話番号が 777 555-1212 で、カード番号が123456789」と言った場合、認識されるエンティティ値はカード番号です。これは、対応する 質問 ノードで使用可能なエンティティの一覧の最初のエンティティであるためです。
Question ノードが認識するように構成されているエンティティをエージェントが識別できない場合は、このノードに指定された再プロンプト動作が適用されます。
制限事項
会話ターン中に複数の実体のいずれかを収集するように設定する 質問 ノードには以下の制限があります。
最大5つの団体を含めることができます。
外部のエンティティは使えません。
各タイプは1つずつのエンティティしか含めません。 例えば、ある Question ノードは Date型のエンティティを2つ認識できません。