티스토리 뷰

    스크립트 파일을 작성하고 빌드하기


이제 3장과 4장에서 살펴 본 내용을 파일로 만들어 Dorothy에 적용해 보기로 하자. 먼저 3장 (1)절의 내용을 아래와 같이 파일로 만들자. 문서 편집기를 열어 아래의 내용을 입력하고 kpop.top 이라는 이름으로 저장해서 Dorothy 폴더에 놓아둔다. 3장과 4장의 내용 전체를 입력해도 되지만 하나씩 차근히 알아본다는 차원에서 일부만 입력하고 테스트해 보기로 한다. 이때 UTF-8 형식으로 저장해야 한다는 점을 잊지 말자.


위의 파일 내용은 크게 컨셉을 선언하는 부분과 토픽, 그리고 토픽 내의 룰로 이뤄져 있는데 가장 먼저 주목해야 할 곳은 토픽의 키워드 목록이다. 이 토픽의 키워드는 컨셉으로 선언되어 있는데 이를 위해 파일의 도입부에서 컨셉을 먼저 만들었다. 토픽 내에 있는 3개의 룰은, 첫째 챗봇이 하는 질문, 둘째 그 질문을 챗봇이 받았다고 가정한 경우 챗봇의 답변, 마지막으로 사용자가 실제 그 질문을 하는 경우에 대한 각각의 룰이다. 이와 같은 3단 구성에 대해서는 7(3)절 토픽의 논리적 구조에서 다시 한 번 상세히 설명하기로 하겠다. 토픽의 속성으로 keeprepeat를 명기한 것은 테스트를 위해 한 번 사용한 룰이라도 계속 사용할 수 있도록 하기 위한 것으로 테스트가 끝난 후 실제 서비스할 때는 모두 삭제해야 한다

이제 위의 파일을 빌드해서 Dorothy를 만들어 보자. CS를 기동시킨 후 :build Dorothy reset을 명령한다. reset 명령을 주는 이유는 Dorothy가 기억하고 있는 모든 변수를 초기화 시켜 올바른 테스트가 되도록 하기 위함이다. Build 결과는 다음과 같을 것이다 (일부만 캡처하였고 완전한 내용은 Users폴더 아래에 builddorothy_log.txt 파일에 저장된다.)


빌드 과정을 통해 CS가 알려주는 가장 중요한 경고 3가지는 첫째 정의되지 않은 컨셉 사용, 둘째 정의되지 않은 라벨 사용(reuse 등에서 사용), 셋째 등록되지 않은 단어의 사용이다. 이 중에서 첫번째와 두번째는 수정을 하면 되고 세번째는 보조사전에 단어를 등록해 주면 된다.

위의 결과 화면을 보면 등록되지 않은 단어를 사용하고 있다는 경고를 볼 수 있다. 시스템이 작동 되지 않을 정도의 에러는 아니기 때문에 컴파일이 중단되지는 않았지만 대화에 사용할 단어는 사전에 등록하는 것이 필요하므로 사용할 단어를 먼저 등록하기로 한다. 단어를 등록해야 이후 룰 매칭이나 입력한 단어의 저장, 지식베이스에 저장 등 여러가지를 할 수 있다.

문서 편집기를 열어 아래의 내용을 입력해 넣고 kpopConcept.top라는 이름으로 저장한 후 Dorothy 폴더에 넣어 놓자. (파일 이름은 임의로 정한 것이며 작성자가 바꿔도 된다.) 아래 내용은 컨셉 명령에 NOUN, VERB, NOUN_PROPER_SINGULAR, ADJECTIVE 등을 지정하여 새로운 단어를 보조 사전에 등록하는 것이다. 누락과 중복을 쉽게 알아보기 위해 "~투애니원" 컨셉에 사용한 단어는 "~투애니원사전", "~티아라" 컨셉에 사용한 단어는 "~티아라사전" 등으로 나눠서 등록하였다. 팬들이 부르는 애칭을 포함하여 빈번하게 발생하는 오탈자 등을 광범위하게 포함하는 것이 좋겠다.



화일 편집을 끝냈으면 ConEmu에서 ":build Dorothy reset"을 실행해 보자. 이번에는 not a known word 경고가 없을 것이다. 이제 word 명령어로 CS에 잘 등록되어 있는지 직접 확인해 보자. 명령어 형식은 

