.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
}와 같은 중괄호를 포함하거나 매개 변수로 사용될 때 중괄호 없이 포함하여 표시됩니다.
엔터티를 매개 변수로 사용할 수 있습니다.
- 미리 빌드된 함수 내
- 조건부 응답 템플릿의 조건 내에서
- to template resolution call
변형에 미리 빌드된 함수 사용
적응 식에서 지원하는 미리 빌드된 함수를 일체 변형 텍스트에서 인라인으로 사용하여 더욱 강력한 텍스트 컴퍼지션을 달성할 수도 있습니다. 인라인 식을 사용하려면 중괄호로 래핑하기만 하면 됩니다.
# 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)}
추가 리소스
- C# API 참조
- JavaScript API 참조
- 적응형 도구를 사용하여 디버그를 읽고 .lg 파일을 분석하고 디버그하는 방법을 알아봅니다.