Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[chatbot + AI = 下一代操作模式][36]Chatbot整合QnAMaker - 使用對話查找知識集

[chatbot + AI = 下一代操作模式][36]Chatbot整合QnAMaker - 使用對話查找知識集.jpg
圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 

在上一篇([35]使用QnA Maker打造問答知識類型資料集服務)介紹了QnA Maker的主要目的,以及如何使用之後,下一個問題就是要怎麽把QnA Maker整合到程式裡面。

在這一篇將介紹如何把QnA Maker的服務整合到Chatbot裡面。

這篇的程式碼github頁面是alantsai-samples/mhat-hotelbot:blog/chapter-36

整合QnA Maker到Chatbot

Bot Builder SDK裡面有提供QnA Maker的Dialog,因此要整合到Chatbot裡面會比較容易一些。不過,提供的QnAMakerDialog還需要做一些微調,因此還是會建立一個Dialog做這些相關的微調。

整個需要調整的部分如下:

  1. 安裝有QnAMaker的Dialog套件
  2. 增加BasicQnAMakerDialog
  3. 調整RootLuisDialog
  4. 調整web.config
  5. 測試

安裝有QnAMaker的Dialog套件

預設,包含QnAMakerDialog的package并沒有安裝進來,因此第一件事情是要安裝套件Microsoft.Bot.Builder.CognitiveServices

可以在Package Manager Console裡面輸入:Install-Package Microsoft.Bot.Builder.CognitiveServices

增加BasicQnAMakerDialog

套件安裝好了之後,要建立一個class,名稱爲BasicQnAMakerDialog,這個class主要目的是微調内建的QnAMakerDialog

首先,建立了兩個繼承QnAMakerDialog的Dialog,這個的主要目的是爲了區分PreviewGA版本的兩個Dialog:

public static string GetNoFoundText()
{
	var message = "没找到您问题的答案。";

	var key = "DefaultNoFoundText";

	if (ConfigurationManager.AppSettings[key] != null
		&& string.IsNullOrEmpty
			(ConfigurationManager.AppSettings[key]) == false)
	{
		message = ConfigurationManager.AppSettings[key].ToString();
	}

	return message;
}

// Dialog for QnAMaker Preview service
[Serializable]
public class BasicQnAMakerPreviewDialog : QnAMakerDialog
{
	// Go to https://qnamaker.ai and feed data, train & publish your QnA Knowledgebase.
	// Parameters to QnAMakerService are:
	// Required: subscriptionKey, knowledgebaseId, 
	// Optional: defaultMessage, scoreThreshold[Range 0.0 – 1.0]
	public BasicQnAMakerPreviewDialog() : base(new QnAMakerService
		(new QnAMakerAttribute(ConfigurationManager.AppSettings["QnAAuthKey"],
			ConfigurationManager.AppSettings["QnAKnowledgebaseId"], 
			BasicQnAMakerDialog.GetNoFoundText(), 0.5)))
	{ }
}

// Dialog for QnAMaker GA service
[Serializable]
public class BasicQnAMakerDialogGA : QnAMakerDialog
{
	// Go to https://qnamaker.ai and feed data, train & publish your QnA Knowledgebase.
	// Parameters to QnAMakerService are:
	// Required: qnaAuthKey, knowledgebaseId, endpointHostName
	// Optional: defaultMessage, scoreThreshold[Range 0.0 – 1.0]
	public BasicQnAMakerDialogGA() : base(new QnAMakerService
		(new QnAMakerAttribute(ConfigurationManager.AppSettings["QnAAuthKey"], 
			ConfigurationManager.AppSettings["QnAKnowledgebaseId"], 
			BasicQnAMakerDialog.GetNoFoundText(), 0.5, 1, 
			ConfigurationManager.AppSettings["QnAEndpointHostName"])))
	{ }

}
在上面的程式碼裡面還有一個方法GetNoFoundText,主要用來顯示沒找到QnA的情況下要顯示的字。這個預設值可以透過AppSetting:DefaultNoFoundText來做設定。

建立好了這兩個Dialog了之後,接下來就是觸發這兩個Dialog的部分:

public async Task StartAsync(IDialogContext context)
{
	await context.PostAsync("請輸入您的問題");

	context.Wait(MessageReceviedAsync);
}

private async Task MessageReceviedAsync
	(IDialogContext context, IAwaitable<object> result)
{
	var message = context.Activity;

	var qnaKBId = ConfigurationManager
		.AppSettings["QnAKnowledgebaseId"];
	var endpointHostName = ConfigurationManager
		.AppSettings["QnAEndpointHostName"];

	if (!string.IsNullOrEmpty(qnaKBId))
	{
		if (string.IsNullOrEmpty(endpointHostName))
			await context.Forward(new BasicQnAMakerPreviewDialog(),
				AfterAnswerAsync, message, CancellationToken.None);
		else
			await context.Forward(new BasicQnAMakerDialogGA(),
				AfterAnswerAsync, message, CancellationToken.None);
	}
	else
	{
		await context.PostAsync("請設定好QnA Maker的knowledge id以及key");
	}
}

調整RootLuisDialog

接下來就可以在luis.ai加入一個新的intent叫做QnA,然後加入一個utterance叫做我有問題

chrome_2018-08-19_21-51-14.png
LUIS設定畫面

這邊設定好了之後,回去改code:RootLuisDialog,怎加對應的處理:

[LuisIntent("QnA")]
public Task QnA
   (IDialogContext context, LuisResult result)
{
	context.Call(new BasicQnAMakerDialog(),
		(ctx, res) =>
		{
			ctx.Wait(MessageReceived);

			return Task.CompletedTask;
		});

	return Task.CompletedTask;
}

調整web.config

到目前爲止基本上code都修改好了,不過code裡面有埋了一些設定需要加入在web.configAppSetting裡面:

<add key="QnAKnowledgebaseId" value="<Knowledge Id>" />
<add key="QnAEndpointHostName" value="<Host>" />
<add key="QnAAuthKey" value="<Auth Key>" />

這三個值還記得在上一篇publish了之後可以取得,這邊要注意,Host是整個網址(例如:https://mhathotelbotqna.azurewebsites.net/qnamaker

b6d6a09e-b289-4e8d-becd-d3ecfff703d3.png
上圖是publish得到三個值得截圖

測試

最後,用Bot Emulator來對功能進行測試:

botframework-emulator_2018-08-19_22-01-46.png
測試功能

結語

這篇介紹了如何把QnA Maker的服務和Chatbot做了結合,可以用問答的方式查找知識庫的内容。

到目前爲止雖然已經可以使用QnA Maker了,不過在維護QnA Maker知識都靠一個一個key太慢了,如果已經有現成的檔案或者現成的網頁可不可以直接截取出來呢?再來,靠一個人維護太累,可不可以多個人同時維護一個Knowledge base呢?

這些將在下一篇([37]維護QnA Maker的知識庫 - 設定url或者檔案為來源、多人維護以及離綫定義知識庫)做介紹。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus