Chatbot - QnA Maker를 사용하여 질문에 답변


QnA Maker는 사용자의 데이터에 대한 대화형 질문 및 답변 레이어를 제공한다.

이 서비스를 사용하면 자연어 처리를 이용해서 해당 질문의 의도를 해석할 필요 없이 봇에서 QnA Maker에 질문을 보내고 답변을 받을 수 있다.

예시 소개

Microsoft 공식 문서에 나와있는 예제는 다음과 같다.

qnabot-logic-flow

OnMessageActivityAsync는 수신된 각 사용자 입력에 대해 호출된다.

호출되면 샘플 코드의 appsetting.json 파일 내에 저장된 _configuration 정보에 액세스해서 미리 만들어논 QnA Maker KB에 연결할 값을 찾는다.

사용자 입력은 기술 자료(KB)에 보내지며 반환된 최선의 답변이 사용자에게 다시 표시된다

봇을 기술 자료에 연결하는 데 필요한 값 가져오기

  1. QnA Maker 사이트에서 KB를 선택한다.
  2. 기술 자료를 연 후 설정을 선택한다.
  3. 배포 세부 정보에서 Postman HTTP 형식의 코드를 본다.

필요한 것은 다음과 같다.

  • POST /knowledgebases//generateAnswer
  • 호스트:
  • 권한 부여: EndpointKey

호스트 URL 은 https://.azure.net/qnamaker처럼 https://로 시작하고 /qnamaker로 끝난다.

봇이 QnA Maker KB에 연결하려면 기술 자료 ID, 호스트 URL, 엔드포인트 키가 필요하다.

설정 파일 업데이트

방금 필요하다고 언급한 것들을 설정 파일에 추가한다.

appsettings.json

{
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "QnAKnowledgebaseId": "",
  "QnAEndpointKey": "",
  "QnAEndpointHostName": ""
}

QnA Maker 인스턴스 설정

먼저 QnA Maker KB에 액세스하기 위한 개체를 만든다.

그 전에 프로젝트에 Microsoft.Bot.Builder.AI.QnA NuGet 패키지가 설치되어 있는지 확인해야 한다.

QnABot.cs의 OnMessageActivityAsync method에서 QnAMaker 인스턴스를 만든다.

또한 위에서 appsettings.json에 저장한 연결 정보의 이름을 QnABot 클래스에서 끌어올 수도 있다.

Bots/QnABot.cs

var qnaMaker = new QnAMaker(new QnAMakerEndpoint
{
    KnowledgeBaseId = _configuration["QnAKnowledgebaseId"],
    EndpointKey = _configuration["QnAEndpointKey"],
    Host = _configuration["QnAEndpointHostName"]
},
null,
httpClient);

봇에서 QnA Maker 호출

봇에서 QnAMaker의 응답을 요구하는 경우 봇 코드에서 GetAnswersAsync()를 호출하여 현재 컨텍스트에 맞는 응답을 가져온다.

Bots/QnABot.cs

var options = new QnAMakerOptions { Top = 1 };

// The actual call to the QnA Maker service.
var response = await qnaMaker.GetAnswersAsync(turnContext, options);
if (response != null && response.Length > 0)
{
    await turnContext.SendActivityAsync(MessageFactory.Text(response[0].Answer), cancellationToken);
}
else
{