Chatbot - 사용자 입력 수집 위한 고유 메세지 만들기


사용자 입력을 수집하도록 고유한 메세지 만들기

공식 문서에서 든 예시는 아래와 같다. 샘플 봇은 사용자에게 일련의 질문을 하고, 답변이 유효한지 검사해서 입력을 저장한다.

밑에 있는 그림은 봇과 사용자 프로필, 대화 흐름 클래스의 관계를 나타낸 그림이다.

custompromptbotsample-overview

  • UserProfile : 봇에서 수집할 사용자 정보에 대한 클래스
  • ConversationFlow : 사용자 정보를 수집하는 동안 대화 상태를 제어하는 클래스
  • ConversationFlow.Question : 대화 중인 위치를 추적하는 열거형

사용자 상태에서는 사용자 정보(이름, 나이, 선택한 날짜)를 추적하고 대화 상태에서는 사용자에게 질문한 내용을 추적한다.

여기서는 봇을 배포하지 않으므로 메모리 스토리지를 사용하도록 사용자 및 대화 상태를 모두 구성한다.

대화 및 사용자 개체 만들기

시작 시 사용자 및 대화 상태 개체를 만들고 봇 생성자에서 종속성 주입을 통해 해당 개체를 사용합니다.

Startup.cs[!code-csharpStartup.cs] Bots/CustomPromptBot.cs[!code-csharpconstructor]

이 대괄호 안에 나오는 저게 대체 무슨 말인지 모르겠어서 찾아봤는데 잘 나오지 않는다…ㅠㅠ

속성 접근자 만들기

사용자 프로필 및 대화 흐름 속성에 대한 속성 접근자를 만든 다음, GetAsync을 호출하여 상태에서 속성 값을 검색한다.

Bots/CustomPromptBot.cs

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
   
    var conversationStateAccessors = _conversationState.CreateProperty<ConversationFlow>(nameof(ConversationFlow));
    var flow = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationFlow(), cancellationToken);

    var userStateAccessors = _userState.CreateProperty<UserProfile>(nameof(UserProfile));
    var profile = await userStateAccessors.GetAsync(turnContext, () => new UserProfile(), cancellationToken);

이거는 전에 포스팅했던 사용자 대화 및 상태 저장에서도 나온 것이다.

turn이 끝나기 전에 SaveChangesAsync를 호출해서 스토리지에 상태 변경 내용을 작성한다.

    // Save changes.
    await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken);
    await _userState.SaveChangesAsync(turnContext, false, cancellationToken);
}

봇의 메세지 턴 처리기

메세지 작업을 처리할 때 메세지 처리기는 도우미 메서드를 사용하여 대화를 관리하고 사용자에게 메세지를 표시한다.

사용자 프로필 작성

봇은 이전 턴에서 요청된 봇의 질문에 따라 정보를 묻는 메세지를 사용자에게 표시한다.

https://github.com/microsoft/BotBuilder-Samples/blob/master/samples/csharp_dotnetcore/44.prompt-users-for-input/Bots/CustomPromptBot.cs