.lg 파일 형식

적용 대상: SDK v4

.lg 파일은 엔터티 참조 및 해당 컴퍼지션을 사용하여 언어 생성 템플릿을 설명합니다. 이 문서에서는 .lg 파일 형식으로 표현된 다양한 개념을 다룹니다.

특수 문자

설명

주석을 만드는 데 사용합니다 > . 이 접두사를 가진 모든 줄은 파서에서 건너뜁니다.

> This is a comment.

이스케이프 문자

이스케이프 문자로 \를 사용합니다.

# TemplateName
- You can say cheese and tomato \[toppings are optional\]

배열 및 개체

배열 만들기

배열을 만들려면 ${[object1, object2, ...]} 구문을 사용합니다. 예를 들어 이 식은 다음과 같습니다.

${['a', 'b', 'c']}

배열 ['a', 'b', 'c']을 반환합니다.

개체 만들기

개체를 만들려면 ${{key1:value1, key2:value2, ...}} 구문을 사용합니다. 예를 들어 이 식은 다음과 같습니다.

${{user: {name: "Wilson", age: 27}}}

다음 JSON 개체를 반환합니다.

{
  "user": {
    "name": "Wilson",
    "age": 27
  }
}

템플릿

템플릿은 언어 생성 시스템의 핵심 개념입니다. 각 템플릿에는 이름과 다음 중 하나가 있습니다.

  • 편차 텍스트 값 목록
  • 구조화된 콘텐츠 정의
  • 조건의 컬렉션은 각각 다음과 같습니다.
    • 적응 식
    • 조건당 일차 텍스트 값 목록

템플릿 이름

템플릿 이름은 대/소문자를 구분하며 문자, 밑줄 및 숫자만 포함할 수 있습니다. 다음은 .라는 TemplateName템플릿의 예입니다.

# TemplateName

템플릿은 숫자로 시작할 수 없으며 템플릿 이름의 일부를 숫자로 분할할 수 없습니다.

템플릿 응답 변형

변형은 Markdown 목록으로 표현됩니다. ' 또는 + 문자를 사용하여 각 변형의 -접두사를 지정할 수 있습니다.

# Template1
- text variation 1
- text variation 2
- one
- two

# Template2
* text variation 1
* text variation 2

# Template3
+ one
+ two

간단한 응답 템플릿

단순 응답 템플릿은 컴퍼지션 및 확장에 사용되는 하나 이상의 텍스트 변형을 포함합니다. 제공된 변형 중 하나는 LG 라이브러리에 의해 임의로 선택됩니다.

다음은 두 가지 변형을 포함하는 간단한 템플릿의 예입니다.

> Greeting template with two variations.
# GreetingPrefix
- Hi
- Hello

조건부 응답 템플릿

조건부 응답 템플릿을 사용하면 조건에 따라 선택된 콘텐츠를 작성할 수 있습니다. 모든 조건은 적응형 식을 사용하여 표현됩니다.

Important

조건부 템플릿은 단일 조건부 응답 템플릿에 중첩될 수 없습니다. 구조적 응답 템플릿에서 컴퍼지션을 사용하여 조건을 중첩시킵니다.

If-else 템플릿

If else 템플릿을 사용하면 조건의 연계 순서에 따라 컬렉션을 선택하는 템플릿을 작성할 수 있습니다. 평가는 하향식이며 조건이 true로 평가되거나 ELSE 블록이 적중되면 중지됩니다.

조건식은 중괄호 ${}로 묶입니다. 다음은 간단한 IF ELSE 조건부 응답 템플릿 정의를 보여 주는 예제입니다.

> time of day greeting reply template with conditions.
# timeOfDayGreeting
- IF: ${timeOfDay == 'morning'}
    - good morning
- ELSE:
    - good evening

if-else 조건부 응답 템플릿 정의를 보여 주는 또 다른 예제는 다음과 같습니다. 조건의 변형에 다른 단순 또는 조건부 응답 템플릿에 대한 참조를 포함할 수 있습니다.

# timeOfDayGreeting
- IF: ${timeOfDay == 'morning'}
    - ${morningTemplate()}
- ELSEIF: ${timeOfDay == 'afternoon'}
    - ${afternoonTemplate()}
- ELSE:
    - I love the evenings! Just saying. ${eveningTemplate()}

스위치 템플릿

스위치 템플릿을 사용하면 식의 값이 CASE 절에 일치시키는 템플릿을 디자인하고 해당 사례에 따라 출력을 생성할 수 있습니다. 조건 식은 중괄호 ${}로 묶입니다.

LG에서 SWITCH CASE DEFAULT 블록을 지정하는 방법은 다음과 같습니다.

