언어 생성에서 사용자 지정 함수 사용Use custom functions in language generation

적용 대상: SDK v4APPLIES TO: SDK v4

개발자는 적응 식에서 지 원하는 미리 작성 된 함수와 LG (언어 생성) 템플릿의사용자 지정 함수를 모두 사용할 수 있습니다.Developers can use both prebuilt functions supported by adaptive expressions and custom functions in language generation (LG) templates. 이 문서에서는 봇의 사용자 지정 함수를 적응 식에 추가 하 고 LG 템플릿에서 함수를 사용 하는 방법을 보여 줍니다.This article shows you how to add a custom function in your bot to adaptive expressions and use the function in an LG template.

필수 조건Prerequisites

샘플 정보About the sample

이 LG 사용자 지정 함수 샘플은 적응 식에 간단한 사용자 지정 함수를 추가한 다음 LG 템플릿에서 해당 식을 사용 하는 방법의 예입니다.This LG custom functions sample is an example of how to add a simple custom function to adaptive expressions and then use that expression in an LG template. Bot 사용자에 게 번호를 요청 하 고, 입력이 올바르면 제곱근을 반환 합니다.The bot asks the user for a number, and if the input is valid returns the square root. 제곱근을 계산 하는 함수는 contoso.sqrt bot 논리에 정의 되며 봇 응답을 생성 하는 LG 템플릿에서 사용 됩니다.The function that computes the square root, contoso.sqrt, is defined in the bot logic, and is used in the LG template that generates bot responses.

이 문서에서는 상향식 접근 방법을 사용 하 여 LG 템플릿에서 사용자 지정 함수를 추가 하 고 사용 합니다.This article uses a bottom up approach to adding and using custom functions in LG templates. 다음 방법에 대해 알아봅니다.You will learn about how to:

패키지Packages

적응 식 및 LG를 사용 하려면 LanguageGenerationAdaptiveExpressions 패키지를 설치 합니다.To use adaptive expressions and LG, install the Microsoft.Bot.Builder.LanguageGeneration and AdaptiveExpressions packages. 이 샘플에는 패키지가 이미 설치 되어 있습니다.The sample already has the packaged installed. 그런 다음, 기본 봇 파일에 다음 코드 조각을 추가 합니다.Then add the following snippet to your main bot file.

Bot/CustomFunctionBot .csBots/CustomFunctionBot.cs

using Microsoft.Bot.Builder.LanguageGeneration;
using AdaptiveExpressions;

적응 식에 사용자 지정 함수 추가Add a custom function to adaptive expressions

Bot에서 사용자 지정 함수를 사용 하려면 적응 식에 추가 해야 합니다.To use custom functions in your bot, you need to add them to adaptive expressions. 이 섹션에서는 적응형 식에 이라는 사용자 지정 함수를 추가 하는 방법을 보여 줍니다 contoso.sqrt .This section shows how to add a custom function named contoso.sqrt to adaptive expressions.

사용자 지정 함수 이름이 포함 된 문자열 상수를 bot 생성자에 추가 하 여 시작 합니다.Start by adding a string constant with the name of your custom function to your bot constructor. 함수 이름은 짧아야 하지만 인식할 수 있어야 합니다.The name of your function should be short but recognizable. 이 샘플에서 사용자 지정 함수의 이름은입니다 contoso.sqrt .In this sample, the custom function is named contoso.sqrt:

Bot/CustomFunctionBot .csBots/CustomFunctionBot.cs

const string mySqrtFnName = "contoso.sqrt";

중요

네임 스페이스 충돌을 방지 하기 위해 함수에 접두사를 붙입니다.Prefix your functions to avoid namespace collisions.

에서 함수 이름은 contoso 접두사 이며 sqrt , 함수에서 반환 하는 제곱근의 경우 short입니다.In the function name contoso is the prefix and sqrt is short hand for square root, which the function returns.

이제 bot 생성자에서 함수에 대 한 논리를 정의 하 고 함수를 사용 하 여 적응 식에 추가할 수 있습니다 Expression.Functions.Add() .Now you can define the logic for your function in your bot constructor and add it to adaptive expressions using the Expression.Functions.Add() function. 사용자 지정 함수를 적응 식에 추가 하면 미리 빌드된 함수를 사용할 때와 마찬가지로 LG 템플릿 간에 함수를 사용할 수 있습니다.Adding your custom function to adaptive expression makes it possible to use your function across LG templates, just as you can with any of the prebuilt functions.

아래 코드 조각은 적응 식에으로 정의 된 함수를 추가 하는 방법을 보여 줍니다 mySqrtFnName .The snippet below shows how to add a function, defined as mySqrtFnName, to adaptive expressions. 이 함수는 단일 인수의 제곱근 (유효한 경우)을 반환 args 하 고, 그렇지 않은 경우에는를 반환 합니다 null .This function returns the square root of a single argument, args, if valid, and null if not not:

// Add custom sqrt function
Expression.Functions.Add(mySqrtFnName, (args) =>
{
    object retValue = null;
    if (args[0] != null)
    {
        double dblValue;
        if (double.TryParse(args[0], out dblValue))
        {
            retValue = Math.Sqrt(dblValue);
        }
    }
    return retValue;
});

