봇에서 언어 생성 템플릿 사용Use language generation templates in your bot

적용 대상: SDK v4APPLIES TO: SDK v4

LG(언어 생성) 템플릿을 사용하면 봇 개발자가 다양한 메시지와 미디어를 사용자에게 쉽게 보낼 수 있습니다.Language generation (LG) templates make it easy for bot developers to send a variety of messages and media to users. 이 문서에서는 LG 템플릿을 활용하여 간단한 텍스트 메시지 및 카드를 보내고 사용자의 텍스트 입력을 평가하는 방법을 보여 줍니다.This article shows you how to leverage LG templates to send simple text messages and cards, and how to evaluate text input from users.

사전 요구 사항Prerequisites

샘플 정보About the sample

이 LG 코어 봇 샘플에서는 공항 항공편 예약 애플리케이션의 예를 보여줍니다.This LG core bot sample shows an example of an airport flight booking application. LUIS 서비스를 사용하여 사용자 입력을 인식하고 인식된 상위 LUIS 의도를 반환합니다.It uses a LUIS service to recognize the user input and return the top recognized LUIS intent.

이 문서에서는 봇에서 LG 템플릿을 사용하는 상향식 접근 방법을 사용합니다.This article uses a bottom up approach to using LG templates in your bots. 다음 방법을 알게 됩니다.You will learn how to:

파일에서 템플릿 호출Call templates in files

.lg 파일에서 템플릿을 사용하려면 봇 논리에서 템플릿을 참조해야 합니다.To use templates in .lg files you need to reference them in your bot logic. 아래 지침에서는 만들 LG 템플릿을 Templates 개체로 로드하여 기본 봇 논리에서 참조되는 방법을 보여 줍니다.The instructions below show you how the LG templates you will create are referenced in your main bot logic by loading them into a Templates object. 이 예제에서는 welcomeCard.lg 의 템플릿을 사용합니다.The example uses the templates from welcomeCard.lg.

Microsoft.Bot.Builder.LanguageGeneration 패키지가 있는지 확인합니다.Make sure you have the Microsoft.Bot.Builder.LanguageGeneration package. 패키지에 로드할 다음 코드 조각을 추가합니다.Add the following snippet to load the package:

Bots/DialogAndWelcomeBot.csBots/DialogAndWelcomeBot.cs

using Microsoft.Bot.Builder.LanguageGeneration;

패키지를 로드한 후 _templates 라는 프라이빗 Templates 개체를 만듭니다.After loading the package create a private Templates object called _templates:

private Templates _templates;

_templates 개체는 .lg 파일에서 템플릿을 참조하는 데 사용됩니다.The _templates object is used to reference templates in your .lg files.

플랫폼 간 지원에 대한 경로를 결합하고 코드에 다음을 추가하여 welcomeCard.lg 를 포함하는 경로를 구문 분석합니다.Combine the path for cross-platform support and parse the path that contains welcomeCard.lg by adding the following to your code:

string[] paths = { ".", "Resources", "welcomeCard.lg" };
string fullPath = Path.Combine(paths);
_templates = Templates.ParseFile(fullPath);

이제 아래에 나온 대로 이름으로 welcomeCard.lg 에서 템플릿을 참조할 수 있습니다.Now you can can reference templates from the welcomeCard.lg by name, seen below:

foreach (var member in membersAdded)
{
    // Greet anyone that was not the target (recipient) of this message.
    // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
    if (member.Id != turnContext.Activity.Recipient.Id)
    {
        await turnContext.SendActivityAsync(ActivityFactory.FromObject(_templates.Evaluate("WelcomeCard", actions)));
    }
}

호출 SendActivityAsync()에서 WelcomeCard 템플릿이 참조되는 방법을 확인할 수 있습니다.Notice how the WelcomeCard template is referenced in the call SendActivityAsync().

이제 봇에서 템플릿을 참조할 수 있으므로 .lg 파일에서 템플릿 만들기를 시작하겠습니다.Now that your bot can reference templates, it's time to starting creating templates in LG files. LG를 사용하면 쉽게 대화의 다양성을 추가할 수 있습니다.By using LG you easily add conversational variety.

간단한 응답 템플릿 만들기Create a simple response template

단순 응답 템플릿은 컴퍼지션 및 확장에 사용되는 하나 이상의 텍스트 변형을 포함합니다.A simple response template includes one or more variations of text that are used for composition and expansion. 제공된 변형 중 하나는 LG 라이브러리에 의해 임의로 선택됩니다.One of the variations provided will be selected at random by the LG library.

PromptForDestinationCity, PromptForDepartureCityConfirmPrefix와 같은 BookingDialog.lg 의 단순 응답 템플릿은 다양한 항공편 예약 프롬프트에 다양성을 더합니다.The simple response templates in BookingDialog.lg, like PromptForDestinationCity, PromptForDepartureCity, and ConfirmPrefix, add variety to flight booking prompts.