:word 투애니원


 인데, MS-Windows에서는 UTF-8로 한글 입력이 안되므로 위의 명령은 파일로 만들어 실행해 보기로 하자. 문서 편집기를 열어 파일의 첫 줄에 위의 명령어를 입력하고 파일 이름을 test.txt로 지정한 후 chatscript 루트 디렉토리에 저장하자. (readme.txt 파일이 있는 위치이다.) 그런 후 chatscript 명령어 모드에서 콘솔에서 다음과 같이 입력한다. 

:source test.txt


 그러면 test.txt에 있는 내용을 사용자가 직접 입력한 것처럼 CS서버에 한 줄 단위로 입력하게 된다. 그리고 그 결과는 화면에도 출력하고 Users폴더 내에 로그화일로도 저장한다. (현재 alphago로 로그인 했다면 로그화일이름 log-alphago.txt 이다.)


결과는 위와 같을 것이다. 보다시피 투애니원이라는 단어는 명사 및 고유명사 단수로 등록되었고 ~투애니원사전과 ~투애니원에 등록되어 있음을 알 수 있다. 이렇게 word 명령어로 특정 단어를 조사하면 그 단어에 대해 CS가 알고 있는 모든 것을 보여준다. 현재는 투애니원이라는 단어에 대해 정의된 것이 없어서 빈 곳이 많지만, 예를 들어 school이나 company같은 영어 단어를 테스트해 보면 빈틈없이 다 보여주게 될 것이다. (한글이 섞여 있지 “:word school” 등과 같은 경우에는 콘솔에 직접 입력하는 것이 더 간편하다.)

  

    키워드 연관관계 확인하기

 

이제 컴파일이 경고 없이 끝났으므로 실제 대화 테스트를 해 보기로 하자. ConEmu 화면의 위쪽 빈칸 부분에 마우스를 갖다 대고 오른쪽 버튼을 눌러 판업 메뉴를 부르자. 이 팝업 메뉴에서 첫 줄의 "New console"을 선택하면 새로운 콘솔창이 나타나는데 이곳에서 "cs"를 입력하면 chatscript의 binaries 폴더로 이동할 것이다. 이제 "chatscript port=1024 userlog"를 입력하고 엔터키를 누르면 CS가 서버 모드로 동작을 시작한다. 웹서버(httpd)도 더블클릭하여 가동시키면 웹브라우저로 접속할 수 있는 상태가 된다.

웹 브라우저를 열어서 주소창에 http://127.0.0.1/index.php 를 입력하고 엔터키를 누른다.[1] 로그인 입력란에 이름을 짧게 한 단어로 쓰고 (예를 들면 hercules) 메시지 입력란에 음악 좋아해요?”라고 입력한 후 send를 눌러보자. 그러면 Dorothy는 대본과 다른 반응을 보일 것이다. 얼버무리기 용으로 작성된 영어 출력문을 내 놓고 있을 것이다. 작성한 룰과 동일한 입력문을 입력하였는데 매칭에 실패하고 있는 것이다.

 

작성한 룰 : ?: ( 음악 좋아* ) reuse(FaveKPOP)

입력문 : 음악 좋아해요?

 

이렇게 매칭이 안될 때, 첫번째로 점검해 볼 수 있는 것이 입력문과 룰이 매칭되는지 룰 단위 테스트를 해 보는 것이다. (한글이 포함되어 있으므로 test.txt 파일에 아래 내용을 입력, 저장한 후 source 명령어로 테스트하면 된다.)

 

:testpattern ( 음악 좋아* ) 음악 좋아해요

 

testpattern명령어는 말 그대로 패턴과 입력문의 관계를 점검하는 것인데 괄호 안에 패턴을 적어주고 연속해서 입력문을 적어주면 그 둘이 매칭되는지를 알려주는 툴이다. 위 명령어의 결과는,


마지막 줄의 “Matched”에서 볼 수 있듯이 매칭이 된다는 것이다. 그런데 왜 실제 대화 상황에서는 매칭이 안되는 것인가? 이런 경우가 가장 흔한 실수인데, 저 룰이 포함된 토픽 자체가 활성화 되지 않았기 때문이다.