# TestTemplate
- SWITCH: ${condition}
- CASE: ${case-expression-1}
    - output1
- CASE: ${case-expression-2}
    - output2
- DEFAULT:
   - final output

더 복잡한 SWITCH CASE DEFAULT 예제는 다음과 같습니다.

> Note: Any of the cases can include reference to one or more templates.
# greetInAWeek
- SWITCH: ${dayOfWeek(utcNow())}
- CASE: ${0}
    - Happy Sunday!
-CASE: ${6}
    - Happy Saturday!
-DEFAULT:
    - ${apology-phrase()}, ${defaultResponseTemplate()}

참고 항목

조건부 템플릿과 마찬가지로 스위치 템플릿은 중첩될 수 없습니다.

구조적 응답 템플릿

구조적 응답 템플릿을 통해 템플리팅, 컴퍼지션 및 대체와 같은 주요 LG 기능을 지원하는 동시에 구조화된 응답의 해석을 LG 라이브러리 호출자에게 맡기는 복잡한 구조를 정의할 수 있습니다.

봇 애플리케이션의 경우 기본적으로 다음을 지원합니다.

  • 작업 정의
  • 카드 정의

자세한 내용은 구조 응답 템플릿에 대해 읽어 보세요.

템플릿 컴퍼지션 및 확장

템플릿에 대한 참조

변형 텍스트에는 정교한 응답의 컴퍼지션 및 해상도를 지원하기 위해 명명된 다른 템플릿에 대한 참조가 포함될 수 있습니다. 다른 명명된 템플릿에 대한 참조는 ${<TemplateName>()}과 같은 중괄호를 사용하여 표시됩니다.

> Example of a template that includes composition reference to another template.
# GreetingReply
- ${GreetingPrefix()}, ${timeOfDayGreeting()}

# GreetingPrefix
- Hi
- Hello

# timeOfDayGreeting
- IF: ${timeOfDay == 'morning'}
    - good morning
- ELSEIF: ${timeOfDay == 'afternoon'}
    - good afternoon
- ELSE:
    - good evening

템플릿을 호출하면 GreetingReply 다음 확장 확인 중 하나가 발생할 수 있습니다.

Hi, good morning
Hi, good afternoon
Hi, good evening
Hello, good morning
Hello, good afternoon
Hello, good evening

개체

one-of 변형 텍스트 내에서 직접 사용하는 경우 엔터티 참조는 ${entityName}와 같은 중괄호를 포함하거나 매개 변수로 사용될 때 중괄호 없이 포함하여 표시됩니다.

엔터티를 매개 변수로 사용할 수 있습니다.

변형에 미리 빌드된 함수 사용

적응 식에서 지원하는 미리 빌드된 함수를 일체 변형 텍스트에서 인라인으로 사용하여 더욱 강력한 텍스트 컴퍼지션을 달성할 수도 있습니다. 인라인 식을 사용하려면 중괄호로 래핑하기만 하면 됩니다.

# RecentTasks
- IF: ${count(recentTasks) == 1}
    - Your most recent task is ${recentTasks[0]}. You can let me know if you want to add or complete a task.
- ELSEIF: ${count(recentTasks) == 2}
    - Your most recent tasks are ${join(recentTasks, ', ', ' and ')}. You can let me know if you want to add or complete a task.
- ELSEIF: ${count(recentTasks) > 2}
    - Your most recent ${count(recentTasks)} tasks are ${join(recentTasks, ', ', ' and ')}. You can let me know if you want to add or complete a task.
- ELSE:
    - You don't have any tasks.

위의 예제에서는 join 미리 빌드된 함수를 사용하여 recentTasks 컬렉션의 모든 값을 나열합니다.

템플릿 및 미리 빌드된 함수가 동일한 호출 서명을 공유하는 경우 템플릿 이름은 미리 빌드된 함수 이름과 같을 수 없습니다.

템플릿 이름은 미리 빌드된 함수 이름과 일치하지 않아야 합니다. 미리 빌드된 함수가 우선적으로 적용됩니다. 이러한 충돌을 방지하려면 템플릿 이름을 참조할 때 앞에 추가할 lg. 수 있습니다. 예시:

> Custom length function with one parameter.
# length(a)
- This is use's customized length function

# myfunc1
> will call prebuilt function length, and return 2
- ${length('hi')}

# mufunc2
> this calls the lg template and output 'This is use's customized length function'
- ${lg.length('hi')}

변형의 여러 줄 텍스트

각 일차 변형에는 큰따옴표로 묶인 여러 줄 텍스트가 포함될 수 있습니다.

# MultiLineExample
    - ```This is a multiline list
        - one
        - two
        ```
    - ```This is a multiline variation
        - three
        - four
    ```