Resources/BookingDialog.lgResources/BookingDialog.lg

# PromptForDestinationCity
- Where would you like to travel to?
- What is your destination city?

예를 들어 위에서 살펴본 PromptForDepartureCity에 대한 호출은 두 가지 가능한 텍스트 프롬프트 중 하나를 생성합니다.For example, a call to PromptForDepartureCity, seen above, will produce one of the two possible text prompts:

  • ‘어디로 여행하시나요?’Where would you like to travel to?
  • ‘대상 도시는 어디인가요?’What is your destination city?

메모리 참조Reference memory

더 복잡한 템플릿과 마찬가지로 간단한 응답 템플릿에서는 메모리를 참조할 수 있습니다.Like more complex templates, simple response templates can reference memory. BookingDialog.LG 에서 ConfirmMessage 단순 응답 템플릿은 Destination, OriginTravelDate 속성을 참조합니다.In BookingDialog.LG the ConfirmMessage simple response template references the Destination, Origin, and TravelDate properties:

Resources/BookingDialog.lgResources/BookingDialog.lg

# ConfirmMessage
- I have you traveling to: ${Destination} from: ${Origin} on: ${TravelDate}
- on ${TravelDate}, travelling from ${Origin} to ${Destination}

사용자가 Origin에 대해 ‘시애틀’, Destination에 대해 ‘파리’ TravelDate에 대해 05/24/2020 을 입력하는 경우 봇에서 다음 결과 중 하나를 생성합니다. If the user enters Seattle for the Origin, Paris for the Destination, and 05/24/2020 for the TravelDate, your bot will produce one of the following results:

  • ‘여행 편 예약은 파리행 시애틀발 05/24/2020 출발로 처리되었습니다.’I have you traveling to: Paris from: Seattle on: 05/24/2020
  • ‘05/24/2020에 시애틀에서 파리로 여행’on 05/24/2020, travelling from Seattle to Paris

조건부 응답 템플릿 만들기Create a conditional response template

조건부 응답 템플릿을 사용하면 조건에 따라 선택된 콘텐츠를 제작할 수 있습니다.A conditional response template lets you author content that's selected based on a condition. 모든 조건은 적응 식을 사용하여 표현됩니다.All conditions are expressed using adaptive expressions.

BookingDialogPromptForMissingInformation 템플릿은 if-else 템플릿의 예입니다.The PromptForMissingInformation template in BookingDialog.lg is an example of an if-else template. If-else 템플릿을 사용하면 조건의 연계 순서에 따라 컬렉션을 선택하는 템플릿을 작성할 수 있습니다.The if-else template lets you build a template that picks a collection based on a cascading order of conditions. 템플릿에서 속성이 null로 설정된 경우 사용자에게 정보를 입력하라는 메시지가 표시됩니다.In the template, the user is prompted for pieces of information if their properties are set to null:

Resources/BookingDialog.lgResources/BookingDialog.lg

# PromptForMissingInformation
- IF: ${Destination == null}
  - ${PromptForDestinationCity()}
- ELSEIF: ${Origin == null} 
  - ${PromptForDepartureCity()}
- ELSEIF: ${TravelDate == null}
  - ${PromptForTravelDate()}
- ELSE: 
  - ${ConfirmBooking()}

속성이 null이면 봇은 해당 속성과 연결된 템플릿을 호출합니다.If a property is null then the bot will call the template associated with that property. 모든 속성이 null이 아닌 값이면 ConfirmBooking 템플릿이 호출됩니다.If all properties are non-null values then the ConfirmBooking template is called.

다른 템플릿 참조Reference other templates

템플릿의 변형은 다른 템플릿을 참조할 수 있습니다.Variations in templates can reference other templates. 위의 예제에서 속성이 null이면 템플릿에서 관련 템플릿을 호출하여 누락된 정보를 확인합니다.In the example above, if a property is null then the template calls the relevant template to prompt for the missing information.

예를 들어 Destinationnull과 같으면 누락된 비행 목적지 정보를 얻기 위해 PromptforDestinationCity 템플릿이 ${PromptForDestinationCity()}를 통해 호출됩니다.For example, if Destination equals null, then the PromptforDestinationCity template would be called via ${PromptForDestinationCity()} to obtain the missing flight destination information. Null인 속성이 없으면 템플릿이 ConfirmBooking 프롬프트를 호출합니다.If none of the properties are null then the template calls the ConfirmBooking prompt.

카드 템플릿 만들기Create a cards template

언어 생성 템플릿은 카드와 미디어를 사용하여 보다 풍부한 대화형 환경을 만들 수 있습니다.Language generation templates can use cards and media to create a richer conversational experience. welcomeCard.lg 에서 4개의 템플릿을 사용하여 봇을 처음 시작할 때 표시되는 적응 카드를 만듭니다.In welcomeCard.lg, four templates are used to create the Adaptive Card that displays when you first start the bot.