저 룰을 포함한 토픽이 활성화되고 있는가를 확인해 보자. 입력문과 매칭될 것으로 기대했던 룰, 그 룰을 포함하고 있는 토픽이 활성화 되는지를 확인하는 것이다. Chatscript 명령어 모드(1번 콘솔창)에서 아래의 명령을 입력해 보자.

 

:verify ~kpop[2]


이 명렁어는 ~kpop 토픽 내의 룰들이 그 토픽의 키워드와 연결되고 있는지를 점검하는 명령어이다. 위와 같이 명령하면 아래와 같은 진단 결과를 얻게 될 것이다. (hercules와 주고 받은 모든 대화는 Users 폴더 아래의 log-hercules.txt 파일에 기록된다.)


1. 명령어가 무엇인지 보여 준다.

2. 키워드가 없는 룰이 1개 있다.

3. 그 룰은 ~kpop토픽의 2번째 룰의 0번째 예상응답이다. (0번째란 말은 예상응답이 없다는 말로 2번째 룰 그 자체를 가리킨다. 예상응답이 있는 경우를 대비해 3계층 구조로 룰을 지정하고 있다.) 

4. 그 룰을 문자열로 나타내 주고 있다.

5. verify해야 할 것이 1개 있다는 요약문이다.


위의 결과에서 보다시피 "토픽의 키워드와 연관되지 않은 룰이 하나 있다 (1 Missing keyword)는 것을 알 수 있다. 이 룰은 자신이 속해 있는 토픽과 키워드 공유를 하고 있지 않기 때문에 이 룰을 겨냥해서 입력문이 들어와도 이 토픽이 활성화되지 않고 따라서 매칭 여부가 비교되는 기회조차 갖지 못하게 된다. 해결 방안은 토픽의 키워드 목록에 "KPOP"이라는 단어를 추가하는 것이다. KPOP을 좀 더 일반화 시켜 아래와 같은 컨셉으로 작성하고 이 "~노래" 컨셉을 토픽 키워드에 추가한 후 다시 build 해 보자. 수정한 부분만 굵은 글씨로 표시하였다.



 이제 첫번째 콘솔창에서 :build Dorothy reset을 실행하고, 컴파일이 끝나면 수정한 내용을 반영할 수 있도록 CS서버를 새로 기동시킨다. CS서버를 새로 기동시키기 위해서는 웹브라우저의 메시지 창에 :restart를 입력하고 send 함으로써 가능하다.

여기서 메시지 창을 통해 명령어를 전송할 수 있다는 점에 의아해 할 수 있는데, 이는 테스트 하는 동안의 편의를 위한 것이고 테스트가 끝난 후에는 메시지 창을 통한 명령어의 전송을  차단하거나 미리 등록한 사용자만 가능하도록 바꿀 수 있다. 현재는 모두에게 허락되어 있는데 등록한 사용자에게만 가능하도록 하겠다면 다음과 같이 수정하면 된다.

 

l  수정할 파일 : chatscript/authorizedIP.txt

l  현재 내용 : all

l  수정할 내용 : L_t8e3s7t8

 

수정할 내용에는 대문자 L_로 시작하여 뒤에 사용자 이름을 적으면 되는데, 쉽게 추측할 수 없는 사용자 이름을 쓰는 것이 좋을 것이다. 위와 같이 적었다면 브라우저로 로그인하는 IDt8e3s7t8일 경우에만 메시지 창의 명령어를 서버에 전송할 수 있다. 이제 다시 돌아와서 시스템이 restart를 하면, 곧이어 :reset 명령을 준다. 그런 후 웹브라우저의 메시지 창에 음악 좋아해요?”를 입력하면 이제는 의도했던 대답인 저는 K-POP을 좋아해요라는 대답을 확인할 수 있을 것이다

결론적으로 아래의 관계가 성립하는 것인데 이는 가장 중요한 원칙이니 늘 염두에 두기로 하자. 이 원칙은 사용자의 말하는 의도가 사용자가 선택한 단어에 있을 가능성이 높기 때문에 이를 중심으로 대화를 이끌어 나가려는 CS의 원칙이다.



    토픽에 키워드 등록하기

 

이제 3장에서 설명한 내용 중 아래의 2가지 대화를 추가해서 다시 한 번 빌드 해 보자. 컨셉 선언부는 중복이라 제외하였고 추가된 부분만 굵은 글씨로 표시하였다. 빌드 과정을 아직 낯설어 하는 입문자를 위해 전체 과정을 다시 정리해 보면,