여러 줄 변형은 요청된 작업을 중괄호${}로 묶어 템플릿 확장 및 엔터티 대체를 요청할 수 있습니다.

# MultiLineExample
    - ```
        Here is what I have for the order
        - Title: ${reservation.title}
        - Location: ${reservation.location}
        - Date/ time: ${reservation.dateTimeReadBack}
    ```

여러 줄 지원을 사용하면 언어 생성 하위 시스템이 복잡한 JSON 또는 XML(예: 봇의 음성 회신을 제어하는 SSML 래핑 텍스트)을 완전히 확인할 수 있습니다.

템플릿의 매개 변수화

컨텍스트 재사용을 지원하기 위해 템플릿을 매개 변수화할 수 있습니다. 템플릿에 대한 다른 호출자는 확장 확인에 사용하기 위해 서로 다른 값을 전달할 수 있습니다.

# timeOfDayGreetingTemplate (param1)
- IF: ${param1 == 'morning'}
    - good morning
- ELSEIF: ${param1 == 'afternoon'}
    - good afternoon
- ELSE:
    - good evening

# morningGreeting
- ${timeOfDayGreetingTemplate('morning')}

# timeOfDayGreeting
- ${timeOfDayGreetingTemplate(timeOfDay)}

외부 참조 가져오기

언어 생성 템플릿을 별도의 파일로 분할하고 다른 파일의 템플릿을 참조할 수 있습니다. Markdown 스타일 링크를 사용하여 다른 파일에 정의된 템플릿을 가져올 수 있습니다.

[Link description](filePathOrUri)

