Chatbot - 사용자 입력 수집 위한 고유 메세지 만들기
in CHATBOT on Microsoft Azure, 공부, Azure
사용자 입력을 수집하도록 고유한 메세지 만들기
공식 문서에서 든 예시는 아래와 같다. 샘플 봇은 사용자에게 일련의 질문을 하고, 답변이 유효한지 검사해서 입력을 저장한다.
밑에 있는 그림은 봇과 사용자 프로필, 대화 흐름 클래스의 관계를 나타낸 그림이다.
- 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);
}
봇의 메세지 턴 처리기
메세지 작업을 처리할 때 메세지 처리기는 도우미 메서드를 사용하여 대화를 관리하고 사용자에게 메세지를 표시한다.
사용자 프로필 작성
봇은 이전 턴에서 요청된 봇의 질문에 따라 정보를 묻는 메세지를 사용자에게 표시한다.