Bot Builder v4에서 봇 개발 : 기술 개발 - 4개의 메시지 유형에 대한 액션 추가

지난번 까지 템플릿으로 만들어진 솔루션을 보았습니다. 이번에는 새롭게 메시지 타입의 액션을 추가해 보겠습니다.

추가할 액션



현재 시간을 반환하는 작업을 추가합니다.

LUIS 업데이트



메시지 타입은 LUIS 로 판정을 실시하기 때문에, 우선은 LUIS 의 갱신으로부터 실시합니다.

1. Deployment\Resources\LU\en-us\HelloSkill.lu를 열고 다음을 추가합니다.
## GetTime
- what time is it now?
- tell me current time
- show me current time
- Do you know what time it is now?
- get current time

2. PowerShell에서 모델 업데이트.
cd <プロジェクトフォルダ>
.\Deployment\Scripts\update_cognitive_models.ps1

3. 결과를 확인.


4. LUIS 측에서도 확인.


5. Services\HelloSkillLuis.cs에 새 의도가 있는지 확인합니다.


Response 추가



그런 다음 메시지를 추가합니다. 본래는 전언어 추가합니다만, 여기에서는 영어만으로 합니다.

1. Responses 폴더에 GetTimeResponses.lg를 추가합니다.
> ------------ Activity templates ------------

# CurrentTimeMessage
[Activity
    Text = @{CurrentTimeText()}
    InputHint = acceptingInput
]


> ------------ Text templates ------------

# CurrentTimeText
- It's @{CurrentTime}

2. 언어 파일은 지원하는 분 필요하므로, 파일을 카피해 확장자를 각각의 언어로 설정.


3. Startup.cs에서 템플릿에 추가.
var templateFiles = new List<string>() { "MainResponses", "SampleResponses", "GetTimeResponses" };

4. Visual Studio에서 각 파일의 속성에서 "Copy if newer"를 선택합니다.


매니페스트 업데이트



dispatchModels\intents에 GetTime을 추가하기만 하면 됩니다.


GetTimeDialog 추가



1. Dialogs 폴더에 GetTimeDialog.cs를 추가합니다.

GetTimeDialog.cs
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Dialogs;

namespace HelloSkill.Dialogs
{
    public class GetTimeDialog : SkillDialogBase
    {
        public GetTimeDialog(
            IServiceProvider serviceProvider,
            IBotTelemetryClient telemetryClient)
            : base(nameof(GetTimeDialog), serviceProvider, telemetryClient)
        {
            var getTimeWaterfall = new WaterfallStep[]
            {
                GetCurrentTime,
                End,
            };

            AddDialog(new WaterfallDialog(nameof(GetTimeDialog), getTimeWaterfall));

            InitialDialogId = nameof(GetTimeDialog);
        }

        private async Task<DialogTurnResult> GetCurrentTime(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            dynamic currentTime = new { CurrentTime = DateTime.Now.ToString() };
            var response = TemplateEngine.GenerateActivityForLocale("CurrentTimeMessage", currentTime);
            await stepContext.Context.SendActivityAsync(response);
            return await stepContext.NextAsync();
        }

        private Task<DialogTurnResult> End(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            return stepContext.EndDialogAsync();
        }
    }
}

2. Startup.cs에 대화 상자를 추가합니다.
// Register dialogs
services.AddTransient<SampleDialog>();
services.AddTransient<SampleAction>();
services.AddTransient<GetTimeDialog>();
services.AddTransient<MainDialog>();

3. MainDialog.cs에서 MainDialog 클래스 속성에 GetTimeDialog를 추가합니다.

MainDialog.cs
private GetTimeDialog _getTimeDialog;

4. 생성자에서 인스턴스를 가져옵니다.

MainDialog.cs
_getTimeDialog = serviceProvider.GetService<GetTimeDialog>();
AddDialog(_getTimeDialog);

5. RouteStepAsync 메서드로 분기를 추가합니다.

MainDialog.cs
switch (intent)
{
    case HelloSkillLuis.Intent.Sample:
        {
            return await stepContext.BeginDialogAsync(_sampleDialog.Id);
        }
    case HelloSkillLuis.Intent.GetTime:
        {
            return await stepContext.BeginDialogAsync(_getTimeDialog.Id);
        }
    case HelloSkillLuis.Intent.None:
    default:
        {
            // intent was identified but not yet implemented
            await stepContext.Context.SendActivityAsync(_templateEngine.GenerateActivityForLocale("UnsupportedMessage"));
            return await stepContext.NextAsync();
        }
}

동작 확인



구현이 끝났기 때문에 즉시 테스트해 보겠습니다.

로컬 테스트



구현이 끝났으므로 먼저 단독으로 테스트합니다. F5를 눌러 디버그 실행. 에뮬레이터로 동작을 확인.


공개 및 테스트



이번에는 어시스턴트 봇을 통해 테스트를 실시합니다.

1. publish.ps1 스크립트로 스킬을 공개.
.\Deployment\Scripts\publish.ps1 -name kenakamuhelloskill-om7pvdw -resourceGroup kenakamuhelloskill

2. 변경된 매니페스트를 확인.


3. 어시스턴트 봇 측도 botskills update 로 스킬을 갱신.
botskills update --remoteManifest "https://kenakamuhelloskill-om7pvdw.azurewebsites.net/manifest/manifest-1.1.json" --cs --luisFolder "<HelloSkill へのパス>\Deployment\Resources\LU\"

4. 어시스턴트 봇용 Dispatch LUIS 앱에서 HellSkill에 새 예문이 추가되었는지 확인합니다.


5. 어시스턴트 봇도 Azure에 게시하여 동작을 확인합니다.
.\Deployment\Scripts\publish.ps1 -name kenakamumyassistant-qbp5igb -resourceGroup kenakamumyassistant



요약



메시지 타입의 스킬은 지금까지의 지식으로 거의 동작이 이루어집니다. 다음번에는 이벤트 타입의 스킬에 대해 살펴보겠습니다.

다음 기사로
목차로 돌아가기

좋은 웹페이지 즐겨찾기