지금까지 우리는 RiveScript의 TAG에 대해서 공부 했습니다. 

우리가 공부했던  태그의 예는 <star><get>, {topic}입니다.

실제로는 이 보다 더 많은 태그가 있고 우리는 이를 사용할 수 있습니다!

이번에는 우리가 배우지 않은 태그와 태그 사용 방법을 배워보겠습니다. 

태그는 일반적으로 화살괄호(<>)안에 태그를 입력하는 형태로 사용이 되며 중괄호({})는 주변의 텍스를 수정하는데 사용이 됩니다. 태그는 일반적으로 특별히 명시된 경우를 제외하고 모든 RiveScript 명령과 함께 사용할 수 있습니다.

  • <botstar><botstar1> - <botstarN>

이 <star>태그는 와 비슷하지만 % Previous에 있는 와일드 카드를 가져옵니다. 다음은 그 예입니다.

+ i bought a new *
- Oh? What color is your new <star>?

+ (@colors)
% oh what color is your new *
- <star> is a pretty color for a <botstar>.

실제로 실행해보면 <botstar>태그는 이전의 트리거에 표시된 즉 %에 사용된 와일드카드를 가지고 오게 됩니다. "i bought a new car"라고 입력하게 되면 car = <star>가 됩니다. 그리고 "blue"라고 컬러 값을 입력 했을 때 blue = <star>가 되지만 이전에 car = <botstar>가 되게 됩니다. 잘 이해가 안 될 수도 있지만 자주 사용하다보면 어떤 식으로 구동하는지 잘 알 수 있을 것입니다. 물론 와일드 카드 수에 따라서 <botstar1>로 사용할 수 있습니다.

  • <input><reply>

<input>, <reply> 태그는 사용자 및 봇이 각각 보낸 이전 메시지를 표시하는데 사용됩니다. 이전의 9개 메시지까지가 저장이 되며 <input1> 에서 <input9>까지 <reply1>에서 <reply9>까지 사용이 가능합니다. 다음은 태그가 사용되는 몇가지 예제입니다.

// If the user repeats the bot's previous message
+ <reply>
- Don't repeat what I say.

// If the user keeps repeating themselves over and over.
+ <input1>
* <input1> == <input2> => That's the second time you've repeated yourself.
* <input1> == <input3> => If you repeat yourself again I'll stop talking.
* <input1> == <input4> => That's it. I'm not talking.{topic=sorry}
- Please don't repeat yourself.

// An example that uses both tags
+ why did you say that
- I said, "<reply>", because you said, "<input>".
  • <id>

<id>는 기본적으로  localuser이며 RiveScript는 사용자 ID를 통해서 여러 사용자를 구분합니다. 동일한 RiveScript 인터프리터를 사용하여 여러 사용자에 대한 응답을 제공 할 수 있으며 ID를 기반으로 사용자 변수를 별도로 유지합니다. 다음은 일반 사용자와 관리자를 구분하는 방법의 예입니다.

! var master = kirsle

+ am i your master
* <id> == <bot master> => Yes, you are. Hi Kirsle!
- No, <bot master> is my master, and you are <id>.
  • <bot>

<bot>태그는 봇 변수를 검색하는데 사용됩니다. 또한 봇 변수를 설정하는데 사용할 수도 있습니다. 봇 변수는 RiveScript 인터프리터 인스턴스에 대해 "전역"으로 간주 될 수 있습니다. 즉, 봇의 이름을 Aiden으로 설정하면 사용자의 ID와 상관없이 요청하는 모든 사람의 이름이 Aiden이됩니다. 이것은 특정 사용자 ID에 연결된 사용자 변수와 대조됩니다. 

+ what is your name
- You can call me <bot name>.

+ tell me about yourself
- I am <bot name>, a chatterbot written by <bot master>.

// Setting a bot variable dynamically
+ i hate you
- Aww! You've just ruined my day.<bot mood=depressed>
  • <env>

<env> 태그는 전역 변수를 검색하는 데 사용됩니다. 또한 전역 변수를 설정할 때도 사용할 수 있습니다.

예를 들어 RiveScript 인터프리터가 모든 환경 변수를 RiveScript 전역으로 복사하면 CGI 기반 RiveScript 봇이 사용자에게 자신의 IP 주소를 알릴 수 있습니다.

+ what is my ip
- Your IP address is: <env REMOTE_ADDR>

다음은 전역변수를 설정하는 방법에 대한 예제입니다. 이 예제에서 관리자는 디버그 모드를 켜거나 끌 수 있습니다.

+ set debug mode (true|false)
* <id> == <bot master> => <env debug=<star>>Debug mode set to <star>.
- You're not my master.
  • <add><sub><mult><div>

이 태그는 숫자 변수를 각각 더하거나 빼거나 곱하거나 나눌 수 있습니다.

+ give me 5 points
- <add points=5>You have been given 5 points. Your balance is: <get points>.

