ナレッジ ベースでアクティブ ラーニングにより提案された質問を受け入れる
Note
QnA Maker サービスは、2025 年 3 月 31 日に廃止される予定です。 Azure AI Language の一部として、質問応答機能の新しいバージョンが提供されました。 言語サービス内の質問応答機能については、質問応答に関する記事を参照してください。 QnA Maker の新しいリソースは、2022 年 10 月 1 日以降作成できません。 既存の QnA Maker のナレッジ ベースを質問応答に移行する方法については、移行ガイドを参照してください。
提案を承認し、保存してトレーニングした後、アクティブラーニングによりナレッジ ベースまたは Search Service が変更されます。 提案を承認すると、代わりの質問として追加されます。
アクティブ ラーニングを有効にする
提案された質問を表示するには、QnA Maker リソースに対してアクティブ ラーニングを有効にする必要があります。
提案された質問を表示する
提案された質問を表示するには、ナレッジ ベースの [Edit](編集) ページで、 [View Options](オプションの表示) 、 [Show active learning suggestions](アクティブ ラーニングの提案を表示) の順に選択します。 質問と回答のペアのいずれにも提案がない場合、このオプションは無効になります。
[Filter by Suggestions](提案別にフィルターを適用) を選択し、質問と回答のペアでナレッジ ベースをフィルター処理すると、提案だけが表示されます。
各 QnA ペアでは、質問を受け入れるチェック マーク (
✔
) または却下するx
が付いた新しい代わりの質問が提案されます。 質問を追加するにはチェック マークを選択します。コンテキスト ツールバーの [Add all] (すべて追加) または [Reject all] (すべて却下) を選択することで、すべての提案 を追加または削除できます。
[Save and train] (保存してトレーニング) を選択し、ナレッジ ベースに変更を保存します。
[発行] を選択して、変更を GenerateAnswer API から使用できるようにします。
類似のクエリが 5 つ以上クラスター化された場合、QnA Maker は 30 分ごとに、ユーザーが承認または却下する代わりの質問を提案します。
アクティブ ラーニングの提案は、エクスポートされたナレッジ ベースに保存されます
アプリでアクティブ ラーニングが有効になっている場合、アプリをエクスポートすると、tsv ファイル内の SuggestedQuestions
列にアクティブ ラーニング データが保持されます。
SuggestedQuestions
列は、暗黙的 (autosuggested
) および明示的 (usersuggested
) なフィードバック情報の JSON オブジェクトです。 次に示すのは、ユーザーが送信した 1 つの help
の質問に対応する、この JSON オブジェクトの例です。
[
{
"clusterHead": "help",
"totalAutoSuggestedCount": 1,
"totalUserSuggestedCount": 0,
"alternateQuestionList": [
{
"question": "help",
"autoSuggestedCount": 1,
"userSuggestedCount": 0
}
]
}
]
このアプリを再インポートすると、アクティブ ラーニングは引き続き情報を収集し、ナレッジ ベースに対する提案を提示します。
ボットから GenerateAnswer および Train API を使用するためのアーキテクチャの流れ
ボットやその他のクライアント アプリケーションは、次のアーキテクチャの流れを利用してアクティブ ラーニングを使用する必要があります。
ボットは、GenerateAnswer API で
top
プロパティを使用していくつかの回答を取得することによって、ナレッジ ベースから回答を取得します。ボットは次のようにして明示的フィードバックを特定します。
- ユーザー独自のカスタム ビジネス ロジックを使用して、低いスコアを除外します。
- ボットまたはクライアント アプリケーションでは、回答候補の一覧をユーザーに表示し、ユーザーが選択した回答を取得します。
ボットは Train API によって、選択された回答を QnA Maker に送り返します。
GenerateAnswer 要求で top プロパティを使用して、一致する回答をいくつか取得する
回答を求めて QnA Maker に質問を送信すると、JSON 本文の top
プロパティにより、返す回答の数が設定されます。
{
"question": "wi-fi",
"isTest": false,
"top": 3
}
ビジネス ロジックと一緒に score プロパティを使用して、ユーザーに表示する回答の一覧を取得する
チャット ボットなどのクライアント アプリケーションが応答を受け取るときには、上位 3 つの質問が返されます。 score
プロパティを使用して、スコア間の近さを分析します。 この近さの範囲は、ユーザー独自のビジネス ロジックによって判定されます。
{
"answers": [
{
"questions": [
"Wi-Fi Direct Status Indicator"
],
"answer": "**Wi-Fi Direct Status Indicator**\n\nStatus bar icons indicate your current Wi-Fi Direct connection status: \n\nWhen your device is connected to another device using Wi-Fi Direct, '$ \n\n+ *+ ' Wi-Fi Direct is displayed in the Status bar.",
"score": 74.21,
"id": 607,
"source": "Bugbash KB.pdf",
"metadata": []
},
{
"questions": [
"Wi-Fi - Connections"
],
"answer": "**Wi-Fi**\n\nWi-Fi is a term used for certain types of Wireless Local Area Networks (WLAN). Wi-Fi communication requires access to a wireless Access Point (AP).",
"score": 74.15,
"id": 599,
"source": "Bugbash KB.pdf",
"metadata": []
},
{
"questions": [
"Turn Wi-Fi On or Off"
],
"answer": "**Turn Wi-Fi On or Off**\n\nTurning Wi-Fi on makes your device able to discover and connect to compatible in-range wireless APs. \n\n1. From a Home screen, tap ::: Apps > e Settings .\n2. Tap Connections > Wi-Fi , and then tap On/Off to turn Wi-Fi on or off.",
"score": 69.99,
"id": 600,
"source": "Bugbash KB.pdf",
"metadata": []
}
]
}
質問のスコアが類似しているときのクライアント アプリケーションのフォロー アップ
クライアント アプリケーションでは、意図を最も適切に表している 1 つの質問 をユーザーが選択するためのオプションを示して、質問が表示されます。
ユーザーが既存の質問の 1 つを選択すると、QnA Maker Train API を使用して、ユーザーの選択がフィードバックとしてクライアント アプリケーションから送信されます。 このフィードバックにより、アクティブ ラーニングのフィードバック ループが完了します。
Train API
アクティブ ラーニングのフィードバックは、Train API POST 要求を使用して QnA Maker に送信されます。 API シグネチャは次のとおりです。
POST https://<QnA-Maker-resource-name>.azurewebsites.net/qnamaker/knowledgebases/<knowledge-base-ID>/train
Authorization: EndpointKey <endpoint-key>
Content-Type: application/json
{"feedbackRecords": [{"userId": "1","userQuestion": "<question-text>","qnaId": 1}]}
HTTP 要求プロパティ | 名前 | Type | 目的 |
---|---|---|---|
URL ルート パラメーター | ナレッジ ベース ID | string | ナレッジ ベースの GUID。 |
カスタム サブドメイン | QnAMaker リソース名 | string | リソース名は、QnA Maker のカスタム サブドメインとして使用されます。 これは、ナレッジ ベースを公開した後に、[設定] ページで利用できます。 これは host として表示されます。 |
ヘッダー | Content-Type | string | API に送信される本文のメディアの種類。 既定値は application/json です。 |
ヘッダー | 承認 | string | エンドポイント キー (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。 |
Post 本文 | JSON オブジェクト | JSON | トレーニングのフィードバック |
JSON の本文には、次のようないくつかの設定があります。
JSON 本文のプロパティ | Type | 目的 |
---|---|---|
feedbackRecords |
array | フィードバックの一覧。 |
userId |
string | 提案された質問を受け入れるユーザーのユーザー ID。 ユーザー ID の形式は、ユーザーが決定します。 たとえば、電子メール アドレスをアーキテクチャ内の有効なユーザー ID とすることができます。 省略可能。 |
userQuestion |
string | ユーザーのクエリの正確なテキスト。 必須。 |
qnaID |
number | 質問の ID。GenerateAnswer 応答内にあります。 |
JSON 本文の例は、次のようになります。
{
"feedbackRecords": [
{
"userId": "1",
"userQuestion": "<question-text>",
"qnaId": 1
}
]
}
成功した応答は、ステータス 204 を返し、JSON 応答の本文は返しません。
多くのフィードバック レコードを単一呼び出しにバッチ処理する
ボットなどのクライアント側アプリケーションでは、データを格納してから、多くのレコードを 1 つの JSON 本文の feedbackRecords
配列に入れて送信できます。
JSON 本文の例は、次のようになります。
{
"feedbackRecords": [
{
"userId": "1",
"userQuestion": "How do I ...",
"qnaId": 1
},
{
"userId": "2",
"userQuestion": "Where is ...",
"qnaId": 40
},
{
"userId": "3",
"userQuestion": "When do I ...",
"qnaId": 33
}
]
}
ボット フレームワークのサンプル コード
ボット フレームワークのコードでは、ユーザーのクエリをアクティブ ラーニングに使用する必要がある場合は Train API を呼び出す必要があります。 記述するコードは 2 種類あります。
- クエリをアクティブ ラーニングに使用するかどうかを指定する
- アクティブ ラーニングのためにクエリを QnA Maker Train API に送り返す
Azure Bot のサンプルでは、これらのアクティビティの両方がプログラムされています。
Bot Framework 4.x での Train API のための C# コードの例
次のコードは、Train API を使用して情報を QnA Maker に送り返す方法を示しています。
public class FeedbackRecords
{
// <summary>
/// List of feedback records
/// </summary>
[JsonProperty("feedbackRecords")]
public FeedbackRecord[] Records { get; set; }
}
/// <summary>
/// Active learning feedback record
/// </summary>
public class FeedbackRecord
{
/// <summary>
/// User id
/// </summary>
public string UserId { get; set; }
/// <summary>
/// User question
/// </summary>
public string UserQuestion { get; set; }
/// <summary>
/// QnA Id
/// </summary>
public int QnaId { get; set; }
}
/// <summary>
/// Method to call REST-based QnAMaker Train API for Active Learning
/// </summary>
/// <param name="endpoint">Endpoint URI of the runtime</param>
/// <param name="FeedbackRecords">Feedback records train API</param>
/// <param name="kbId">Knowledgebase Id</param>
/// <param name="key">Endpoint key</param>
/// <param name="cancellationToken"> Cancellation token</param>
public async static void CallTrain(string endpoint, FeedbackRecords feedbackRecords, string kbId, string key, CancellationToken cancellationToken)
{
var uri = endpoint + "/knowledgebases/" + kbId + "/train/";
using (var client = new HttpClient())
{
using (var request = new HttpRequestMessage())
{
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(uri);
request.Content = new StringContent(JsonConvert.SerializeObject(feedbackRecords), Encoding.UTF8, "application/json");
request.Headers.Add("Authorization", "EndpointKey " + key);
var response = await client.SendAsync(request, cancellationToken);
await response.Content.ReadAsStringAsync();
}
}
}
Bot Framework 4.x での Train API のための Node.js コードの例
次のコードは、Train API を使用して情報を QnA Maker に送り返す方法を示しています。
async callTrain(stepContext){
var trainResponses = stepContext.values[this.qnaData];
var currentQuery = stepContext.values[this.currentQuery];
if(trainResponses.length > 1){
var reply = stepContext.context.activity.text;
var qnaResults = trainResponses.filter(r => r.questions[0] == reply);
if(qnaResults.length > 0){
stepContext.values[this.qnaData] = qnaResults;
var feedbackRecords = {
FeedbackRecords:[
{
UserId:stepContext.context.activity.id,
UserQuestion: currentQuery,
QnaId: qnaResults[0].id
}
]
};
// Call Active Learning Train API
this.activeLearningHelper.callTrain(this.qnaMaker.endpoint.host, feedbackRecords, this.qnaMaker.endpoint.knowledgeBaseId, this.qnaMaker.endpoint.endpointKey);
return await stepContext.next(qnaResults);
}
else{
return await stepContext.endDialog();
}
}
return await stepContext.next(stepContext.result);
}
ベスト プラクティス
アクティブ ラーニングを使用する場合のベスト プラクティスについては、ベスト プラクティスに関するページを参照してください。