대상 파일에 정의된 모든 템플릿을 가져오게 됩니다. 템플릿 이름이 가져오는 파일에서 고유한지(또는 # \<namespace>.\<templatename>으로 네임스페이스가 지정되었는지) 확인합니다.

[Shared](../shared/common.lg)

LG에서 삽입된 함수

적응 식은 사용자 지정 함수 집합을 삽입하는 기능을 제공합니다. 자세한 내용은 LG 라이브러리에서 삽입된 함수를 읽어보세요.

옵션

개발자는 파서 옵션을 설정하여 입력 평가 방법을 추가로 사용자 지정할 수 있습니다. 표기 > !# 법을 사용하여 파서 옵션을 설정합니다.

Important

파일에 있는 마지막 설정은 동일한 문서에 있는 이전 설정을 능가합니다.

Strict 옵션

null 평가 결과에 대해 null 결과를 허용하지 않으려는 개발자는 엄격한 옵션을 구현할 수 있습니다. 다음은 간단한 strict 옵션의 예제입니다.

> !# @strict = true
# template
- hi

strict 옵션이 켜진 경우 null 오류는 친숙한 메시지를 throw합니다.

# welcome
- hi ${name}

이름이 null이면 진단 은 'name'이 null로 평가됩니다. [시작] '- hi ${name}'를 평가할 때 오류가 발생했습니다. strict가 false로 설정되거나 설정되지 않은 경우 호환되는 결과가 제공됩니다. 위의 샘플은 hi null을 생성합니다.

replaceNull 옵션

개발자는 replaceNull 옵션을 사용하여 평가된 식에서 null 값을 대체하는 대리자를 만들 수 있습니다.

> !# @replaceNull = ${path} is undefined

위의 예제에서 변수의 null 입력 path 은 ${path}로 대체됩니다. 다음 입력, 여기서 user.name은 Null입니다.

hi ${user.name}

hi user.name이 정의되지 않음이 됩니다.

lineBreakStyle 옵션

개발자는 LINEBreakStyle 옵션을 사용하여 LG 시스템이 줄 바꿈을 렌더링하는 방법에 대한 옵션을 설정할 수 있습니다. 현재 지원되는 두 가지 모드는 다음과 같습니다.

  • default: 여러 줄 텍스트의 줄 바꿈은 표준 줄 바꿈을 만듭니다.
  • markdown: 여러 줄 텍스트의 줄 바꿈이 자동으로 두 줄로 변환되어 줄 바꿈을 만듭니다.

아래 예제에서는 markdown으로 lineBreakStyle 옵션을 설정하는 방법을 보여 줍니다.

> !# @lineBreakStyle = markdown

네임스페이스 옵션

내보낼 LG 템플릿에 대한 네임스페이스를 등록할 수 있습니다. 지정된 네임스페이스가 없는 경우 네임스페이스는 확장명이 없는 파일 이름으로 설정됩니다.

아래 예제에서는 네임스페이스 옵션을 foo다음으로 설정하는 방법을 보여줍니다.

> !# @Namespace = foo

내보내기 옵션

내보낼 LG 템플릿 목록을 지정할 수 있습니다. 내보낸 템플릿은 미리 빌드된 함수처럼 호출할 수 있습니다.

아래 예제에서는 내보내기 옵션을 template1, template2다음으로 설정하는 방법을 보여 줍니다.

> !# @Namespace = foo
> !# @Exports = template1, template2

# template1(a, b)
- ${a + b}

# template2(a, b)
- ${join(a, b)}

이러한 내보낸 템플릿을 호출하는 데 사용합니다 foo.template1(1,2), foo.template2(['a', 'b', 'c'], ',') .

캐시 범위

캐시 범위 옵션을 사용하면 LG 평가자가 이전에 확인한 식을 다시 평가하는 시기와 캐시된 결과를 저장하고 사용하는 시기를 제어할 수 있습니다.

  • 전역 캐시 는 평가의 수명 주기에 효과적입니다. LG는 모든 평가 결과를 캐시하고 템플릿 이름과 매개 변수가 같으면 캐시에서 결과를 반환합니다.
  • 로컬 캐시 범위가 기본값입니다. 동일한 계층에서 이전 템플릿이 동일한 템플릿 이름과 동일한 매개 변수로 호출된 경우 캐시된 결과가 직접 반환됩니다.
  • 없음 캐시 범위는 모든 캐시 범위를 사용하지 않도록 설정하고 매번 새 결과를 반환합니다.

예를 들어 전역로컬 캐시 범위 예제를 참조하세요.

> !# @cacheScope= global // global cache
> !# @cacheScope= local // local cache
> !# @cacheScope= none // none cache
> !# @cacheScope= xxx // fallback to local cache

캐시 범위 옵션은 대/소문자를 구분하지 않습니다.

> !# @cacheScope= global // ok
> !# @CACHESCOPE= global // ok
> !# @cachescope= global // ok

캐시 범위는 Microsoft Entrance .lg 파일의 범위를 따릅니다.

다음과 같이 두 개의 파일이 a.lg 있다고 가정해 b.lg보겠습니다.

a.lg

> !# @cacheScope= global
 [import](b.lg)

b.lg

> !# @cacheScope= none
# template1
- ${template2()} ${template2()}

# template2
- ${rand(1, 10000000)}

다음 코드를 실행하는 경우 a.lg의 캐시 범위 옵션으로 인해 global 첫 번째 평가 결과의 캐시된 결과를 사용하는 것을 알 template2 수 있습니다.

var templates = Templates.ParseFile("a.lg");
var result = templates.Evaluate("template1"); // the second "template2" would use the cache of the first evaluate result

표시 영향 다시 실행

템플릿 이름이 "!"로 끝나는 경우 템플릿은 강제로 다시 실행됩니다. 이 결과는 캐시 범위에 관계없이 캐시에 추가되지 않습니다.

다음 템플릿이 있다고 가정해 보겠습니다.

# template2
- ${template1()} ${template1!()} ${template1()}

template1!() 가 발생하면 결과가 캐시에 추가됩니다. 두 번째 template1() 복제본은 첫 번째 template1()의 결과를 복제합니다. 최종 호출은 캐시에 저장된 결과를 사용합니다.

전역 캐시 범위 예제

다음 템플릿이 있다고 가정해 보겠습니다.

# template1
- ${template2()} ${template3()}

# template2
- ${rand(1, 10)}
- abc
- hi

# template3
- ${template2()}

template2 는 한 번 평가되고 두 번째 실행은 template3 첫 번째 실행의 캐시를 적용합니다.

또 다른 예제는 다음 코드 조각에 있습니다.

var templates = Templates.ParseFile("xxx.lg");
var result1 = templates.Evaluate("template", null, new EvaluationOptions { CacheScope = LGCacheScope.Global});

// The second evaluation would drop all the results cached before.
var result2 = templates.Evaluate("template", null, new EvaluationOptions { CacheScope = LGCacheScope.Global});

템플릿은 함수를 Templates.ParseFile() 사용하여 구문 분석되고 템플릿 평가 결과는 에 result1저장됩니다. 두 번째 평가 결과는 result2이전에 캐시된 모든 결과를 삭제합니다.

로컬 캐시 범위 예제

다음 예제에서는 로컬 캐시 범위가 작동 및 작동하지 않는 경우를 보여 줍니다. t() 매개 변수를 사용하는 템플릿이라고 subT() 가정합니다.

>  Cache works, the second template call would re-use the first's result.
# template1
- ${t(param)} ${t(param)}

> Cache doesn't work because param1's value is different with param2's. value)
# template2
- ${t(param1)} ${t(param2)}

> Cache doesn't work because of different layers.
# template3
- ${subT(param1)} ${t(param2)}

# subT(param)
- ${t(param)}

추가 리소스