티스토리 뷰

사용자의 질문에 대한 답을 스크립트 내에서 예상답변으로 준비할 수도 있지만 지식베이스에 지식으로 구축해 놓고 필요할 때 검색해서 답할 수도 있다. 어떤 방법을 선택할 것인가는 작성자의 판단이지만 보통 음악, 영화, , 스포츠, 가수, 배우, 작가, 운동선수 등 그 수가 방대할 때는 스크립트 내에 준비하기 보다 지식베이스로 구축하는 것이 반복 작업도 줄이고 코드를 읽기에도 더 효율적이다.

이제 지식베이스를 이용하는 대표적인 상황을 알아 보기로 하자. 먼저 사용자가 챗봇에게  개인 신상을 묻는 경우이다.

 

A.     #! 너 학교에 다니니?

?: ( << ~_*1 다니니? >> ) if(^query(direct_svo 나 다니다 _0)) {.} else {아니오.}

 

사람은 누군가를 알게 되면 점점 더 개인 신상에 대해 궁금해지게 마련이다. 챗봇에게도 신상에 대해 여러 가지 질문을 할 수 있는데, 이때 지식베이스에서 확인해서 답할 수 있다. “무엇을 좋아하다”, “어딘가 다닌다”, “무슨 운동을 해 보았다”, “무슨 영화를 보았다등과 같이 취향이나 경험을 묻는 질문에 대비하여 미리 지식베이스에 지식을 구축해 놓았다고 가정하고, 위의 예문을 보면, 먼저 라는 말로 시작을 하는 경우 신상에 관한 질문이라 가정을 하고 사용자의 발언을 받아 지식베이스에서 확인하고 있다. “학교에 다니니?”, “유치원에 다니니?”, “회사에 다니니?”, “수영장에 다니니?” 등 다양한 질문이 가능한데 사용자 질문과 정확히 일치하는 사실이 있을 경우에만 라고 답하고 그 외의 경우에는 모두 아니오라고 답하고 있다. “아니오라는 답변이 { }로 싸여 있는 점에 주목하자. 조건이 참일 수도 있고 거짓일 수도 있기 때문에 해당될 때만 출력되도록 { }로 묶었다. 질의문도 사용자 질문과 정확히 일치하는 사실을 찾도록 direct_svo로 지정하였다.

개인의 신상에 관한 내용, 예를 들면 신체적인 특징부터 가족, 친구, 기호, 취미, 경험 등을 적어보면 무척 많은 항목이 나온다. 좀 더 쉽게 시작할 수 있도록 7(1)절에 주요 항목들을 정리하였으니 이를 토대로 챗봇의 신상을 지식베이스로 만들도록 하자.

진도를 나가기 전에 복습을 겸해 한 가지 정리를 해 보려 한다. 예를 들어 좋아하는 가수가 누구에요?”라는 질문과 같이 답변의 폭이 넓은 경우를 생각해 보자. 좋아하는 배우, 좋아하는 음악, 좋아하는 요리, 좋아하는 운동선수 등 이런 부류의 질문은 무척 많다. 이런 질문에 대해서는 예상응답(rejoinder), 응답전용 토픽(reactor topic), 지식베이스(facts)의 세 가지 형식으로 준비할 수 있는데 먼저 예상응답(rejoinder)으로 작성해 보면

 

B.     t: 좋아하는 가수가 누구요?

a: (투애니원)

a: (티아라)

a: (마마무)

……

 

이 방식의 단점은 너무 길어져서 (대한가수협회에 등록된 가수만 3천 여명이고 이중 유명 가수만 선별한다고 하고 외국 유명가수까지 합하면 최소 수 백 줄이 될 것임) 스크립트를 읽어 나가는데 방해가 된다는 점이다. 두 번째 방법은 23절에서 소개한 응답전용 토픽(reactor topic)을 만든 후 아래와 같이 호출하는 것이다.

 

C.     t: 좋아하는 가수가 누구에요?

u: ( ~가수) ^respond(~FaveSinger)

 

위에서 ~FaveSinger라는 토픽은 말걸기나 조건식, 변수 등 없이 오직 수 많은 가수들의 이름과 그 각각에 대한 챗봇의 응답 만을 정리해 놓은 토픽이다. 그래서 응답전용 토픽이라 이름 부르는데 위와 같이 ^respond함수로 호출하여 사용할 수 있다.[1] 위의 장점은 본문 스크립트가 무척 간결해져서 대화의 흐름을 확인하는데 방해가 되지 않는다는 점이다. 세번째 방법은 앞 절에서 설명한 지식베이스로 만들어 답변하는 방식이다. 3가지 방식 중에 어떤 것을 선택할 것인가는 작성자의 개인적인 선호에 달려있다. 다만, RawData/WorldData 폴더를 보면 영화, , 색상, 음악, 동물 등 다종다양한 내용들이 createfacts로 만들어져 있는 것에서 알 수 있듯이 사실의 저장과 확인에는 지식베이스가 가장 효율적이라 점을 고려하는 것이 좋겠다.

 