LG 템플릿에서 사용자 지정 함수 사용Use your custom function in an LG template

적응 식에 사용자 지정 함수를 추가한 후 LG 템플릿에서 사용할 수 있습니다.After adding your custom function to adaptive expressions you can use it in LG templates. 이 섹션에서는 사용자 입력이 유효한 지 여부에 따라 봇의 응답을 설정 하는 방법을 설명 합니다.This section describes how to set up the bot's response depending on whether the user input was valid.

Lg 에는 다음과 같은 두 가지 템플릿 정의가 있습니다. 단순 응답 템플릿과 sqrtReadBack 조건부 응답 템플릿이 있습니다. sqrtTemplateThere are two template definitions in main.lg: the simple response template sqrtReadBack and the conditional response template sqrtTemplate:

리소스/주. lgResources/main.lg

# sqrtReadBack
- You said '${text}'. ${sqrtTemplate()}.

이 템플릿은 사용자 입력을 포함 하는 응답을 생성 하 ${text} 고, 두 번째 조건문의 결과를 생성 합니다 sqrtTemplate .This template generates a response that contains the user input, ${text} and the result of the second conditional if-else template sqrtTemplate:

# sqrtTemplate
- IF : ${contoso.sqrt(text) != null}
    - It's square root is ${coalesce(contoso.sqrt(text), 'NaN')}
- ELSE : 
    - Sqrt not possible.

이 템플릿에서의 결과는 응답을 contoso.sqrt(text) 결정 하는 데 사용 됩니다.In this template, the result of contoso.sqrt(text) is used to determine the response:

  • 결과가 null 이 아닌 경우 블록 아래의 줄 IF 이에 사용 됩니다 sqrtReadBack .If the result is not null, the line under the IF block is used in sqrtReadBack. 이 줄에서는 인라인 식를 사용 ${coalesce(contoso.sqrt(text), 'NaN)} 합니다.Note that this line uses an inline expression, ${coalesce(contoso.sqrt(text), 'NaN)}. 미리 작성 된 함수 병합 은 null이 아닌 경우 결과를 반환 contoso.sqrt(text) 하 고 null 인 경우 결과를 반환 합니다 NaN .The prebuilt function coalesce returns the result of contoso.sqrt(text) if it is not null and NaN if it is null.
  • 결과가 null 이면 블록 아래의 줄 ELSE 이에서 사용 됩니다 sqrtReadBack .If the result is null, the line under the ELSE block is used in sqrtReadBack.

봇에서 LG 템플릿 로드 및 사용Load and use your LG template in your bot

이제 lg에서 봇의 응답 템플릿을 만들었으므로 sqrtReadBack 봇의 논리 에서이 템플릿을 사용할 수 있습니다.Now that you've created your bot's response template sqrtReadBack in main.lg, you can use the template in your bot's logic.

시작 하려면 라는 private 개체를 만듭니다 Templates _templates .To start, create a private Templates object called _templates.

Bot/CustomFunctionBot .csBots/CustomFunctionBot.cs

protected Templates _templates;

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

그런 다음 플랫폼 간 지원에 대 한 경로를 결합 합니다.Then combine the path for cross-platform support. 다음을 추가 하 여 lg 를 포함 해야 합니다.Make sure to include main.lg by adding the following:

var lgFilePath = Path.Join(Directory.GetCurrentDirectory(), "Resources", "main.lg");

이제 아래와 같이에서 파일을 구문 분석 lgFilePath 하 고 LG 템플릿을 로드할 수 있습니다.Now you can parse the files in lgFilePath and load your LG templates, as shown below. 기본적으로이 Expression.Function 함수는 사용자 지정 함수를 포함 하는를 사용 합니다.By default this uses Expression.Function, which includes your custom function.

_templates = Templates.ParseFile(lgFilePath);

이제 템플릿이 로드 되어 봇에서 이름으로 참조할 수 있습니다.Your templates are now loaded and you can reference them by name in your bot. 이 샘플에서는 평가 결과가 sqrtReadBack 사용자에 게 전송 된로 사용 됩니다 replyText .In this sample, the result of evaluating sqrtReadBack is used as the replyText sent to the user.

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    var replyText = _templates.Evaluate("sqrtReadBack", turnContext.Activity);
    await turnContext.SendActivityAsync(ActivityFactory.FromObject(replyText), cancellationToken);
}

이제 봇을 테스트할 준비가 되었습니다.You're now ready to test your bot.

봇 테스트Test the bot

Bot Framework Emulator 최신 버전을 다운로드하여설치합니다.Download and install the latest version of the Bot Framework Emulator.

  1. 샘플을 머신에서 로컬로 실행합니다.Run the sample locally on your machine. 지침이 필요한 경우 C#또는 Javascript 샘플에 대한 추가 정보 파일을 참조하세요.If you need instructions, refer to the README file for the C#or Javascript sample.
  2. 에뮬레이터에서 아무 것도 입력합니다.In the Emulator, type anything. 에뮬레이터는 입력된 숫자의 제곱근과 다른 NaN 모든 입력에 대해 를 반환합니다.You will notice that the Emulator will return the square root of numbers entered and NaN for all other input.

봇 테스트

추가 정보Additional Information