[카카오챗봇] 가이드 문서 요약 정리 (1): 시나리오, 블록, 학습, 지식베이스

웹 개발/웹 프론트

2022. 06. 10.

시나리오와 블록

챗봇의 동작을 정의하려면 시나리오를 하나 이상 생성한다. 시나리오 속에는 다시 블록을 작성하여야 한다.

시나리오 설정 ⚙️

현재 시나리오 전역적으로 적용할 수 있는 공통 기능들을 설정하는 장소이다.

시나리오 공통 기능들

  1. 되묻기 기능

봇이 사용자의 쿼리를 이해하지 못 했을 때 출력할 질문을 되묻기 질문이라 한다. 되묻기 질문의 메시지, 최대 재시도 횟수, 되묻기 대기 시간을 설정할 수 있다.

  1. 봇 제네릭 메뉴

제네릭 메뉴는 카카오톡 챗봇 화면에서 하단 UI에 자리하는 퀵 메뉴들이다. 퀵 메뉴는 블록으로 연결하거나, 퀵 메뉴의 이름 그대로의 메시지를 전송하는 기능을 일으킬 수 있다.

블록 ⚙️

사용자 발화 패턴, 파라미터, 스킬, 플러그인을 조합하면서 챗봇에 비즈니스 요구사항을 구현할 수 있다.

기본 블록

챗봇 관리자 센터에서 기본 제공하는 기본 시나리오> 웰컴/폴백/탈출 블록

웰컴 블록을 설정하자

봇을 처음 사용하는 이용자가 받는 응답을 정의하는 블록이다.

  • 다양한 뷰를 써도 된다: 텍스트/이미지/카드/커머스/리스트형
  • 스킬을 호출해도 된다

🚧 웰컴 블록의 동작 조건

  1. 사용자가 카카오톡 채널에 연결 후, 챗봇에 처음 들어온 경우.
  2. 사용자가 챗봇과 친구가 아님에도, 채팅하기 기능을 이용해 챗봇에 들어온 경우.

🚧 재방문마다 웰컴 블록 동작시키기

재방문 이벤트 마다 어떤 일반 블록을 동작시키자. 해당 일반 블록은 다시 웰컴 블록을 호출시키면 된다.

TODO: 실습 절차를 작성하라.

폴백 블록

봇이 사용자의 발화를 이해할 수 없었을 때 출력할 메시지를 정의한다.

탈출 블록

봇이 되묻기 상태에 빠졌을 때, 사용자가 현 맥락을 포기하고 빠져나갈 수 있는 수단을 정의한다.

사용자가 탈출을 위해 던질만한 발화들을 등록해주자.

인증 블록

플러그인 이용을 보조하기 위한 블록. 파라미터를 설정하고 일반 블록과 연결하여 플러그인을 이용할 수 있다.

🚧 인증 블록의 동작 조건

채널 - 앱 연동: 비즈니스 인증을 한 상태에서, 비즈 채널과 앱을 연결하면 인증 블록이 나타난다.

엔티티 ⚙️

블록에 사용자 발화를 등록하면서 발화 내에 존재하는 자연어들을 태깅해 줄 수 있다. (태깅이 가져다 주는 학습 효과는 NLP 프로젝트를 여러번 해봐서 잘 알 것이다.)

봇 작업자가 엔티티들을 등록해 놓았다면, 발화를 등록할 때 추천 엔티티들이 팝업에 노출되는 걸 볼 수 있다.

엔티티 등록 방법 2가지

  1. 우측 상단 메뉴> 엔티티> 엔티티 생성 후 저장
  2. 엔티티 태깅 중> 새 엔티티 추가하기> 엔티티 생성 후 저장

엔티티를 이용하는 이유

사용자의 발화에서 의미 있는 단어를 미리 인식하기 위함이다. 그래야 자연어 모델이 발화 패턴을 잘 학습할 수 있다.

모범적인 엔티티 등록 관례

  1. 의미있는 데이터를 중심으로 엔티티를 구분지읍시다.
  2. 엔티티는 서로가 배타적이면 좋습니다. 서로소 집합(Disjoint Set)이 되도록 합시다.
  3. 엔티티 이름을 직관적으로 정의합시다.
엔터티 : 원소
- service_type : 테이크아웃, 포장, 매장
- user_action_order : 오더, 주문
- coffee_name : 아메리카노, 라떼, 카푸치노
- caffe_name : 스타벅스, 엔제리너스, 투썸

잘못된 엔티티 등록 사례

사용자가 내뱉을만한 모든 발화 형태를 고려하기 위해

발생 가능한 많은 단어들을 엔터티로 등록해 버리는 행위.

유의미하지 않은 단어들을 등록하는 행위: 서술어 등.

엔터티 : 원소
- 어떻게 : 원소
- 그건 : 그건
- 이것 : 이것
- 너무 : 너무

다시 말하지만, 엔터티는 집합이 되어야 하며, 다른 엔터티와는 서로소 관계인 것이 좋다.

발화 패턴 ⚙️

작업자가 등록한 발화는, 태깅을 거쳐서 패턴화된다.

라이언의 나이는 몇 살이니? ⇒ “인물"의 “나이”는 몇 살이니?