가.   문서편집기로 kpoptop 화일을 열어 아래의 <표 Dorothy에 추가할 내용> 을 입력하고

나.   UTF-8 형식으로 저장한 후

다.   Chatscript의 명령어 모드에서 (콘솔 1번 창)

라.   :build Dorothy reset

마.   브라우저의 메시지 창에 :restart를 입력한 후 전송

바.   브라우저의 메시지 창에 :reset을 입력한 후 전송

사.   아래의 두 문장으로 테스트.

 

투애니원을 좋아해요?

티아라가 부르는 노래를 좋아해요?



앞서의 경우와 마찬가지로 예상과 다른 반응이 나올 것이다. 준비해 놓은 응답이 나오지 않고 내장되어 있는 얼버무림용 응답이 나올 것이다. 이번에도 가장 먼저 토픽 키워드와 연관성을 확인해 보자. 아래 명령어는 토픽 ~kpop에 대해 키워드만 확인해 보라는 명령어이다


:verify ~kpop keyword


결과는, 


결과 화면에서 보다시피 추가한 3개의 룰은 토픽의 키워드와 연관성이 없는 룰이라는 진단이다.(Missing keyword) 그렇다면 왜 토픽의 키워드와 연관성이 없는 것일까? 먼저 토픽에 등록한 키워드가 제대로 등록되었는지 확인해 보자.

 

:topicinfo ~kpop keys

 

~kpop 토픽의 키워드에 관한 정보를 보여 달라는 명령어 인데 결과는 아래 <>와 같다. 보다시피 키워드는 의도한 대로 잘 등록되어 있다.

문제는 입력문에서 "투애니원을", "티아라가", "노래를" 등과 같이 조사가 붙은 형태로 입력하였기 때문에 토픽에 등록되어 있는 키워와 다르다는 점이다. 한국어 키워드를 등록할 때 바로 이 부분을 놓치지 말아야 한다. "투애니원"과 "투애니원을"은 CS입장에서 볼 때 완전히 다른 단어이다.

 


해결책은 토픽 키워드란에 투애니원을, “티아라가”, “노래를을 등록해 주는 것인데, 이런 식으로 등록을 한다면 등록해야 할 키워드 수가 너무 많아진다. 많아질 뿐만 아니라 너무 복잡해져서 있어야 할 키워드가 누락되거나 불필요한 키워드가 있어도 발견하기 어렵게 된다. 그래서 53절에서 설명한 것처럼 tablemacro를 이용해서 좀 더 간편하게 등록을 하기로 하겠다.

문서 편집기를 열어 아래의 내용(kpopConcept.top의 내용 (1), (2), (3) 모두)을 차례대로 모두 입력해 넣고 kpopConcetp.top라는 이름으로 저장 한 후 Dorothy 폴더에 넣어 놓자. (파일 이름은 임의로 정한 것이며 작성자가 바꿔도 된다.) 내용은 크게 3부분으로 구성되어 있는데 첫번째 부분은 단어를 사전에 등록하는 컨셉 및 동일한 구성요소로 이루어진, 하나로 묶어 부를 수 있도록 집합화한 컨셉이다.

두번째 부분은 tablemacro로 명사에 조사를 붙이는 작업을 반복 수행하도록 코드를 작성한 것이다. 이해하지 못해도 상관없다.[3] 어떤 목적으로 어떻게 사용하는지만 알아도 충분하다. 세번째 부분이 이 tablemacro를 불러서 실제 사용하는 예이다. 이 세 부분을 차례대로 입력하고 kpopConcept.top라는 하나의 화일로 만들면 된다.





작성이 끝난 후에는 kpop.top 파일에 입력했던 4개의 중복되는 concept은 삭제하자. Kpop에 필요한 컨셉은 모두 이곳으로 모으고 kpop에는 스토리 전개에 필요한 룰만 작성하는 것으로 파일을 구별하는 것이 컨셉과 룰을 관리하는데 더 체계적일 것이기 때문이다.

파일을 UTF-8 형식으로 저장한 후, 콘솔 1에서 build 하고, 브라우저 창을 통해 서버를 다시 기동 시킨 후 아까 입력했던 아래의 대화문을 다시 입력해 보자. Build할 때 Tablemacro 부분에서 “illegal query name”이라는 경고 메시지가 나오는데 이는 무시해도 된다. 인수로 주어진 컨셉들이 Run-time시에 올바르게 전달될 예정인데 build시점에는 알 수 없기 때문에 경고를 주는 것이다.