이제 지식베이스를 이용하는 두번째 상황에 대해 알아보자. 두번째 상황은 지식을 묻는 경우이다. 역사나 지리 뿐만 아니라 동물, 식물, 우주, 자동차, 교향곡 등 매우 광범위한 분야가 해당된다.[2] 여기서는 여행지에 관한 예를 살펴 보기로 하자.

 

D.     Topic: ~여행지 [ ~도시 ~팔도 ~교통 ~숙박]

#! 담양이 전라북도에 있어요?

?: (<< _~도시 ~팔도>> ^query(direct_sv _0 part ?)) _0 @0object에 속합니다.

 

위의 룰이 시행되기 위해서는 다음과 같은 내용이 미리 준비되어 있어야 한다.

 

    concept : ~도시사전 NOUN [ 담양 담양이 담양에 담양은 칠곡 칠곡이 ]

    concept : ~팔도사전 NOUN [ 전라북도 전라북도에 전북 전북에 ]

    canon : 담양이 담양 담양에 담양 담양에서 담양

    canon : 전라북도에 전라북도 전북에 전북

    concept : ~도시 [ 담양 칠곡 구례 하동 산청 ]

    concept : ~팔도 [ 경기도 충청남도 충남 전라북도 전북 전라남도 전남 ]

    ^createfact ( 담양 part 전라남도 )

 

먼저 대화에 사용할 단어를 모두 사전에 등록한다. (1번과 2) ~도시사전, ~팔도사전이라는 이름은 임의로 정한 것이다. 이때 조사가 붙은 형태까지 모두 등록하여야 하며 사용할 법한 조사는 모두 붙여서 등록한다. 두번째로 입력형과 기본형을 등록한다.(3번과 4) canon 명령어 뒤에 위와 같이 입력형과 기본형을 순차적으로 나열하면 앞에서부터 차례로 두 개씩 쌍으로 읽어 들여 기본형으로 등록하게 된다. 세번째는 기본형을 이용해서 컨셉을 만드는 단계이다. (5번과 6) 여기에서도 ~도시라는 이름과 ~팔도라는 이름은 임의로 작성한 것이다. 조사가 붙은 형태를 기본형으로 등록해 놓았기 때문에 이곳에서는 기본형과 열거해도 된다. 이렇게 만든 컨셉을 토픽의 키워드에 등록하고 사용자 입력문을 매칭시키는 패턴으로 사용하였다. (D 참조) 마지막으로 기본형을 이용해서 지식을 만든다. (7) 위의 예시에서 각 컨셉의 구성요소들 중 일부는 생략하였다. 이곳에서는 형식을 보여주는데 초점을 맞췄다.

D를 읽어 보면, 우선 사용자가 컨셉 ~도시와 컨셉 ~팔도에 포함된 단어를 이야기하면 매칭이 된다. 그러면 사용자가 입력한 ~도시에 해당하는 단어가 어디 소속인지 지식베이스에 질문을 던지는데, 해당되는 지식은 7번의 형식으로 만들어져 있으므로 목적어를 찾으면 된다. 주어 자리에는 사용자가 입력한 도시명(_0)을 놓고 동사자리에는 part를 놓고 목적어 자리에는 ?(물음표)를 놓는다. 주어와 동사를 지정하였으므로 쿼리문의 유형은 direct_sv이다. 결과값을 어디에 저장할 것인지 별도로 지정하지 않았으므로 결과값은 자동으로 @0에 보관된다. 출력문에는 @0object를 포함시켜 출력하고 있다.

지식에 관한 질문은 위에서 예를 든 여행지 외에도 영화 배우가 출연한 영화 목록, 주요 감독들의 작품, 한국 현대 소설가의 소설 작품, 가수의 히트곡, 운동선수의 기록 등 헤아릴 수 없을 만큼 많다. 이 중에서 관심있고 자신있는 분야를 정하여 그 분야에 전문화된 챗봇을 만드는 것이 좋은 서비스가 될 것이다.

 



[1] 이 함수의 좀 더 자세한 사용법은 93절에서 설명하기로 한다.

[2] 이 모든 분야의 지식을 개인 혼자의 능력으로 구축할 수는 없고 자신이 관심있는 분야를 정해서 특정 영역의 지식을 구축하면 될 것이다.


댓글
댓글쓰기 폼