Learning Things

우리는 RiveScript의 커맨드에 대해서 배웠습니다. 그런데 봇이 우리 이름도 기억하지 못한다면 이 대화가 무슨 소용일까요?

RiveScript는 사용자에 대한 변수를 저장하고 반복할 수 있는 기능이 있습니다. 사용자의 변수를 저장하기 위해 <set>태그를 사용하고 변수를 검색하기 위해 <get>태그를 사용합니다. 다음 예제를 통해서 우리는 어떻게 사용자 변수를 저장하고 불러 올 수 있는지 알 수 있습니다.

+ my name is *
- <set name=<star>>It's nice to meet you, <get name>.

+ what is my name
- Your name is <get name>, silly!

+ i am # years old
- <set age=<star>>I will remember that you are <get age> years old.

+ how old am i
- You are <get age> years old.

예제를 실행시켜보면 봇은 우리의 나이와 이름을 기억하고 있다는 것을 알 수 있습니다. 또한 변수에 대해서 이야기 하고 있다면 begin.rive에 정의한 변수도 이용 할 수 있지 않을까? 라는 궁금증이 생길 수 있습니다. 유사한 방식으로 변수의 값을 불러 올 수 있습니다. 아래의 예제를 참고하세요. 

! version = 2.0 // Bot variables ! var name = Tutorial ! var age = 5

// The user can ask the bot its name too!
+ what is your name
- You can call me <bot name>.
- My name is <bot name>.

+ how old are you
- I am <bot age> years old.

이제 봇에게 이름과 나이를 물어보면 변수의 저장된 값을 대답할 것입니다.


Writing Conditionals


봇은 사용자의 대한 정보를 학습함으로써, 조건문은 그 변수의 값을 기반으로 응답을 하게 됩니다. 그렇지만 봇에게 내 이름을 말하기전에 내 이름을 물어보게 된다면 "Your name is undefined, silly!" 라고 응답할 것입니다. undefined이라고 나오는 이유는 변수의 값이 저장되어 있지 않기 때문이죠. 이는 봇이 단순 프로그램처럼 느껴질것입니다.

우리는 조건문을 사용하여 봇이 응답하기 전에 내이름을 알고 있는지 모르는지 모른다면 어떻게 응답해야 되는지를 정의 할 수 있습니다. 아래의 예를 보겠습니다.

+ what is my name
* <get name> == undefined => You never told me your name.
- Your name is <get name>, silly!
- Aren't you <get name>?

봇에게 이름을 묻는다면 봇은 정의 되지 않는 내용에 대해서 조건문을 수행할 것입니다. 그리고 이름이 입력 되어 있다면 응답중에서 하나를 보여 줄 것입니다.

조건은 변수를 값과 비교하는데 사용됩니다. 변수를 다른 변수와 비교할 수도 있습니다. 다음 예제를 보겠습니다.

+ my name is *
* <formal>   == <bot name> => Wow, we have the same name!<set name=<formal>>
* <get name> == undefined  => <set name=<formal>>Nice to meet you!
- <set oldname=<get name>><set name=<formal>>
^ I thought your name was <get oldname>?

행이 부족하다면 ^ Continuation커맨드를 사용해서 공간을 확보 할 수 있습니다. 조건은 위에서 아래로 점검됩니다. 

다음과 같은 비교 연산자를 사용할 수 있습니다.

==  equal to
eq  equal to (alias)
!=  not equal to
ne  not equal to (alias)
<>  not equal to (alias)

숫자를 비교하기 위해서는 아래의 비교 연산자를 사용해야 합니다.

<   less than
<=  less than or equal to
>   greater than
>=  greater than or equal to
다음은 다양한 비교 연산자를 사용한 예입니다.
+ what am i old enough to do
* <get age> == undefined => I don't know how old you are.
* <get age> >  25 => You can do anything you want.
* <get age> == 25 => You're old enough to rent a car with no extra fees.
* <get age> >  21 => You're old enough to drink, but not rent a car.
* <get age> == 21 => You're exactly old enough to drink.
* <get age> >  18 => You're old enough to gamble, but not drink.
* <get age> == 18 => You're exactly old enough to gamble.
- You're not old enough to do much of anything yet.


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

[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
[Tutorial] Priority Triggers  (0) 2017.03.08

이야기를 이어나갈때 어떻게 해야 할까요? 다음은 %(Previous)커맨드를 배워보겠습니다.

+ knock knock - who is there? + * % who is there? - <star> who? + * % * who - LOL! <star>! That's funny!

해당 예제를 실행해보면 "knock knock"라고 메시지를 입력했을 때 응답까지는 이해가 될 것입니다. 그다음 %커맨드가 무슨 의미인지를 알아야 되는데. "- who is there?"라는 응답이 왔을 때 그 다음 실행하게 되는 트리거를 정의한 것이라고 볼 수 있습니다. 2번째 트리거는 어떤 단어가 와도 봇은 이것을 가지고 이야기를 이어 나갈 수 있게 됩니다. 다음은 또 다른 예제 입니다.

! array colors = red blue green yellow
+ i have a dog
- What color is it?

+ (@colors)
% what color is it
- That's a silly color for a dog!

예제에서 개를 가지고 있다고 했을때 봇은 어떤 개고 어떤 색인지 물어보고 있습니다. 여기에서 배열에 저장된 칼러를 입력하면 봇은 이어 나갈 수 있지만 엉뚱한 대답을 하게 된다면 봇은 평소와 같은 새 메시지에 반응할 것입니다.

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

[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
[Tutorial] Priority Triggers  (0) 2017.03.08
[Tutorial] Arrays in Triggers  (0) 2017.03.08
  1. devel 2018.09.26 16:43 신고

    정말 유용한 정보 감사합니다. 근데 왜 utf-8을 줬음에도 한글로 하면 저 커맨트 가 안 먹힐까요...ㅜㅜ [*] 이것 또한 안먹혀서 애먹고 있습니다......

    • 프리월드 2019.04.05 17:21 신고

      어떤 환경에서 작업을 진행 했는지 모르겠지만 제가 개인적으로 안드로이드 환경에서 돌렸을때는 크게 문제는 없었습니다.

이번 시간에는 리디렉션(Redirections)에 대해서 알아보겠습니다. 

+ hello
- Hi there!
- Hey!
- Howdy!

+ hey
@ hello

+ hi
@ hello

이 예제에서 보기에 "hey", "hi"로 메시지를 보냈을 때 hello라는 트리거가 동작하도록 리디렉션을 정의하고 있습니다. 

+ * or something{weight=100}
- Or something. {@ <star>}

위의 예제를 합쳐서 "hi or something"라고 메시지를 보내면 "Or something. Hey!" 라고 응답할 것입니다. 와일드 카드로 정의된 트리거에 {@ <star>}태그가 리디렉션을 요청합니다. 하나의 와일드 카드만 사용할 경우에는 <@>과 같이 축약해서도 사용 할 수 있습니다.

+ hello *
- {@ hello} <@>

+ hello
- Hi there!

+ are you a bot
- How did you know I'm a machine?

다음 예제를 실행하여 "Hello, are you a bot?" 라고 입력하면 "Hi there! How did you know I'm a machine?"라고 응답할 것입니다.


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

[Tutorial] Conditionals  (0) 2017.03.09
[Tutorial] Short Discussions  (2) 2017.03.09
[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

+ Recent posts