시나리오와 블록
챗봇의 동작을 정의하려면 시나리오를 하나 이상 생성한다. 시나리오 속에는 다시 블록을 작성하여야 한다.
시나리오 설정 ⚙️
현재 시나리오 전역적으로 적용할 수 있는 공통 기능들을 설정하는 장소이다.
시나리오 공통 기능들
- 되묻기 기능
봇이 사용자의 쿼리를 이해하지 못 했을 때 출력할 질문을 되묻기 질문이라 한다. 되묻기 질문의 메시지, 최대 재시도 횟수, 되묻기 대기 시간을 설정할 수 있다.
- 봇 제네릭 메뉴
제네릭 메뉴는 카카오톡 챗봇 화면에서 하단 UI에 자리하는 퀵 메뉴들이다. 퀵 메뉴는 블록으로 연결하거나, 퀵 메뉴의 이름 그대로의 메시지를 전송하는 기능을 일으킬 수 있다.
블록 ⚙️
사용자 발화 패턴, 파라미터, 스킬, 플러그인을 조합하면서 챗봇에 비즈니스 요구사항을 구현할 수 있다.
기본 블록
챗봇 관리자 센터에서 기본 제공하는 기본 시나리오> 웰컴/폴백/탈출 블록
웰컴 블록을 설정하자
봇을 처음 사용하는 이용자가 받는 응답을 정의하는 블록이다.
- 다양한 뷰를 써도 된다: 텍스트/이미지/카드/커머스/리스트형
- 스킬을 호출해도 된다
🚧 웰컴 블록의 동작 조건
- 사용자가 카카오톡 채널에 연결 후, 챗봇에 처음 들어온 경우.
- 사용자가 챗봇과 친구가 아님에도, 채팅하기 기능을 이용해 챗봇에 들어온 경우.
🚧 재방문마다 웰컴 블록 동작시키기
재방문 이벤트 마다 어떤 일반 블록을 동작시키자. 해당 일반 블록은 다시 웰컴 블록을 호출시키면 된다.
TODO: 실습 절차를 작성하라.
폴백 블록
봇이 사용자의 발화를 이해할 수 없었을 때 출력할 메시지를 정의한다.
탈출 블록
봇이 되묻기 상태에 빠졌을 때, 사용자가 현 맥락을 포기하고 빠져나갈 수 있는 수단을 정의한다.
사용자가 탈출을 위해 던질만한 발화들을 등록해주자.
인증 블록
플러그인 이용을 보조하기 위한 블록. 파라미터를 설정하고 일반 블록과 연결하여 플러그인을 이용할 수 있다.
🚧 인증 블록의 동작 조건
채널 - 앱 연동: 비즈니스 인증을 한 상태에서, 비즈 채널과 앱을 연결하면 인증 블록이 나타난다.
엔티티 ⚙️
블록에 사용자 발화를 등록하면서 발화 내에 존재하는 자연어들을 태깅해 줄 수 있다. (태깅이 가져다 주는 학습 효과는 NLP 프로젝트를 여러번 해봐서 잘 알 것이다.)
봇 작업자가 엔티티들을 등록해 놓았다면, 발화를 등록할 때 추천 엔티티들이 팝업에 노출되는 걸 볼 수 있다.
엔티티 등록 방법 2가지
- 우측 상단 메뉴> 엔티티> 엔티티 생성 후 저장
- 엔티티 태깅 중> 새 엔티티 추가하기> 엔티티 생성 후 저장
엔티티를 이용하는 이유
사용자의 발화에서 의미 있는 단어를 미리 인식하기 위함이다. 그래야 자연어 모델이 발화 패턴을 잘 학습할 수 있다.
모범적인 엔티티 등록 관례
- 의미있는 데이터를 중심으로 엔티티를 구분지읍시다.
- 엔티티는 서로가 배타적이면 좋습니다. 서로소 집합(Disjoint Set)이 되도록 합시다.
- 엔티티 이름을 직관적으로 정의합시다.
엔터티 : 원소
- service_type : 테이크아웃, 포장, 매장
- user_action_order : 오더, 주문
- coffee_name : 아메리카노, 라떼, 카푸치노
- caffe_name : 스타벅스, 엔제리너스, 투썸
잘못된 엔티티 등록 사례
사용자가 내뱉을만한 모든 발화 형태를 고려하기 위해
발생 가능한 많은 단어들을 엔터티로 등록해 버리는 행위.
유의미하지 않은 단어들을 등록하는 행위: 서술어 등.
엔터티 : 원소
- 어떻게 : 원소
- 그건 : 그건
- 이것 : 이것
- 너무 : 너무
다시 말하지만, 엔터티는 집합이 되어야 하며, 다른 엔터티와는 서로소 관계인 것이 좋다.
발화 패턴 ⚙️
작업자가 등록한 발화는, 태깅을 거쳐서 패턴화된다.
라이언의 나이는 몇 살이니? ⇒ “인물"의 “나이”는 몇 살이니?
“인물" 뒤에 “나이"가 나오는 의문문 형태의 발화 를 하나의 패턴으로서 자연어 모델이 인지하게 되면, 비슷한 패턴의 발화를 모두 동일하게 처리할 수 있게된다.
머스크의 나이는 어떻게 되니? ⇒ “인물"의 “나이"는 어떻게 되니? ⇒ 구글 검색 호출: “머스크의 나이”
따라서 엔티티가 발화의 의도를 짐작하는 데 유용한 툴임을 이해합시다.
되묻기 질문 ⚙️
( ≠ 시나리오 설정의 되묻기 기능)
챗봇과 사용자는 양방향으로 인터랙션 하면서 맥락을 보충할 수 있다. 챗봇이 되려 사용자에게 거꾸로 질문을 던지는 것을 되묻기 질문이라고 한다.
채봇이 되묻기 질문을 던지는 이유는 하나다. 시나리오 진행에 필요한 어떤 필수 값(파라미터)이 아직 파악되지 않았기 때문이다.
파라미터
- 파라미터는 엔티티이다. 따라서 파라미터를 요구하려면 엔티티 등록이 선행되어야 한다.
- 파라미터는 봇이 현재 시나리오를 진행하기 위해 꼭 얻어야 하는 값이다.
- 파라미터가 “필수"가 되면, 챗봇은 이 값을 채우기 위해 되묻기 질문을 던질 수 있다.
필수 파라미터 설정
블록 정의 예
발화패턴: "주문할게요"
파라미터:
- CoffeeName:
필수: 예
엔티티: @coffee_name
되묻기 질문: "어떤 커피를 원하세요?"
- CupCount:
필수: 예
엔티티: @coffee_amount
되묻기 질문: "몇 잔을 원하세요?"
응답: "주문 완료! {@coffee_name}을 {@coffee_amount}잔 주문했어요."
되묻기 질문 설정요소
- 되묻기 질문의 텍스트
- 바로 연결 응답: 사용자가 되묻기 상황에 빠졌을 때, “바로 연결" 가능한 버튼을 제공해 파라미터 값을 직접 세팅할 수 있도록 한다.
- 되묻기 허용 횟수: 되묻기 질문이 최대 얼마만큼 실행될지 설정한다. 최대 시도를 해도 파라미터 습득에 실패할 경우를 위해 안내 메시지를 정의할 수 있다.
컨텍스트 ⚙️
컨텍스트란, 현재 발화의 맥락을 다른 블록에게 공유해주는 개념이다. 컨텍스트를 잘 정의하면 챗봇 사용자에게 매끄러운 사용자 경험을 제공할 수 있다.
컨텍스트 등록
- 시나리오> 블록> 컨텍스트 설정
- 컨텍스트를 다른 블록으로 내보내는 입장이면: Output 컨텍스트를 생성
- 어떤 컨텍스트를 다른 블록으로부터 수신하는 입장이면: Input 컨텍스트를 생성
Output 컨텍스트
Output 컨텍스트를 먼저 등록한다. Output 컨텍스트 설정엔 3가지 필수 값이 요구된다.
- 컨텍스트의 이름
- 컨텍스트의 수명 블록 수: {0, 1, 3, 5, 10}
- 10이면, 이 컨텍스트는 10개의 블록동안 유효하다.
- 컨텍스트의 유효시간: {1, 3, 5, 10, 15, 30, 60}분
Input 컨텍스트 활용법
- 현재 블록으로 전달된 컨텍스트는 일종의 객체이다. 이전 블록에서 채워넣은 파라미터 값들이 컨텍스트 객체에 담겨 블록으로 주입된다고 생각하면 된다.
- 컨텍스트는 특정 블록의 동작 여부를 결정하는 일종의 불리언이다. Input 컨텍스트가 정의된 블록은 컨텍스트가 유효할 때에만 호출 가능하기 때문이다. (Input 컨텍스트가 없다면 폴백 블록이 응답한다)
스킬로 Output 컨텍스트 수정하기
유저 발화에서 엔터티를 발견하여 파라미터 값들을 설정할 수 있고, 이 값들을 컨텍스트로서 다른 블록에게 전달할 수 있다는 것을 배웠다.
스킬의 응답은 이미 완성되어 있는 Output Context를 수정할 수 있다.
context: # ContextControl 객체
values:
- name: 수정하려는 Output 컨텍스트의 이름을 지정한다.
lifeSpan: Output 컨텍스트의 수명 정보를 수정한다.
params: 블록의 파라미터의 값들을 이렇게 수정한다.
- name:
lifeSpan:
params:
스킬의 응답은 컨텍스트를 수정할 수 있지만, 창조할 수 없다.
폴백 학습 🤖
챗봇 관리자센터> 학습> 학습 대기 목록
학습 대기 목록
특정 기간동안 “폴백”으로 처리된 발화들의 모음이며, 빈도 순으로 정렬되어 있다.
챗봇 작업자는 폴백 메시지들을 태깅하여 패턴화함으로써 서비스를 개선해 나갈 수 있다.
지식 베이스 💽
챗봇 관리자센터> 지식 베이스
개요
QnA 서비스에 활용할 지식 베이스를 구축하는 곳이다. 질의자의 질문형태에 가장 적절할 것으로 판단되는 답변을 지식 베이스를 참조하여 가져온다.
답변 형태
- 즉문즉답: 가장 적절한 사용자 질의 의도에 맞는 답변을 전송한다.
- 답안추천: 사용자 질의 의도를 꼭 하나로 결론짓기는 너무 오만할 것이다. 그러므로 가능성 있는 질의 의도 몇 가지를 동시에 고려한다. 각 의도에 대응하는 답변들을 리스트로 보여준다.
- 스킬응답: 사용자 발화의도가 지식 베이스에 등록된 질문 의도와 일치할 경우, 스킬 페이로드에 지식 베이스 관련 정보가 함께 전달된다.
스킬 페이로드 맛보기
발화 패턴이 지식 베이스 질문에 매칭되면, 스킬 페이로드 속 intent 객체에 지식 관련 정보를 포함하게 된다.
skillPayload:
# 패턴 발화가 매칭된 블록 정보에 대한 객체
intent:
id: number # 블록 아이디
name: string # 블록 이름
extra:
# 발화가 지식 베이스 내 질문 의도랑도 매치되면, 지식 베이스 정보도 담긴다.
knowledge(s):
matchedKnowledges: # list<knowledge>
- answer: string
question: string
categories: list<string>
landingUrl: string
imageUrl: string
...
지식 베이스 주먹구구식 활용
타임 투 마켓이 시급하다면, 시나리오에 블록을 설정하지 않고서 지식 베이스만 구축하는 방식으로 ‘간단 질의응답형 챗봇'을 만들 수 있다.