빌드를 하고 restartreset을 한 후, 브라우저의 메시지 창에 다시 대화문을 입력해 보자.


투애니원을 좋아해요?

티아라가 부르는 노래를 좋아해요?

 

이제 Dorothy는 대본에 쓰여있는 대로 의도된 반응을 보여 줄 것이다. 이는 토픽의 키워드란에 "투애니원을", "티아라가", "노래를" 등이 등록되었기 때문에 가능한 것이고, 이는 이들 단어들이 tablemacro ^NounPlusPP에 의해 컨셉 ~투애니원, 컨셉 ~티아라, 컨셉 ~노래에 등록되었다는 뜻이 된다.

컨셉이 올바로 등록 되었는지를 확인하는 명령어는 말 그대로 concepts 이다. 아래의 명령어를 브라우저 메시지창에 입력해 보면, (결과는 Users폴더의 log-hercules.txt 파일에 저장되니 이 화일을 보는 것이 읽기에 더 좋다.)

 

:concepts 티아라가

  


위에서 보다시피 단어 티아라가는 세 곳에 등록이 되어 있는데 컨셉 ~티아라사전, 컨셉 ~티아라, 그리고 토픽 ~kpop이다.

이상의 예제를 통해 스크립트 작성의 가장 기본이 되는 두 가지 원칙을 확인하였다. 첫번째는 입력문과 룰과 토픽은 하나 이상의 키워드를 공유하여야 한다는 원칙이고 두번째는 한국어의 경우 조사가 붙은 형태로 키워드를 등록해야 한다는 한국어의 특성에 따른 원칙이다.

이제 이 두 가지 원칙을 지키면서 3장과 4장의 나머지 내용도 스크립트로 작성하며 테스트를 해 보면 된다. 스크립트로 파일을 작성할 때 사소하지만 꼭 알아야 할 내용을 정리해 보면,

    토픽의 이름과 파일의 이름을 일치시킬 필요 없다.

    한 파일에 다수의 토픽을 써도 된다. 한 파일에 몇 개의 토픽을 쓸 것인가는 전적으로 작성자에게 달려있다. 한 파일에는 컨셉 선언만 모으고 다른 파일에 토픽을 큰 테마별로 그룹지어 작성한다든지 자신만의 효율적인 틀을 찾으면 된다.

    확장자는 무엇이어도 관계없지만 식별을 위해 top 또는 cs 등의 확장자가 좋을 것이다. 확장자로 bak을 사용한다거나 확장자 이름에 ~(물결)을 붙이면 CSbuild에 포함시키지 않으니 알고 있도록 하자. (이런 확장자는 백업화일을 의미하기 때문에 보관용도로 보고 빌드에 포함시키지 않는 것이다.)

    컨셉, canon, replace 등의 명령어는 토픽이 시작하기 전인 파일의 앞부분에 쓰는 것이 좋다. 이 명령어들은 대화를 전개하기 위한 기초작업이기 때문에 미리 선언하는 것이 좋다. 또는 한 화일에 canon만 모으고 replace만 모으는 등 별도로 각각의 파일에 작성해도 된다.

 



[1] 이 과정은 독자가 6(1)절의 E: 개발환경 갖추기를 읽었다고 가정한 상태에서 정리한 것이다. 만약 무슨 말인지 모르겠다면 6(1)절을 읽어야 한다.

[2] 반복해서 말하지만 한글을 UTF-8 형식으로 입력할 수 없기 때문에 불편하더라도 :source 명령어를 사용하는 것이다한글이 포함되지 않은 경우에는 콘솔에 직접 입력하면 된다.

[3] 이 코드에 대한 설명은 부록 (5)절에 정리하였다.




'6장. 예제 챗봇 따라하기' 카테고리의 다른 글

4. K-POP 소재로 챗봇 개발하기  (3) 2016.06.02
3. 예제 챗봇 실행하기  (1) 2016.06.01
2. 개발 환경 구축하기  (4) 2016.05.31
1. CS 설치하기  (0) 2016.05.30
댓글
댓글쓰기 폼