Adaptive Card는 적응 카드 JSON 개체를 정의합니다.Adaptive Card defines an Adaptive card JSON object:

Resources/welcomeCard.lgResources/welcomeCard.lg

# AdaptiveCard
- ```
{
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "Image",
      "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU",
      "size": "stretch"
    },
    {
      "type": "TextBlock",
      "spacing": "medium",
      "size": "default",
      "weight": "bolder",
      "text": "${HeaderText()}",
      "wrap": true,
      "maxLines": 0
    },
    {
      "type": "TextBlock",
      "size": "default",
      "isSubtle": true,
      "text": "Now that you have successfully run your bot, follow the links in this Adaptive Card to expand your knowledge of Bot Framework.",
      "wrap": true,
      "maxLines": 0
    }
  ],
  "actions": [
    ${join(foreach(actions, item, cardActionTemplate(item.title, item.url, item.type)), ',')}
  ]
}
```

이 카드는 이미지를 표시하고 카드 헤더 제안된 작업 세트에 대한 LG 템플릿을 사용합니다.This card displays an image, and uses LG templates for the card header a set of suggested actions.

cardActionTemplate(title, url, type)을 호출하고 DialogAndWelcomeBot.csOnMembersAddedAsync() 메서드에서 title, urltype을 가져와서 actions을 채웁니다.The actions are filled in by calling cardActionTemplate(title, url, type) and obtaining thetitle, url, and type from the OnMembersAddedAsync() method in DialogAndWelcomeBot.cs:

Bots/DialogAndWelcomeBot.csBots/DialogAndWelcomeBot.cs

// Actions to include in the welcome card. These are passed to LG and are then included in the generated Welcome card.
var actions = new {
    actions = new List<Object>() {
        new {
            title = "Get an overview",
            url = "https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0"
        },
        new {
            title = "Ask a question",
            url = "https://stackoverflow.com/questions/tagged/botframework"
        },
        new {
            title = "Learn how to deploy",
            url = "https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0"
        }
    }

title은 제안된 작업 단추의 텍스트이며 url은 단추를 클릭할 때 열리는 URL입니다.The title is the text in the suggested action button, and the url is the url opened when the button is clicked.

마지막으로 WelcomeCardAdaptiveCard 템플릿을 호출하여 적응 카드 JSON 개체를 반환합니다.Finally the WelcomeCard calls the AdaptiveCard template to return the Adaptive card JSON object.

Resources/welcomeCard.lgResources/welcomeCard.lg

# WelcomeCard
[Activity
    Attachments = ${json(AdaptiveCard())}
]

ActivityAttachment() 함수에 대한 자세한 내용은 LG 라이브러리에서 함수 삽입을 참조하세요.For more information about the ActivityAttachment() function, read inject functions from the LG library

봇에 LUIS 추가Add LUIS to your bot

봇 논리 및 LG 템플릿을 업데이트한 후에는 봇에 LUIS를 추가할 수 있습니다.After updating your bot logic and LG templates you are ready to add LUIS to your bot. 다음 섹션의 단계에 따라 봇에 LUIS를 추가합니다.Follow the steps in the sections below to add LUIS to your bot:

봇 테스트Test the bot

최신 Bot Framework Emulator를 다운로드하여 설치합니다.Download and install the latest Bot Framework Emulator.

  1. 샘플을 머신에서 로컬로 실행합니다.Run the sample locally on your machine. 지침이 필요한 경우 C# 샘플, JS 샘플 또는 Python 샘플에 대한 추가 정보 파일을 참조하세요.If you need instructions, refer to the readme file for the C# Sample, JS Sample or Python Sample.

  2. 에뮬레이터에 "파리로 이동" 또는 "파리에서 베를린로 이동"과 같은 메시지를 입력 합니다.In the Emulator, type a message such as "travel to Paris" or "going from Paris to Berlin". FlightBooking.json 파일에서 검색된 발화를 사용하여 "Book flight" 의도를 학습시킵니다.Use any utterance found in the file FlightBooking.json for training the intent "Book flight".

LUIS 예약 입력

LUIS에서 반환된 상위 의도가 "Book flight"로 확인되면 봇이 여행 예약을 만들기에 충분한 정보가 저장될 때까지 추가 질문을 묻습니다.If the top intent returned from LUIS resolves to "Book flight" your bot will ask additional questions until it has enough information stored to create a travel booking. 충분한 정보가 수집되면 봇이 사용자에게 이러한 예약 정보를 다시 반환합니다.At that point it will return this booking information back to your user.

LUIS 예약 결과

이제 코드 봇 논리가 다시 설정되고, 추가 예약을 계속 만들 수 있습니다.At this point the code bot logic will reset and you can continue to create additional bookings.

추가 정보Additional Information