정의되지 않는 변수 예를 들어 points를 사용하면 기본 0으로 초기화됩니다. 그리고 숫자가 아닐시에는 오류가 발생합니다. 또한 이 태그는 + Trigger와 함께 사용할 수는 없습니다. 

<formal><sentence><uppercase><lowercase>

<formal>은 각 단어의 첫글자를 대문자로 만듭니다.

<sentence>는 첫 단어를 대문자로 만듭니다.

<uppercase><lowercase>전체 문자열을 대문자 또는 소문자로 만듭니다.

  • <call>

이 태그는 매크로를 호출하는 데 사용됩니다.

// Call a macro named "reverse" and give it an argument
+ say * to me in reverse
- <call>reverse <star></call>

다만 이 예제는 우리가 배우지 않은 "Object Macros"에 해당 되는 내용이기 때문에 자세한 내용은 다음에 다루도록 하겠습니다.



'프로그래밍 > RiveScript' 카테고리의 다른 글

[Tutorial] CONCLUSION  (0) 2017.03.09
[Tutorial] TAGS  (0) 2017.03.09
[Tutorial] MORE DEFINITIONS  (0) 2017.03.09
[Tutorial] The Begin Block  (0) 2017.03.09
[Tutorial] Topics  (0) 2017.03.09
[Tutorial] Conditionals  (0) 2017.03.09

begin.rive로 다시 돌아가서 유용한 2가지 타입이 있습니다.


Global Variables


전역 변수(Global Variables)는 봇 변수(bot variables)와 비슷하지만 봇과 관련은 없습니다. 

전역 변수는 RiveScript 인터프리터에 의해 정의 될 수 있습니다. 이번에는  RiveScript 인터프리터에 직접 영향을주는 두 가지 특수한 전역 변수에 대해서 배워 보겠습니다.


Debug Mode

! global debug = true
! global debug = false

이 전역 변수는 RiveScript 인터프리터에서 디버그 모드를 켜거나 끌 수 있습니다. 디버그 모드는 https://play.rivescript.com/에서 Debug Mode를 클릭하면 실제 어떻게 출력 되는지 볼 수 있습니다.


Recursion Depth

! global depth = 50

이 전역 변수는 RiveScript 응답은 서로 리다이렉트 할 수 있기 때문에 무한 재귀를 피할 수있는 보호 기능이 있습니다 (예를 들어, 다른 트리거로 리다이렉트되고 그 트리거가 처음 트리거로 리다이렉트하는 등).

기본적으로 제한 값으로 50으로 설정이 됩니다. 즉, 50개의 리디렉션 후에 응답을 찾을 수 없으면 "ERR: Deep Recursion Detected"라고 응답합니다.  또한 이 값은 0보다 큰수여야 합니다.


Person Substitutions


1인칭 대명사와 2인칭 대명사를 교환하기 위한 기능입니다. brain에서 정의해기 때문에 begin.rive에서 작성 되어야 합니다. 대체를 정의하기 위한 방법은 다음과 같습니다. 

! person i am    = you are
! person you are = i am
! person i'm     = you're
! person you're  = I'm
! person my      = your
! person your    = my
! person you     = I
! person i       = you

대체를 호출 하려면 <person>태그(<star>대치 가능)를 사용하거나 {person}...{/person}로 사용할 수 있습니다. 실제 예를 통해서 테스트를 해보겠습니다.

+ say *
- Umm... "<person>"

실제로 구동 상태에서 "say I am the greatest"라고 메시지를 보내면 봇은 "Umm... "you are the greatest"라고 응답할 것입니다. 만약 대치 하지 않았다고 한다면 봇은 "i am the greatest"라고 말했을 것입니다.

'프로그래밍 > RiveScript' 카테고리의 다른 글

[Tutorial] CONCLUSION  (0) 2017.03.09
[Tutorial] TAGS  (0) 2017.03.09
[Tutorial] MORE DEFINITIONS  (0) 2017.03.09
[Tutorial] The Begin Block  (0) 2017.03.09
[Tutorial] Topics  (0) 2017.03.09
[Tutorial] Conditionals  (0) 2017.03.09


LABELED SECTIONS

레이블이 지정된 섹션에는 세 가지 유형이 있습니다.

레이블은 > 기호를 사용하여 정의되며 <로 끝납니다.

완료되면 라벨이 붙은 모든 섹션이 제대로 닫혀 있어야합니다 (파일의 끝에 있더라도).

스타일을 위해서 레이블이 붙은 섹션의 내용도 들여 써야합니다.

라벨이 지정된 섹션은 서로 안에 삽입 할 수 없습니다.


Topics

토픽(Topic)은 트리거의 논리접 그룹을 말합니다. 사용자가 토픽안에 있으면 봇은 토픽 안에 있는 트리거에만 동작합니다.

+ i hate you
- You're really mean! I'm not talking again until you apologize.{topic=sorry}

