手把手教你搭建聊天機器人(LineBot+Python+QnAMaker+Heroku)-03串接QnAMaker Service

圓圓小熊(Maruマル)
5 min readJun 3, 2018

--

快速連結:

02 建造LineBot Backend Server 並部署至Heroku

01 建造QnAMakerService

在這個章節,我們要完成最後一個步驟!

把你的QnAMakerService串到Backend Server上去!

第一篇我們建立了QnAMaker,第二篇我們用Python開發Backend Server。我們將在Backend端對QnAMakerService發送問題請求(request),QnAMakerService比對完後會把答案(response)回給我們。

部署完Service後會得到下列發送Request需要準備的資料:

  1. EndPoint(https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases/{你的QnAMaker UUID}/generateAnswer)
  2. Header(Content-Type, Ocp-Apim-Subscription-Key)
  3. 發送問題的Body格式:{“question”:”你要問的問題”}

撰寫串接QnAMaker Service程式

我們寫一個get_answer function,去處理接收到的文字訊息。

我們在第一篇用Rest Client測試Endpoint時,可以看到Response的格式如下

{
"answers": [
{
"answer": "No good match found in the KB",
"questions": [],
"score": 0
}
]
}

因此我們下面的程式碼就是要針對這個Json檔案,取回我們要的answer

bot/views.py

def get_answer(message_text):

url = "https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases/{你的QnA Service UUID}/generateAnswer"

# 發送request到QnAMaker Endpoint要答案
response = requests.post(
url,
json.dumps({'question': message_text}),
headers={
'Content-Type': 'application/json',
'Ocp-Apim-Subscription-Key': '你的Key'
}
)

data = response.json()

try:
#我們使用免費service可能會超過限制(一秒可以發的request數)
if "error" in data:
return data["error"]["message"]
#這裡我們預設取第一個答案
answer = data['answers'][0]['answer']

return answer

except Exception:

return "Error occurs when finding answer"

而原本callback的function,我們要把原本(ECHO)使用者傳入訊息的部分,改成回傳從QnAMaker找到的Answer。

粗斜線標注的部分,是我們修改Echobot的程式碼。

@csrf_exempt
def callback(request):

if request.method == 'POST':
signature = request.META['HTTP_X_LINE_SIGNATURE']
body = request.body.decode('utf-8')

try:
events = parser.parse(body, signature)
except InvalidSignatureError:
return HttpResponseForbidden()
except LineBotApiError:
return HttpResponseBadRequest()

for event in events:
if isinstance(event, MessageEvent):
# 此處我們呼叫get_answer函數,從QnAMaker服務取得答案
answer = get_answer(event.message.text)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=answer)
)
return HttpResponse()
else:
return HttpResponseBadRequest()

此時我們再把改好的程式碼,Git Add/Push到Heroku上。

就可以再去LINE BOT 確認是否能正確回答存在QnAMaker知識庫的問題。

很好!辛苦了!!你已經完成整個Workshop。 你打造了一個帶有語意識別的聊天機器人。

程式碼傳送門

Github:https://github.com/hatsukiotowa/QnAMaker_Django_LineChatBot

--

--

圓圓小熊(Maruマル)
圓圓小熊(Maruマル)

Written by 圓圓小熊(Maruマル)

在日本東京打拼的軟體工程師。喜歡滑雪,旅遊,吃美食,寫程式,參加Meetup,以及比價。最近沈迷寫Chatbot,Django以及把玩AWS。

Responses (3)