Clova Extensions Kit을 활용하여 개발된 배달의민족 익스텐션에 대해서 우아한형제들 개발자가 개발 경험을 공유하는 세션 발표 자료 입니다.
목표1. 배달의민족 Extension의 개발 목표
목표2. Clova Extension 개발 허들
목표3. 시간 낭비를 줄일 수 있는 개발팁
2. 클로바익스텐션이 뭘까요?
• 클로바플랫폼이 주는 Intent 를 처리하여 결과를 클로바플랫폼에 돌려주는 web api 서버
• STT, NLP/NLU, Intent, Slot, …
• 처음보는 용어들, 개념들 …
• 크고 두꺼운 클로바 연동매뉴얼 … 쫄지마! (사실 전 쫄았어요..)
4. Clova Extension State Diagram
시작 대기 종료
요청
확인
대기
Launch Intent
“배민 실행시켜줘”
Category Order Intent
“치킨 주문해줘”
카테고리
정보
대기
Order Intent
"주문해줘”
Yes intent
“주문해줘 or 취소해줘”
No intent
“주문 안할래 or 취소 할래”
Category Order Intent
“치킨 주문해줘”
Category Cancel Intent
“치킨 주문취소 해줘”
Category Cancel Intent
“치킨 취소해줘”
Cancel Intent
”취소해줘”
6. 클로바익스텐션이 뭘까요?
• 시나리오 기반 챗봇 엔진과 개념상 큰 차이 없을 것 같다.
• + STT + NLP/NLU (speech to intent)
• - 제한된 인터페이스 (순수 음성 기반 interaction 은 시간이 오래걸림)
• 시나리오의 단순화 필요
• 뺄 것은 과감히 뺀다.
• 단순한 기능을 단순하게.
7. 네이버 Clova 배달의 민족
Clova Extension Structure
배민에서
치킨 시켜줘
인증
주문
단골주문
배민
FRONT
Clova
익스텐션스피커
Clova
DB
DB
DB
업소/메뉴 DB
8. 힘들었던 부분들 – 너흰 아직 준비가…
• 클로바/배민 모두 준비가 덜된 상태에서 개발 및 연동을 시작.
• Multi-turn 대화
• 테스트 플랫폼
• 문서
• 법적 준비
• …
• 이제 준비가 다 되었으니 여러분은 (좋겠다)
9. 힘들었던 부분들 – 많은 시스템과 연동
• 관련된 시스템은 많으나…
• 외부 연동용 api 작성
• 업소, 메뉴, 회원, 주문, 인증, …
• 여러 팀들과의 협업
• 핵심 멤버들을 프로젝트룸으로 모아서 빠른 커뮤니케이션을 확보
10. 힘들었던 부분들 - 많은 인간지능 투입
• 음성주문에 예상되는 대화의 수집
• 우아한형제들 임직원들이 대거 참여
• 문장들의 분류, 선택, 시나리오로 정리, 인텐트 추출
• Slot 의 정의, Slot 에 들어갈 수 있는 단어들 결정
11. 힘들었던 부분들 - 끊어읽기
• TTS 테스트를 많이 하면서 적절하게 끊어읽도록 text 를 구성해줘야 함.
• 클로바 목소리가 지겨워지면 잠시 꺼두셔도 좋습니다.
13. 힘들었던 부분들 – 메뉴가… !@#$!@
• 배달 음식 메뉴를 음성으로 지정하는 기능을 삭제
• 미리 카테고리별로 배달 음식을 지정해놓도록 함.
• 메뉴명을 제대로 못 읽어줄 때가 많다.
• 발음이 사람이 읽는것과 비슷하게 나오도록 표현.
• Regular expression 을 활용
• 특수문자 제거
• 단위 변환
• 그 외 불필요한 부분들 제거
14. 힘들었던 부분들 – 메뉴가… !@#$!@#
• 개선중
• 음성안내용 메뉴명을 따로 관리
• 메뉴에서 명사추출 & dictionary 유지보수하여 자동화
• 세트메뉴중 옵션이 많은 경우가 문제
• 음성 주문불가능하도록 해야 함. ( option 을 읽어주는데 시간이… )
15. 힘들었던 부분들 - OAuth2
• 우아한형제들에는 이미 OAuth2 서버가 구현되어있었다.
• 배민 / 배민라이더스 / 배민프레쉬 / 배민쿡 등의 통합인증
• 클로바에 필요한 부분만 추가 하여 사용하였음. (서비스 구분자 등)
• 배민 OAuth2 서버는 토큰을 어떻게 저장/관리하나요?
• AccessToken 은 redis 에 관리 (redis crash의 경우 db 에 임시 저장하도록 되어있음.)
• RefreshToken 은 RDBMS 에 관리하며, timeout 삭제용 agent 존재함.
16. 힘들었던 부분들 - OAuth2
• Clova 연동시발생한 문제들
• 설정한 auth type 이 refresh 시에 적용되지 않아 계정 연동이 풀림
• Clova 는 session 중 access token 만료에 대응하지 않음.
• Oauth spec 상, session 중 access token 이 만료되면 인증을 다시하고 서비스 url 로 돌아가는
mechanism 이 있으나, 이를 적용할 수 없음.
• 대응 - Access token 을 다소 짧게 줄 수 밖에 없음. (24시간 vs 2시간)
17. 효율적인 개발을 위한 팁
• 여러 팀들의 업무를 잘 파악하고 있는 PL 이 필요
• 여러가지의 서비스 시스템들과 연동하게 되어 communication cost 가 높다.
18. 효율적인 개발을 위한 팁
• 음성에 사용하기 좋은 문자열들을 미리 준비/검수
• 모두 clova 를 통해 음성으로 들어보지 않으면 적절하게 발음되는지 알 수 없다.
• 특히 일반적인 문장이 아닌 특이한 단어를 사용하는 경우, 발음해야 하는 대로 따로 적어야 할 가
능성이 큼.
• 많이사용하는 구어체 표현 학습
• 음성 인식이 잘 안되는 경우 비슷한 발음들을 학습
• 돈까스 vs 돈가스
19. 효율적인 개발을 위한 팁
• Intent에 Slot 으로 들어오는 데이터는 문자열
• 문자열 기준으로 작동할 수 있는 api 들이 필요함.
20. 효율적인 개발을 위한 팁
• 테스트환경을 빠르게 구축하여 지속적으로 사용해본다.
• 사용자입장에서 사용해보지 않으면 어색함을 뒤늦게 알게된다.
• 자동화된 테스트도 중요하지만 사람 귀로하는 테스트가 더 중요하다.
21. OAuth2
• Clova <-> oauth2 troubleshooting
• 설정값 적용이 안되어 token refresh 가 되지 않았음.
• QA 테스트시 access token 의 유효성을 테스트할 것.
• Ex) 계정 최초 연동 후 2시간 후에 계정 연동 유지되는지 테스트.
• Scope 문의 포맷 문제
• ” “ delimited vs “,” delimited
23. 보너스
Clova Extension Application Structure
Launch
Service
Custom Intent
Service
Session Ended
Service
Message
Service
WebHook
Controller
Intent
Service
Speech
Service
UI
Service
Speech
Service
UI
Service
Speech
Service
UI
Service
Service LayerController Layer
Order
Service
Extension
Service
Auth
Service
24. Service Layer
Custom Intent
Service
보너스
Clova Extension Service Layer
Launch
Service
Message
Service
Intent
Service
Speech
Service
UI
Service
Speech
Service
UI
Service
Intent
Service
Speech
Service
UI
Service
Message
Service
Session Ended
Service
Message
Service
Speech
Service
UI
Service
Message
Service
Data
Service
Data
Service
Data
Service
25. Sub moduleMain module
Custom Intent
Service
보너스
Clova Extension Application Flow
Launch
Service
Message
Service
Speech
Service
UI
ServiceIntent
Service
Session Ended
Service
Data
Service
Controller