“인물" 뒤에 “나이"가 나오는 의문문 형태의 발화 를 하나의 패턴으로서 자연어 모델이 인지하게 되면, 비슷한 패턴의 발화를 모두 동일하게 처리할 수 있게된다.

머스크의 나이는 어떻게 되니? ⇒ “인물"의 “나이"는 어떻게 되니? ⇒ 구글 검색 호출: “머스크의 나이”

따라서 엔티티가 발화의 의도를 짐작하는 데 유용한 툴임을 이해합시다.

되묻기 질문 ⚙️

( ≠ 시나리오 설정의 되묻기 기능)

챗봇과 사용자는 양방향으로 인터랙션 하면서 맥락을 보충할 수 있다. 챗봇이 되려 사용자에게 거꾸로 질문을 던지는 것을 되묻기 질문이라고 한다.

채봇이 되묻기 질문을 던지는 이유는 하나다. 시나리오 진행에 필요한 어떤 필수 값(파라미터)이 아직 파악되지 않았기 때문이다.

파라미터

  • 파라미터는 엔티티이다. 따라서 파라미터를 요구하려면 엔티티 등록이 선행되어야 한다.
  • 파라미터는 봇이 현재 시나리오를 진행하기 위해 꼭 얻어야 하는 값이다.
  • 파라미터가 “필수"가 되면, 챗봇은 이 값을 채우기 위해 되묻기 질문을 던질 수 있다.

필수 파라미터 설정

블록 정의 예

발화패턴: "주문할게요"
파라미터:
  - CoffeeName:
    필수: 예
    엔티티: @coffee_name
    되묻기 질문: "어떤 커피를 원하세요?"
  - CupCount:
    필수: 예
    엔티티: @coffee_amount
    되묻기 질문: "몇 잔을 원하세요?"
응답: "주문 완료! {@coffee_name}을 {@coffee_amount}잔 주문했어요."

{언제} 출석체크를 하는 정보가 필요해서 되묻기 질문을 하는 챗봇

되묻기 질문 설정요소

  1. 되묻기 질문의 텍스트
  2. 바로 연결 응답: 사용자가 되묻기 상황에 빠졌을 때, “바로 연결" 가능한 버튼을 제공해 파라미터 값을 직접 세팅할 수 있도록 한다.
  3. 되묻기 허용 횟수: 되묻기 질문이 최대 얼마만큼 실행될지 설정한다. 최대 시도를 해도 파라미터 습득에 실패할 경우를 위해 안내 메시지를 정의할 수 있다.

컨텍스트 ⚙️

컨텍스트란, 현재 발화의 맥락을 다른 블록에게 공유해주는 개념이다. 컨텍스트를 잘 정의하면 챗봇 사용자에게 매끄러운 사용자 경험을 제공할 수 있다.

컨텍스트 등록

  • 시나리오> 블록> 컨텍스트 설정
  • 컨텍스트를 다른 블록으로 내보내는 입장이면: Output 컨텍스트를 생성
  • 어떤 컨텍스트를 다른 블록으로부터 수신하는 입장이면: Input 컨텍스트를 생성

Output 컨텍스트

Output 컨텍스트를 먼저 등록한다. Output 컨텍스트 설정엔 3가지 필수 값이 요구된다.

  1. 컨텍스트의 이름
  2. 컨텍스트의 수명 블록 수: {0, 1, 3, 5, 10}
  3. 10이면, 이 컨텍스트는 10개의 블록동안 유효하다.
  4. 컨텍스트의 유효시간: {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 서비스에 활용할 지식 베이스를 구축하는 곳이다. 질의자의 질문형태에 가장 적절할 것으로 판단되는 답변을 지식 베이스를 참조하여 가져온다.

답변 형태

  1. 즉문즉답: 가장 적절한 사용자 질의 의도에 맞는 답변을 전송한다.
  2. 답안추천: 사용자 질의 의도를 꼭 하나로 결론짓기는 너무 오만할 것이다. 그러므로 가능성 있는 질의 의도 몇 가지를 동시에 고려한다. 각 의도에 대응하는 답변들을 리스트로 보여준다.
  3. 스킬응답: 사용자 발화의도가 지식 베이스에 등록된 질문 의도와 일치할 경우, 스킬 페이로드에 지식 베이스 관련 정보가 함께 전달된다.

스킬 페이로드 맛보기

발화 패턴이 지식 베이스 질문에 매칭되면, 스킬 페이로드 속 intent 객체에 지식 관련 정보를 포함하게 된다.

skillPayload:
  # 패턴 발화가 매칭된 블록 정보에 대한 객체
  intent:
    id: number # 블록 아이디
    name: string # 블록 이름
    extra:
      # 발화가 지식 베이스 내 질문 의도랑도 매치되면, 지식 베이스 정보도 담긴다.
      knowledge(s):
        matchedKnowledges: # list<knowledge>
          - answer: string
            question: string
            categories: list<string>
            landingUrl: string
            imageUrl: string
...

지식 베이스 주먹구구식 활용

타임 투 마켓이 시급하다면, 시나리오에 블록을 설정하지 않고서 지식 베이스만 구축하는 방식으로 ‘간단 질의응답형 챗봇'을 만들 수 있다.