手把手教你搭建聊天機器人(LineBot+Python+QnAMaker+Heroku)-03串接QnAMaker Service
快速連結:
02 建造LineBot Backend Server 並部署至Heroku
在這個章節,我們要完成最後一個步驟!
把你的QnAMakerService串到Backend Server上去!
第一篇我們建立了QnAMaker,第二篇我們用Python開發Backend Server。我們將在Backend端對QnAMakerService發送問題請求(request),QnAMakerService比對完後會把答案(response)回給我們。
部署完Service後會得到下列發送Request需要準備的資料:
- EndPoint(https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases/{你的QnAMaker UUID}/generateAnswer)
- Header(Content-Type, Ocp-Apim-Subscription-Key)
- 發送問題的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