Kakao api 시작하기 전에
이 내용은 모두 KakaoDevelopers 개발가이드에 있는 내용임을 알립니다!
시작하기
카카오 채널관리자 만들기
카카오톡채널 관리자센터 여기
카카오 developer관련 질문 여기
카카오 api 소개 및 다루는 법 소개 여기
위 사이트안에서 카카오채널에 관한 소개 여기
카카오채널에서 플러스 친구과 연결된 다양한 오픈 빌더 플랫폼 여기
OBT신청하기 여기
주의사항
챗봇의 사용목적을 정확히 서술하지 않고 챗봇 OBT를 신청할 경우 잘못하면 6일이라는 시간을 날릴 수도 있으니 신청할때 아래 중요시 생각되는 것들과 예시를 통해 꼼꼼히 작성하길 바란다
(나도그냥했다가바로짤림)
1 | “챗봇의 사용 목적이 불분명하여 OBT 승인 신청이 반려되었습니다. |
챗봇 만들기 (튜토리얼)
시나리오와 블록 만들기
시나리오 설정하기
봇 생성후 가장 먼저 해야할 일은 시나리오를 구성하는 것입니다. 블록을 구분하여 담아낼 수 있도록 계획을 세우고, 시나리오에 공통적으로 적용될 기능을 설정합니다. 시나리오 설정 메뉴는 다음 화면처럼 시나리오 메인 메뉴 아래 톱니바퀴 모양의 설정 아이콘으로 표시되어있습니다.
시나리오 설정 메뉴 위치
시나리오 설정 메뉴안에서 봇 작업자는 봇에서 만든 모든 시나리오에 공통적으로 적용할 수 있는 시나리오 속성, 즉 1) 봇의 되묻기 기능에 대한 기본 설정과 2) 카카오톡 챗봇 사용자를 위한 봇 제네릭 메뉴를 설정할 수 있습니다.
되묻기 기능 공통 설정
시나리오 설정 메뉴안에 있는 되묻기 기능 설정 화면
위와 같이 하나의 봇 안에서 쓰이는 모든 시나리오에 공통적으로 적용될 되묻기 기능에 대하여,
- 되묻기 최대 횟수
- 되묻기 최대 시간
를 간단하게 선택하고, 각각의 경우에 대하여 유효 조건을 초과할 때 출력될 안내 메시지를 임의로 작성할 수 있습니다. (필수로 작성되어야하는 영역입니다.)
봇 제네릭 메뉴 설정
봇 제네릭 메뉴를 세팅하기 위해서는 먼저 봇 제네릭 메뉴의 스위치를 On하여 활성화 시킵니다.
예시 이미지에서 보여지는 하단 퀵-메뉴가 바로 봇 제네릭 메뉴입니다.
제네릭 메뉴를 추가하고 싶으면 ‘버튼 추가’를 누르면 되며, 버튼 설정은 ‘버튼 설정’을 통해 할 수 있습니다.
봇 제네릭 메뉴 내 버튼에 대한 사용자 설정 화면
버튼 설정에서는 버튼명과 버튼 기능을 직접 지정할 수 있습니다.
“퀵서비스 메뉴#1” 로 버튼명을 지정했습니다.
“퀵서비스 메뉴#2” 로 버튼명을 지정했습니다.
이때,
- 버튼명은 14자로 제한됩니다.
- 버튼 기능은 블록 연결 및 메세지 전송 두 가지만 제공됩니다.
블록 연결은 해당 버튼 클릭 시 원하는 블록으로 연결하는 것이며, 메시지 전송은 버튼을 클릭할 때 봇에게 해당 버튼명을 그대로 전송하는 것을 의미합니다.
봇 제네릭 메뉴안의 필요한 내용을 모두 작성하고, 확인 버튼을 누르면 작업 내용들이 저장됩니다.
봇 제네릭 메뉴가 설정 완료된 모습입니다
위의 예시에서 작성된 제네릭 메뉴가 카카오톡 채널 챗봇 화면에서 보여지는 모습은 아래와 같습니다.
카카오톡 챗봇 하단에 사용자가 직접 클릭할 수 있는 버튼 두 개가 제네릭 메뉴 안에 구현되어있는 모습입니다.
제네릭 메뉴안의 각 버튼은 기존에 작성된 블록으로 연결될 수 있고, 사용자가 버튼을 누르면 제네릭 메뉴 안의 버튼명이 그대로 출력되고 해당 블록의 출력으로 설정된 말풍선이 나타납니다.
시나리오 생성하기
이제 시나리오를 생성해보겠습니다. 시나리오는 봇 생성 후 메인화면에서 플러스(+) 버튼을 클릭할 때 마다 시나리오1, 시나리오2… 순으로 생성됩니다.
시나리오 추가 기능 위치
시나리오의 이름 또한 손쉽게 수정할 수 있으며, 필요하면 삭제도 가능합니다.
시나리오명칭 우측에 있는 펜모양의 아이콘을 클릭하면 이름 수정이 가능합니다
시나리오 명칭 변경 모습
시나리오 명칭 우측에 있는 휴지통의 아이콘을 클릭하면 해당 시나리오가 삭제 됩니다.
봇 작업자는 하나의 시나리오 안에는 사용자 의도를 나타내는 ‘블록’들을 [+ 블록추가] 버튼을 눌러 여러개 작성할 수 있습니다.
시나리오 안에서 블록 만들기
시나리오를 선택하면 기본적으로 우측 화면에 블록의 내용을 바로 채울 수 있는 화면을 볼 수 있습니다. 봇 작업자는 해당 화면의 위에서부터, 사용자 발화 패턴 설정 → 봇 응답형식 설정 순으로 필요 내용을 작성할 수 있습니다.
이때 파라미터 설정 부분은 메뉴가 접혀있습니다. 봇 작업자가 필요에 따라 오픈빌더의 스킬이나 플러그인 기능을 이용해야 한다면, 해당 파라미터 설정 부분을 클릭하여 메뉴를 펼치고 필요한 내용을 채우면 됩니다.
나의 엔티티 작성
엔티티 작성의 좋은 예
엔티티를 잘 작성한다는 것은 사용자의 발화문에서 의미있는 단어를 추출해내는 기초 작업을 튼튼히 하는 것을 뜻합니다. 그래야 발화 패턴을 인식하는 자연어처리 로직을 십분 활용할 수 있고, 다양한 발화 형태 속에 존재하는 중요한 단어를 보다 정확히 발췌할 수 있습니다. 올바르게 작성된 엔티티 예시는 아래와 같습니다.
바람직한 엔티티 작성 예시
Tip.
- 의미있는 데이터 중심으로 엔티티를 구분 합니다. 예) cafe_name(카페명), coffee_name(커피메뉴), user_action_order(사용자행동패턴), service_type(주문서비스방식))
- 엔티티 간 단어들이 중복되지 않고, 의미가 겹치지 않도록 합니다.
- 엔티티 목록만 보아도 누구나 의미를 쉽게 유추할 수 있도록, 엔티티명을 명확하게 정의합니다.
발화 패턴 만들기
봇 작업자가 사용자 발화 패턴 설정란에 사용자 예상 발화를 입력하고 난 후, 직접 태깅을 통해서 필요한대로 발화 패턴을 정의할 수 있습니다. 오픈빌더에서는 태깅이 필요할 것으로 예상하는 엔티티 단어에 대해서 밑줄(Underline)을 자체적으로 표시해주는데, 이를 확인하고 봇 작업자는 밑줄이 가르치는 단어를 드래그하여 필요한 엔티티를 직접 부여하실 수 있습니다.
다음과 같은 작업 순서 예시를 확인하십시오.
Step 1. 발화 중 밑줄이 표시된 ‘라이언’에 인물 엔티티를 태깅합니다. (엔티티명: @sys.person.name
)
밑줄이 나타난 단어를 드래그하면, 엔티티를 고를수 있는 팝업이 나타납니다. 필요에 따라 봇 작업자는 추천 엔티티 또는 전체 엔티티 목록에서 희망하는 엔티티를 부여할 수 있습니다.
Step 2. 밑줄이 없더라도 ‘나이’처럼 특정 단어에 엔티티 태깅을 할 수 있습니다. (엔티티명 : @age
)
나이라는 단어에 직접 드래그 하여 별도의 엔티티를 강제 부여하는 모습입니다.
입력된 발화에 대해서 최종적으로 엔티티 태깅이 완료하고 나면 패턴 발화가 생성됩니다.
Step 3. 의도 확인에 중요한 정보는 {sys.person.name}
, {age}
엔티티에 있음을 확인합니다.
패턴이 잡혀진 발화의 예시 모습입니다.
결론적으로 본 테스트 블록의 사용자 의도는 나이 묻기이며, 이러한 의도를 확인하기 위한 패턴은 아래와 같다는 것을 알 수 있습니다.
패턴 발화 : {인물이름} {나이} <어떻게> <되다>
위 같은 방식으로, 본 블록이 나타내고자 하는 의도에 알맞는 발화패턴을 입력하고 태깅하는 작업하는 과정을 이어서 하면 됩니다. 하나의 블록 안에서 패턴을 충분히 포함 할 수록, 실제 사용자 발화에 블록이 대응할 수 있는 확률이 높아집니다.
되묻기 질문 등록하기
필수 파라미터 설정하기
커피 이름(CoffeeName) 과 수량(CupCount)을 필수 파라미터로 설정하였습니다. 이때 필수 파라미터 박스안에서 되묻기 질문 버튼이 활성화 된 것을 확인할 수 있습니다.
되묻기 질문이 필수 파라미터 설정을 통해 활성화 된 모습입니다. 되묻기가 정상적으로 끝나 필요 파라미터 값이 모두 수신되면 설정한 응답형식이 출력되는 형태입니다.
되묻기 질문 설정하기
되묻기 질문 버튼을 클릭하면 각 필수 파라미터에 값이 채워지도록, 사용자를 유도하는 되묻기 질문을 설정할 수 있습니다. 각 필수 파라미터에 대한 되묻기 질문 작성 예시는 다음 화면과 같습니다.
CoffeeName 파라미터를 얻기 위한 되묻기 설정 화면: 사용자가 주문할 커피 이름을 묻는 질문으로 구성되었습니다
CupCount 파라미터를 얻기 위한 되묻기 설정 화면 : 사용자가 주문하고자 하는 수량을 묻는 질문으로 구성되었습니다
되묻기 질문 팝업의 상세 메뉴 구성은 다음과 같습니다.
- 되묻기 질문 응답 : 되묻기 질문을 정의합니다. 총 3개까지 정의할 수 있고, 사용자에게 출력되는 허용횟수 안에서 무작위 순으로 출력됩니다.
- 바로 연결 응답 : 사용자가 되묻기 상황에서 입력할 파라미터 값을 직접 ‘바로 연결’ 버튼으로 클릭해 보낼 수 있도록 세팅합니다.
- 되묻기 허용 횟수 설정 : 되묻기 질문이 실행될 횟수를 선택합니다. 최대 허용 횟수가 끝나서 결국 원하는 파라미터값을 획득하지 못했을 때 봇이 사용자에게 출력할 안내 메시지를 정의합니다.
설정된 되묻기 질문 확인하기
모든 설정을 마친 후, 카카오톡 화면에서 최종 응답을 아래 화면과 같이 확인할 수 있습니다. 봇은 되묻기 질문을 통해 필수 파라미터 값인 커피이름 아메(아메리카노의 약자)와 커피수량 2를 수신받고 최종 응답을 출력하였습니다.
커피 주문 – 되묻기가 모두 실행된 카카오톡 사용자 화면
컨텍스트 사용하기
오픈빌더의 고급 기능 중에 하나인 컨텍스트를 손쉽게 쓸 수 있도록, 다음과 같이 세 가지 활용 방법을 안내합니다.
컨텍스트 조건 설정하기
먼저, 시나리오 > 블록 > 컨텍스트 설정에서 컨텍스트 명칭을 등록합니다. (설정 개수에는 제한이 없습니다)
컨텍스트 설정 선택 팝업 위치
다른 블록으로 컨텍스트를 내보낸다면, Output 컨텍스트에 명칭을 등록합니다.
Output 컨텍스트에 Ordering
이라는 컨텍스트 명칭을 등록중인 화면
다른 블록에서 내보낸 컨텍스트를 받는다면, Input 컨텍스트에 명칭을 등록합니다.
Input 컨텍스트에 Ordering
이라는 컨텍스트 명칭을 등록중인 화면
특히, Output 컨텍스트 부분은 봇 작업자들이 컨텍스트를 생성하여 연결할 때 가장 먼저 설정 작업을 하고, 주요 정보를 등록하는 중요한 공간입니다.
Output 컨텍스트를 등록할 때는 필수로 다음 세 가지를 입력해야 합니다.
컨텍스트 구성 값 | 의미 | 값 | 비고 |
---|---|---|---|
컨텍스트 명칭 | 컨텍스트 내용을 설명하는 이름 | ||
컨텍스트 수명 | 컨텍스트가 지속되는 블록 횟수 | 0/1/3/5/10 (회) | 끝나면 컨텍스트가 만료됩니다. 0은 즉시 만료됩니다.(초기화) |
유효시간 | 컨텍스트가 지속되는 시간 | 1/3/5/10/15/30/60 (분) | 끝나면 컨텍스트가 만료됩니다. |
Output 컨텍스트의 수명 정보 설정 모습
Output 컨텍스트의 유효 시간 정보 설정 모습
컨텍스트 정보를 스킬 요청(request)에서 활용하기
컨텍스트에 담겨진 정보는 스킬 요청시에도 사용할 수 있습니다. 아래 화면과 같이 블록 안의 파라미터 만들기 메뉴 안에서 ‘값’ 입력란에, 원하는 컨텍스트와 파라미터 명을 다음 형식을 따라 참조할 수 있습니다.
파라미터 설정 안에서 파라미터 만들기 메뉴 안의 ‘값’ 설정 부분
형식
1 | #[컨텍스트명].[파라미터명] |
반드시 참조한 컨텍스트를 내보내는(Output) 블록이 존재해야 하며, 설정중인 블록에서 해당 컨텍스트를 받아야(Input) 합니다. 이처럼 블록 간 컨텍스트가 설정되어 있지 않다면, 컨텍스트와 파라미터명을 참조해도 동작하지 않습니다.
형식 예시
컨텍스트 정보를 스킬 응답(response)에서 활용하기
스킬 응답에서 ‘Output 컨텍스트’의 정보를 직접 업데이트 할 수 있습니다. 예를 들어 다음과 같은 스킬 응답 포맷이 있다고 하겠습니다.
1 | { |
스킬 응답의 Structure 예시
다음처럼,
- 복수의 Output 컨텍스트들 중 특정 컨텍스트만 Output 되도록 변경할 수 있습니다. →
name
- 컨텍스트의 수명(lifespan)을 변경할 수 있습니다. →
lifeSpan
- 컨텍스트와 관련해 전달하고 싶은 값을 추가할 수 있습니다. →
params
스킬 응답의 Output 컨텍스트에 들어있는 내용이 현재 블록의 Output 컨텍스트란에 존재하는 경우에는, 스킬에 들어있는 값으로 현재 Output 컨텍스트를 덮어쓰기합니다.
Information.
인풋(Input)으로 설정한 컨텍스트가 만료될 경우 해당 블록은 설정된 응답이 아닌 폴백 메시지로 응답하게 됩니다. 폴백 메시지가 설정되어 있지 않으면 빈 말풍선이 나가게 되므로 기본 시나리오> 폴백블록 에서 설정 상태를 확인해 주세요.
컨텍스트 갱신
스킬 응답으로 컨텍스트를 수정하는 경우, 변경하려는 output 컨텍스트가 미리 블록에서 설정되어야 합니다. 스킬 응답의 context 필드는 값을 수정할 뿐, 새로운 output 컨텍스트를 만들 수는 없습니다.
Example.
예를 들어
abc
라는 output 컨텍스트를 블록에서 생성했다면, 스킬 응답으로abc
name을 가지는 context의 lieSpan, params를 수정할 수 있습니다.
하지만def
라는 output 컨텍스트를 블록에서 생성하지 않은 상황에서, 스킬 응답으로def
라는 name을 가지는 context를 수정한다면 이는 반영되지 않습니다.
응답 타입별 JSON 포맷 > ContextControl
스킬 설정(내 api와 연결)
응답 형식
오픈빌더의 봇 응답형식 설정(말풍선 설정)에서 스킬 서버의 응답값을 텍스트 영역에 사용할 수 있습니다. 기본적으로 {{#webhook./Step 1. 스킬 서버에서 응답값 설정
‘Ryan’이라는 유저에 대한 정보가 아래와 같은 값으로 스킬서버에서 응답하도록 설정합니다.
1 | { |
Step 2. 오픈빌더에서 응답형식(말풍선) 선택 및 값 입력
오픈빌더에서 원하는 봇 응답형식을 선택합니다. 스킬 응답값은 말풍선 종류에 상관없이 텍스트를 입력하는 부분에 적용 가능합니다.
오픈빌더에서 응답형식을 값으로 입력한 예시
Step 3. 해당 블록을 호출하여 테스트
스킬 응답값이 적용 된 블록의 발화 패턴을 입력하여 결과를 확인해봅니다.
응답설정을 값으로 설정한 출력 화면 예시
- List 형태는 지원하지 않습니다.
- 없는 값의 path를 지정하실 경우 비어있는 텍스트로 출력됩니다.
응답설정을 스킬로 사용하기
텍스트형, 이미지형 등 기본 형식 외에 스킬데이터만을 이용해 응답형식을 설정할 수 있습니다. 아래 이미지와 같이 봇 응답형식을 추가할 때, 기본 제공형태가 아닌 스킬데이터로 사용을 클릭하면 스킬데이터를 응답형식으로 사용할 수 있습니다.
스킬값을 응답형식으로 사용하기 위해 ‘스킬 데이터로 사용’을 선택합니다.
스킬데이터 사용으로 응답형식을 설정한 화면
상세한 포맷 및 세부 내용은 스킬 개발 가이드 > 응답 타입별 JSON포맷에서 확인 가능합니다.
주요개념
엔티티
- 엔티티(Entity)란 봇이 이해할 수 있는 용어를 체계적으로 정리한 데이터 사전입니다. 엔티티가 정의되어 있다면, 봇은 사용자 발화로부터 사용자의 의도에 맞는 동작 수행을 위한 주요 데이터를 추출할 수 있게 됩니다.
- 엔티티명>대표엔트리(1,2,3,)>동의어(A,B,C…)로 구성되어있다.
- 엔티티는 나의엔티티(내가직접입력) , 시스템엔티티(카카오측에서 만들어놓음)(날짜, 시간, 숫자 등등)로 구별된다.
- 엔티티가 있다면 사용자가 비슷한 말을 발화한 것에서 원하는 값을 객체로 가져올수있다.
시나리오
시나리오(Scenario) 는 봇 안에서 사용자가 경험할 수 있는 서비스 단위입니다.
예를 들어 금융과 관련된 서비스를 제공하는 봇이 있다고 가정하면 이 봇이 제공할 수 있는 서비스 단위, 즉 시나리오는 ‘예금’, ‘적금’, ‘대출’, ‘연금’, ‘방카슈랑스’ 등이 될 수 있습니다.
사용자의 의도(Intent)를 응대하는 가장 작은 단위를 블록(Block)이라고 하는데, 하나의 시나리오는 다양한 블록들이 모여서 이루어지게됩니다. 즉, 봇 작업자는 이러한 시나리오 단위로 다수의 블록들을 원하는 서비스 별로 그룹핑하여 체계적으로 관리할 수 있습니다.
시나리오 종류
기본 시나리오
기본 시나리오는 모든 봇에 장착되어있으며 웰컴 블록(봇이 사용자 처음 만날때), 폴백 블록(봇이 사용자의 발화 의도를 이해하지 못할떄 내뱉는 메세지 정의), 탈출 블록(봇의 되묻기 상황등에서 사용자가 대화를 초기화or탈출하고 싶을 때 쓰는 사용자 명령어를 정의함) 존재
커스텀 시나리오
커스텀 시나리오는 봇 작업자가 서비스 단위 등으로 구분하며 지속 생성할 수 있습니다.
시나리오 설정
모든 시나리오에 공통적으로 적용할수 있는 ‘속성’을 정의 할수있다.
두가지
되묻기 질문
대표적으로 봇 작업자가, 봇이 사용자로부터 특정 정보 (= ’파라미터값’ 이라고 합니다. 파라미터 설정 참조)를 획득까지 물어보는 질문을 ‘되묻기 질문’이라고 하며, 이를 본 설정 메뉴안에서 직접 정의할 수 있습니다.
- 최대 횟수(8회까지) 및 초과시 안내 메시지
- 되묻기 대기 시간 (10분/20분/30분/60분/120분) & 초과시 안내 메시지
봇 제네릭(Generic) 메뉴
봇 제네릭 메뉴는 카카오톡 챗봇 안에서 하단에 슬라이드 메뉴 형태로 존재하는 사용자 인터페이스를 의미합니다.
챗봇 사용자가 아래에서 위로 해당 공간을 쓸어올려 언제나 중요 필수 메뉴를 쉽게 접근할수 있도록 하는 메뉴입니다. 봇 작업자는 본 공통 설정안에서 제네릭 메뉴에 사용여부를 스위치 On/Off 형태로 간편하게 셋팅할 수 있습니다.
- 카카오 i 오픈빌더의 봇 제네릭 메뉴는 개발 채널을 연결해야 볼 수 있습니다.
- 봇 제네릭 메뉴에서 ‘상담원으로 전환하기’ 버튼을 최상단 또는 최하단으로 이동할 수 있습니다.
- 개발 채널에 상담톡을 연결하여 봇 제네릭 메뉴를 테스트하실 경우 상담톡 api를 제공하는 딜러사에 비과금 개발 채널 생성을 요청하셔야합니다. (임의로 채널 생성 후 테스트 시 상담톡 사용료가 과금될 수 있습니다)
Tip: nformation. 제네릭 메뉴에서 ‘상담원으로 전환하기’ 설정하기
’상담원으로 전환하기’기능을 사용하기 위해서는 아래 조건을 충족해야 합니다.
- 운영 채널과 개발 채널을 모두 연결해야 합니다.
- 운영 채널과 개발 채널에의 1:1 채팅 설정이 모두 ON이 되어 있어야 합니다.
해당 설정은 카카오톡 채널 관리자 센터에서 진행할 수 있습니다. 카카오톡 채널 관리자 센터가기
해당 봇을 배포하시면 카카오 i 오픈빌더에 연결한 운영 채널에도 동일한 봇 제네릭 메뉴 설정이 적용됩니다. (단, 운영 채널에도 상담원 전환 설정이 되어있어야 합니다)
상세한 설정 방법은 튜토리얼 > 시나리오와 블록 만들기를 참조하시길 바랍니다.’
블록 (매우 중요개념)
블록(Block) 이란 사용자 의도의 기본 단위로,
인텐트(Intent)
라고도 불립니다. 1개의 블록은 1개의 의도를 표현하며, 사용자 발화가 봇으로 유입되면, 블록안에 사전에 등록된 발화내용을 기반으로 사용자 의도가 파악되어 1개 블록이 최종 추출됩니다.이때 블록안에는 사용자 예상 발화, 그리고 봇이 수행할 액션과 응답할 내용이 설계됩니다.(중요)
예를 들면, 주로 ‘날씨 알려주기, 메시지 보내기, 지역 검색하기’ 와 같이 봇의 수행 미션(Task) 단위로 블록이 설계됩니다.
블록의 종류
기본 블록은 봇이 구동할 때 필요한 최소한의 이벤트를 정의한 블록입니다. 봇 생성시 자동으로 생성되고 삭제가 불가능하며, 시나리오 메뉴에 있는 ‘시나리오 설정’ 에서 수정이 가능합니다.
- 웰컴 블록 (처음 사용시)
- 폴백 블록 (사용자의 발화 의도가 어떠한 블록과도 매칭안될때 응답설정하는블록)
- 탈출 블록(봇의 되묻기상황에서 대화 초기화, 탈출시 사용)
스킬(자신의 api와 연결)
스킬은 블록의 출력과 하는 일이 비슷합니다. 사용자에게 정보를 출력하는 것도, 특정 블록에 종속된다는 성질도 비슷합니다. 스킬도 해당 블록의 발화에 반응하여 응답을 돌려주게 됩니다. 즉 ‘블록에 종속되어 사용자에게 응답을 돌려주는 기능’ (블록이 데이터 보내주면 실행됨)
블록의 출력만으로 한계가 있는 예시들>>>이때 스킬을 쓰면 쉽게 문제해결
- 사용자가 어떤 야구팀을 좋아하는지 기록하고 이에 맞게 대답해야 한다면?
- 실시간으로 날씨를 알려줘야 한다면?
- 오늘 새로 입고된 상품을 보여줘야 한다면?
스킬의 역할
출력
- 스킬은 출력으로 사용이 가능합니다. 발화에 따라서 출력의 큰 틀이 바뀌거나 많은 요소들이 바뀌는 상황이라면 일일이 데이터로 바꾸는 것보다 통째로 응답을 만들어서 주는 것이 낫습니다.
- 스킬은 출력으로 사용이 가능합니다. 발화에 따라서 출력의 큰 틀이 바뀌거나 많은 요소들이 바뀌는 상황이라면 일일이 데이터로 바꾸는 것보다 통째로 응답을 만들어서 주는 것이 낫습니다.
- 예시)
- 주문을 받는 봇이 있습니다. 주문 봇은 사용자의 주문 내역을 저장하고, 주문 끝이라는 발화가 들어오기 전까지 계속하여 주문을 진행합니다. (카트식 주문이라고 합니다.) 이 상황에서 주문 봇은 사용자가 주문하는 메뉴에 따라서 메뉴를 추천하거나, 사용자가 기입한 기록을 토대로 알레르기와 같은 경고를 중간에 추가할 수 있습니다.
데이터
스킬은 데이터로 사용이 가능합니다. 출력의 큰 틀이 바뀌지 않고 구체적인 몇 가지 요소만 바뀌면 된다는 상황이라면, 굳이 모든 응답을 스킬을 통해서 만들 필요가 없습니다.
예시)
시간으로 환율을 보여주는 봇이라면 그 봇의 출력은 아래와 같을 것입니다.
(Example. “hh시 mm분, 현재 환율은 xxx원입니다.”)
출력에서 필요로 하는 데이터는 ‘시간’, ‘분’, 그리고 ‘환율 수치’입니다. 그렇다면, 모든 내용을 스킬로 만들 필요 없이 데이터에 해당하는 값만 스킬 서버에서 반환하고, 이를 블록의 출력에서 이용하는 방식을 사용하면 됩니다.
스킬 한 눈에 보기
스킬 응답을 처리하는 스킬 서버를 생성합니다.
오픈빌더에서 스킬을 생성하여 생성한 스킬 서버의 *엔드포인트를 등록합니다
tip: 엔드포인트란?
스킬 서버의 엔드포인트는 요청을 전송할 수 있는 창구를 의미합니다. 예를 들면, 스킬 서버의 주소를 i.kakao.com 이라 가정합니다. 그리고 ‘i.kakao.com/a‘, ‘i.kakao.com/b‘ 이렇게 두 개의 url에 요청을 전달하면 그 응답을 반환하도록 만들었습니다. 이 경우, ‘i.kakao.com/a’와 ‘i.kakao.com/b’는 각각 스킬 서버의 엔드포인트가 됩니다.위에서 만든 스킬과 블록을 연결합니다
스킬과 연결한 블록이 활성화되면(ex. 사용자가 블록에 등록된 발화로 봇에게 말을 건 경우), 봇 시스템은 스킬에 등록된 엔드포인트로 요청을 전송합니다.
스킬 서버에서 응답을 만들어 반환하면, 봇 시스템은 이를 토대로 사용자에게 전달할 출력 모습을 만들고 카카오톡에 그립니다. 스킬 개발 가이드 > 응답타입별 JSON포맷
발화 패턴
- 오픈빌더로 챗봇을 만들 때, 챗봇이 사용자 발화를 인식할 수 있도록 만드는 원리의 핵심은 패턴(Pattern) 입니다. 발화 패턴을 만드는 기본 과정은 다음과 같습니다.(즉, 봇이 사용자들이 ‘이렇게 말할 것이다’ 예상되는 발화문 등록)
- 챗봇이 사용자 의도를 이해하기 위해, 추출된 엔티티 정보는 가장 중요한 열쇠입니다.
파라미터 설정
파라미터(Parameter) 는 봇이 사용자의 의도를 정확히 이해하기 위해 필요로 하는 데이터를 일컫습니다. 봇과의 대화는 파라미터 데이터를 채우는 작업이다. 따라서 필요한 데이터가 없으면 봇이 되묻기를 한다. >>>스킬에 데이터(파라미터)가 보내지면 들어온 데이터에 맞는 다양한 결과값을 보내줍니다(우리서버에 ???)
한 블록내에서 파라미터 명은 유일
스킬을 제작하는 작업자는 필요한 파라미터 등에 대한 내용을 정의하게 됩니다.
예시) ‘지역별 날씨를 알려주는 스킬’을 제작했다면, 지역명을 스킬로 보내게 되고 실제 날씨정보를 출력해서 보내주게됩니다. 여기에서 스킬로 보내지는 지역 정보를 ‘파라미터 데이터’로 볼 수 있습니다.
파라미터 구성 요소
파라미터 명
- 파라미터를 구분하는 이름입니다
엔티티
- 발화에 매핑된 에티티를 파라미터에 연결하는 역할을 합니다. 발화 입력시 유효한 엔티티가 있는 경우에는 추천 되고, 선택하여 태깅이 가능합니다.
값
- ‘동작’영역에서 ‘값’은 ‘엔티티’를 통해서 채우거나 이전 또는 현재의 정보에 접근해서 값을 채울 수 있습니다. 이외에도 고정된 값을 지정해서 채울 수 있습니다. 값을 사용하기 위한 표현법은 다양합니다. 아래의 사용방법을 확인해 주세요.
- 엔티티 값
- ‘$’로 시작하는 이름으로 구성된 값
- 주로, 파라미터 이름과 동일하게 사용
- ex) $paramName1, $paramName2, …
- 특정 값
- 값 위치에 ‘#’으로 시작하는 이름으로 구성된 값
- ‘current’를 사용해서 접근할 수 있는 값은 현재 대화의 발화 내용
- ‘request payload’의 특정 path 값
- ex) #[current|contextName].[path].[to]
- 고정된 값
- ‘$’ 이나 ‘#’ 으로 시작하지 않는 값
- 값 자체가 실제 파라미터의 값으로 사용
- 기본값
- 필수 파라미터로 지정되지 않고 사용자의 발화나 이전 또는 현재의 특정 값을 참조하거나, 고정된 값이 설정되어 있지 않을 경우에 ‘기본 값’으로 채택해 사용되는 기본적인 값입니다.
- 엔티티 값
파라미터 검증 API
‘검증/변환’ 등의 작업을 스킬로 요청을 보내기 이전에 수행할 때 사용되는 항목입니다. 작업이 이루어질 때, 파라미터에 채워진 값이 ‘HTTP’요청의 ‘payload’로 사용되어 집니다.
응답의 ‘검증/변환’의 결과 값이 스킬의 요청에 활용되며, API를 검증하기 위해서는 호출할 API url과 검증 실패시 에러메시지를 등록해야 합니다. API를 통한 값의 ‘검증/변환’ 등의 작업은 대상이 되는 API url에 대해서 HTTP url 방식의 호출이 일어나게 되며, 정해진 형태의 결과값을 반환해주어야 정상적으로 동작합니다.
이외의 경우에는, 오류로 처리되며 ‘value’가 채워지지 않은 것과 같은 의미로 해석이 되어 현재 수행중이던 파라미터에 대해서 슬롯필링 과정을 다시 수행되게 됩니다.
그룹 파라미터
- 기본적으로 하나의 파라미터는 하나의 엔티티와 연결되며 각 블록안에서 유일한 이름을 갖습니다. 그룹 파라미터는 동작을 수행하는 데 필요한 정보가 그룹 내 하나만 해당해도 실행하는데 문제가 없을 때 주로 사용됩니다.
- 그룹을 생성하면 파라미터가 묶이게 됩니다.
- ‘그룹 파라미터’로 구성되어지는 순간, 해당 그룹은 ‘필수 파라미터’가 됩니다. 이 중에 하나 이상의 엔티티가 채워지면 슬롯필링이 완료됩니다.
- ‘검증 API’를 사용하는 파라미터가 그룹 파라미터인 경우에는 검증 결과가 성공하면 해당 그룹 파라미터는 슬롯필링이 완료되고, 실패하는 경우는 다음의 경우로 나뉩니다.
- 그룹 내 파라미터 중 슬롯필링이 된 경우가 없을 경우, 해당 그룹 파라미터는 슬롯필링을 수행합니다.
- 나머지 파라미터 중 하나 이상이 슬롯필링이 되었다면 슬롯필링이 완료되고 다른 파라미터에 대한 체크가 진행됩니다. 아직 값이 채워지지 않은 다른 필수 파라미터나 그룹 파라미터가 더 존재한다면 그 파라미터들에 대해서 다시 슬롯필링이 진행됩니다.
슬롯필링
- 필수 파라미터가 값이 채워지지않았을때 해당 ‘파라미터 값’을 채우기 위해서 ‘되묻기 질문’을 사용하여 사용자와 대화를 시도하는 과정입니다.
- 이를 채워야 스킬에게 데이터를 넘겨주기때문에 반드시 필요한 과정
- 슬롯필링이 진행되는 동안에는 누적되어 있던 ‘컨텍스트(Context)’의 ‘라이프스팬(Lifespan)’은 차감되지 않고, 값을 채우기 위한 시도만 진행됩니다. 그리고, 슬롯필링을 시도하는 횟수는 ‘시나리오 설정’이나 ‘되묻기 질문’에서 설정할 수 있습니다.
파라미터에 연결된 스킬 실행 과정
Request payload 구성
연결된 스킬의 실행은 모두 ‘HTTP request’로 이루어집니다. HTTP method 중 ‘POST’만을 지원하고 있으며, ‘request/response’값에 모두 JSON형태를 사용하고 있습니다. ‘Request payload’는 동작에서 정의한 파라미터들의 구성에 따라서 ‘JSON’의 구성이 달라집니다.
동작에서 구성한 파라미터 이외의 값들로는 사용자의 대화 request 안에 들어 있는 “user”, “params” 라는 예약된 필드의 값들이 그대로 전달됩니다. 그리고, 현재까지 누적되어 있는 컨텍스트의 목록 또한 “contexts” 라는 이름으로 전달 됩니다.
이외에 http header 에는 “X-Request-Id” 라는 형태로 하나의 대화에 부여된 유일한 값인 footprint id 값을 같이 전달하게 됩니다.
payload란?
HTTP 요청을 보낼 때, 포함되는 데이터를 payload라고 합니다. payload는 JSON 형태를 가지고 있으며 JSON을 구성하는 키는 파라미터 이름이고, 값은 추출된 값이 됩니다. HTTP 요청에 대한 응답도 JSON 의 형태를 갖고 출력 영역으로 전달되고 사용 되어질 수 있습니다. ‘Payload’는 파라미터들이 ‘key value’ 형태로 JSON을 기본 구성하고 여기에 ‘user request’의 일부 항목과 누적된 컨텍스트 정보입니다.
Skill request body
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120{
"userRequest": [REQUEST OBJECT],
"bot": {
"id": "bot id",
"name": "bot name"
},
"action": {
"id": "action id (uuid)",
"name": "builder에서 등록한 이름",
"params": {
"param name" : "resolved value"
....
}
"detailParams": {
"param name" : {
"origin": "origin value in utterance",
"resolved": "resolvedValue from NLU engine"
},
...
}
}
}
{
"userRequest": {
"makerId": "june.kay",
"user": {
"id": "1",
"type": "accountId"
},
"chatId": "chatchat",
"utterance": "오늘 용띠 운세 좀",
"device": null,
"params": null
},
"bot": {
"id": "f6a2a947-7b55-4bdb-b36e d9eac9fe9aca",
"name": "노래봇"
},
"intent": {
"id": "af5fb347-ce65-483e-ae2d-dedeb5f97a68",
"name": "띠찾아"
},
"action": {
"id": "88254013-1581-44bc-a4b2-ccfb69327ca9",
"name": "fortune.desc",
"params": {
"entity_toTime": "2017-06-01T12:00:21+0900",
"entity_zodiacName": "용띠",
"entity_fromTime": "2017-06-01T12:00:21+0900",
"intent": "informZodiacFortune"
},
"detailParams": {
"entity_toTime": {
"origin": "오늘",
"value": "2017-06-01T12:00:21+0900"
},
"entity_zodiacName": {
"origin": "용띠",
"value": "용띠"
},
"entity_fromTime": {
"origin": "오늘",
"value": "2017-06-01T12:00:21+0900"
},
"intent": {
"origin": "informZodiacFortune",
"value": "informZodiacFortune"
}
}
}
}
{
"userRequest": {
"makerId": "june.kay",
"user": {
"id": "1",
"type": "accountId"
},
"chatId": "chatchat",
"utterance": "오늘 용띠 운세 좀",
"device": null,
"params": null
},
"bot": {
"id": "f6a2a947-7b55-4bdb-b36e d9eac9fe9aca",
"name": "노래봇"
},
"intent": {
"id": "af5fb347-ce65-483e-ae2d-dedeb5f97a68",
"name": "띠찾아"
},
"action": {
"id": "88254013-1581-44bc-a4b2-ccfb69327ca9",
"name": "fortune.desc",
"params": {
"entity_toTime": "2017-06-01T12:00:21+0900",
"entity_zodiacName": "용띠",
"entity_fromTime": "2017-06-01T12:00:21+0900",
"intent": "informZodiacFortune"
},
"detailParams": {
"entity_toTime": {
"origin": "오늘",
"value": "2017-06-01T12:00:21+0900"
},
"entity_zodiacName": {
"origin": "용띠",
"value": "용띠"
},
"entity_fromTime": {
"origin": "오늘",
"value": "2017-06-01T12:00:21+0900"
},
"intent": {
"origin": "informZodiacFortune",
"value": "informZodiacFortune"
}
}
}
}
응답 설정
응답 은 사용자 발화가 특정 블록에 매칭될 경우 사용자에게 출력되는 답변입니다. 하나의 블록당 최대 3개의 연속된 응답을 노출할 수 있으며, 응답은 사용자의 기기에 따라 다양한 형태로 만들 수 있습니다.
응답의 종류
오픈빌더에서의 응답은 봇 작업자가 목표로 하는 디바이스에 따라 카카오톡 응답과 카카오미니 응답으로 나누어집니다. 카카오톡 의 응답 형태는 텍스트형, 이미지형, 카드형, 커머스형, 리스트형 중 원하는 말풍선 타입을 선택할 수 있고, 응답 개수에 따라 각각 기본형, 랜덤형, 케로셀형 등으로 출력할 수 있습니다.
컨텍스트
오픈빌더안에서는 바로 컨텍스트(Context) 라는 기능을 통해서 봇 작업자가, 블록 안에서 직접 해당 컨텍스트를 정의하고, 블록간 연결 및 관리를 수행할 수 있습니다. 컨텍스트가 잘 정의되어 있다면, 봇은 사용자에게 보다 똑똑하고 매끄러운 대화를 경험할 수 있게 해줍니다.
플러그인
- 플러그인(Plugin) 은 봇 작업자가 되묻기 질문을 설정하거나 원하는 출력을 설정하여 봇이 ‘별도로 정의된 질문 혹은 답변’을 하기 위한 기능입니다.
- 플러그인은 파라미터 설정 을 통해서 사용할 수 있는 플러그인과 봇 응답형식 에서 사용할 수 있는 플러그인으로 나누어져 있습니다.
‘파라미터 설정’ 플러그인
- 파라미터 설정에서 사용할 수 있는 플러그인은 되묻기 질문에서 봇이 필수적으로 받아야하는 파라미터를 사용자가 좀 더 편리하고 정확하게 입력하도록 돕는 보조입력 수단입니다.
- (???)
‘봇 응답형식 설정’ 플러그인
공유하기
공유하기 플러그인은 플러그인을 눌렀을 때 해당 말풍선을 친구에게 공유할 수 있는 기능입니다.