logo头像

Edward.K Thinking

QnA Maker API結合Azure Bots Service

在先前的[Azure QnA Maker API初體驗],可以很輕鬆建立屬於自己的QA知識庫,接下來就是要把這QA知識庫應用到現實場景,如果,單純用Web互動,可以直接呼叫QnA API就可以,而後續我們想要把這服務可以運用到各個Chat中,

建立Azure Bot Service


要在Azure建立Bot Service有兩種方式可以去見,一種是使用Web Bots,一種是使用Funtctions Bots,最後呈現結果上是大同小異,這裡就採用Azure Funtctions建立Bots Service,主要這個服務是要間接從輸入端到QnA API這樣而已,因此,Bot Template可以使用最基本的Template來使用就可以,其設定如下圖,只需要把相關資料填妥就可以

建立好Bot Service後,再來就是把呼叫QnA API程式加入進去,因此,到組建內開啟Azure Function程式,找到EchoDialog.csx檔案後,在裡面加入呼叫QnA API Maker的程式碼

首先,必須先引用兩個Namespace,後面會使用到,預設是沒有這兩個Namespace

1
2
using Newtonsoft.Json;
using System.Net;

此外,呼叫QnA API,需要填入knowledgebaseIdqnamakerSubscriptionKey這兩個參數,要找到這個參數,可以在QnA中的My QnA Service找到你想要呼叫的KB Service,而這兩個參數可以此Service的View Code裡面找到

加入要呼叫QnA API Function和一個回傳結果的QnAMakerResult物件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class QnAMakerResult
{
[JsonProperty(PropertyName = "answer")]
public string Answer { get; set; }

[JsonProperty(PropertyName = "score")]
public double Score { get; set; }
}
public QnAMakerResult QnA_Question(string Question)
{
string responseString = string.Empty;
var knowledgebaseId = "Use knowledge base id created";
var qnamakerSubscriptionKey = "Use subscription key";

Uri qnamakerUriBase = new Uri("https://westus.api.cognitive.microsoft.com/qnamaker/v1.0");
var builder = new UriBuilder($"{qnamakerUriBase}/knowledgebases/{knowledgebaseId}/generateAnswer");

var postBody = $"{{\"question\": \"{Question}\"}}";

using (WebClient client = new WebClient())
{
client.Encoding = System.Text.Encoding.UTF8;

client.Headers.Add("Ocp-Apim-Subscription-Key", qnamakerSubscriptionKey);
client.Headers.Add("Content-Type", "application/json");
responseString = client.UploadString(builder.Uri, postBody);
var response = JsonConvert.DeserializeObject<QnAMakerResult>(responseString);
return response;
}
}

並修改原本Azure Function的MessageReceivedAsync範例程式碼,改呼叫上面撰寫好的QnA_Question,並將從QnA API得到的結果回傳

1
2
3
4
5
6
7
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var message = await argument;

await context.PostAsync($"{QnA_Question(message.Text).Answer}");
context.Wait(MessageReceivedAsync);
}

然後儲存後並執行,就可以去Test in Web Chat進行測試了,若是上述沒有撰寫錯誤,就可以正常與QnA API溝通了。

上一篇