> topic sorry

  // This will match if the word "sorry" exists ANYWHERE in their message
  + [*] sorry [*]
  - It's OK, I'll forgive you!{topic=random}

  + *
  - Nope, not until you apologize.
  - Say you're sorry!
  - Apologize!

< topic

해당 예제에서는 "i hate you"라고 트리거가 동작할 때 토픽은 sorry로 넘어가며 해당 토픽에서 빠져 나오기 위해서는 sorry라를 트리거를 작동시켜야지만 빠져 나올 수 있습니다. 태그는 가장 기본적으로 정의되는 {topic=random}토픽이며 sorry 토픽에서 빠져나오기 위해서 {topic=random}태그를 사용하게 됩니다.

토픽은 상속 할 수 있으며 다른 트리거를 포함 시킬 수 있습니다. 그렇지만 이것은 고급 사용자를 위한 것이고 Tutorial 범위에 벗어납니다. 이에 대해 자세한 예를 보고 싶다면 rpg.rive를 참고하시기 바랍니다.

존재하지 않는 토픽을 지정하면 더이상 대화를 할 수 없냐고 물어 볼 수 있지만 RiveScript는 이를 감지해서 자동으로 기본 토픽("random")으로 되돌립니다. 

'프로그래밍 > RiveScript' 카테고리의 다른 글

[Tutorial] MORE DEFINITIONS  (0) 2017.03.09
[Tutorial] The Begin Block  (0) 2017.03.09
[Tutorial] Topics  (0) 2017.03.09
[Tutorial] Conditionals  (0) 2017.03.09
[Tutorial] Short Discussions  (2) 2017.03.09
[Tutorial] Redirections  (0) 2017.03.09

이번 시간에는 배열을 사용하는 방법에 대해서 배워보겠습니다. 아래의 예제를 살펴보면, "what color is my blue shirt?"라고 물어보는 질문에 color와 와일드 카드를 통해서 bot은 응답하도록 되어있습니다.

+ what color is my (red|blue|green|yellow) *
- Your <star2> is <star1>, silly!

()안에 몇가지 color들이 정의된 것을 볼 수 있습니다. 이렇게 사용해도 되지만 color가 필요한 트리거가 몇가지 더 생길 수가 있습니다. 그럼 그때마다 (red|blue|green|yellow)이 내용을 복사해서 붙여넣기 해야되고 그렇게 한다고 하더라도 나중에 black, white등의 color가 새로 추가 될때에는 기존의 스크립트를 다 찾아서 수정하기에는 어려움이 있습니다. 그래서 RiveScript에서는 배열(Arrays)을 통해서 이러한 문제점을 해결 할 수 있습니다. 

배열은 ! array 커멘드를 통해서 정의가 됩니다. 이전 시간에 정의하는 모든 커멘드는 begin.rive에 작성되어야 된다고 설명드렸습니다. 그렇게 때문에 배열 또한 begin.rive에 작성되어야 합니다.

! array colors = red blue green yellow

이제 우리는 배열을 정의할 수 있습니다. 다음 예제를 통해서 배열을 어떻게 활용하는지 알아보겠습니다.

+ what color is my (@colors) *
- Your <star2> is <star1>, silly!
- Do I look dumb to you? It's <star1>!

+ i am wearing a (@colors) shirt
- Do you really like <star>?

예제에서 보시는거와 같이 <star>태그를 사용할 수 있으며 사용하지 않는 경우에는 ()를 제거해주면 됩니다.

// Without parenthesis, the array doesn't go into a <star> tag.
+ what color is my @colors *
- I don't know what color your <star> is.

배열은 optionals에서도 적용할 수 있지만 <star>태그를 안에 사용할 수 는 없습니다. 

왜냐하면 옵션은 생략 가능 하기 때문입니다.

// Arrays in an optional + i am wearing a [@colors] * - Do you really like <star>?

배열을 정의할때 배열 항목을 공백 (단일 단어에 유용함) 또는 파이프 기호 (|)로 구분할 수 있습니다.

// Single word array items
! array colors = red blue green yellow

// Multiple word items
! array blues = light blue|dark blue|medium blue

배열을 정의 할 때 Continuations를 사용하면 각 행의 항목을 공백으로 또는 파이프로 나뉠 수 있습니다. 

// A lot of colors!
! array colors = red blue green yellow orange cyan fuchsia magenta
^ light red|dark red|light blue|dark blue|light yellow|dark yellow
^ light orange|dark orange|light cyan|dark cyan|light fuchsia
^ dark fuchsia|light magenta|dark magenta
^ black gray white silver
^ light gray|dark gray


'프로그래밍 > RiveScript' 카테고리의 다른 글

[Tutorial] Redirections  (0) 2017.03.09
[Tutorial] Priority Triggers  (0) 2017.03.08
[Tutorial] Arrays in Triggers  (0) 2017.03.08
[Tutorial] Alternatives and Optionals  (0) 2017.03.07
[Tutorial] TRIGGERS  (0) 2017.03.07
[Tutorial] The Begin File  (0) 2017.03.07

+ Recent posts