개발동기
🎉 제 31회 소프트웨어 전시회를 개최합니다 🎉
전시회 개최에 앞서, 출품작을 모집하고자 합니다.
응용 SW 개발실 - 구석방에서 제 31회 소프트웨어 전시회를 개최한다고 한다!
2022년 11월 13일(일요일) 23:59까지 개발 요약서를 포함해 지원을 완료하면 되는데, 오늘은 11월 8일이니...
단 5일 안에 모든것을 개발하고 배포까지 마무리 해야함...
정말 말도 안되고 무모한것 같지만, 내가 미루고 미뤘으니.. 😔
개발에 성공하든, 못하든 많은 경험이 될것 같아 바로 시작해보려 한다. 🔥🔥🔥
보통.. 팀으로 공모전을 나가겠지만, 나는 혼자서 참여하려 한다.. 누가 5일만에 만드는 프로젝트에 같이 참여하겠어
아무튼, 혹시나 우리 학교의 소프트웨어 전시회에 관심이 있다면 아래 전시 일정을 참고해주셨으면 한다.
✔ 오프라인
- 일시 : 2022년 11월 25일 (금) 09:00 ~ 18:00 (1일간 진행)
- 장소 : 경상국립대학교 가좌캠퍼스 컴퓨터과학관 (30동) 4층 404호
✔ 온라인
- 일시 : 2022년 11월 25일 (금) ~ 11월 27일 (일) (3일간 진행)
- 장소 : 메타버스 플랫폼 '게더타운' (추후 링크 공지)
개발계획
우선 내가 최근 본 것들을 떠올려 보았다. 봉사활동도 갔었고.. 여행도 갔었고.. 그리고 지누가 있었다.
지누가 무엇이냐하면..
요 귀여운 공룡이 경상국립대학교의 마스코트 "지누"다!
내가 왜 최근 지누를 떠올렸나면, 지누는 한동안 이름이 없었는데 내 친구가 마스코트 이름 공모전에서 붙여준 이름이 지누였기 때문이다.
마스코트가 생긴지 얼마 안된터라 지누를 응용한 무언가를 지금껏 본 적 없기에 나는 지누를 챗봇으로 만들어 보기로 했다.
그렇게 프로젝트 이름은 지누랑! 이 되었다.
+++ 개발 완료 후 모두 업데이트 하는걸로~~~
이전에 페이스북 메신저 기반의 챗봇을 개발한 적 있었는데, 페이스북 메신저는 주변에서 더이상 사용하는 사람을 본 적이 없어, 이번엔 카카오톡 기반의 챗봇을 개발하려고 한다.
우선 챗봇에 추가할 기능들을 소개하자면,
- 카카오톡에서 간편하게 접근
- 학식 정보 제공
- (미정) 예약된 시간에 맞추어 그날의 학식 정보 발송
- 학교 공지 제공
- 공지 카테고리를 설정하여 알림 받기 (예시: 장학 내용만 받아보고 싶다)
- (미정) 시간표 기능
- (미정) 시간에 맞추어 알림 전송
- (미정) 자연어 처리기능
우선 지금 생각난 기능은 위와 같은데, 간단한 기능부터 차례대로 구현하는걸로 하려한다.
1. 채널만들기
카카오톡 채널은 기업들이 광고를 보내는 간단한 챗봇부터 전문 1:1 상담까지 할 수 있는 플렛폼인데 올리브영이나 토스와 같이 알림이 오는 채널들을 본 적 있을것이다. 우리도 카카오톡에서 챗봇을 만들것이므로, 카카오톡에서 찾을 수 있게 채널을 생성해 주어야 한다.
아래 링크로 접속해서 카카오톡 채널을 만들자.
카카오톡 채널 관리자센터
세상의 모든 비즈니스를 완성합니다. 지금 무료로 만들어 새로운 비즈니스 홈을 경험하세요.
center-pf.kakao.com
+++ 채널 만드는 과정 추가예정
그리고 나서 카카오톡 채널에서 제공하는 챗봇 제작툴인 오픈빌더 i 에 베타 액세스를 신청해야 하는데, 여러분의 채널에 대해 이름과 설명 이미지를 잘 넣고, 검색 가능 설정을 했다면(꼭 하자! 필자는 안해서 퇴짜맞았다...) 일주일 이내에 카카오톡 대표 이메일로 액세스 권한이 승인되었다고 메일이 올 것이다.
우선 큰것부터 하나하나 보자면...
1. 엔티티 (Entity)
엔티티란 봇이 이해할 수 있는 용어를 체계적으로 정리한 일종의 데이터 사전이다. 엔티티가 정의되어 있다면, 봇은 사용자 발화 1로부터 사용자의 의도에 맞는 동작 수행을 위한 주요 단어나 데이터를 추출할 수 있게 된다.
엔티티는 크게 두 종류로 나눌 수 있는데, 사용자 정의 엔티티와 시스템 엔티티이다. 우린 학식 정보나 학교 공지를 제공해야 하므로 봇이 알아들어야 하는 주요 용어를 설정해야 하므로 사용자 정의 엔티티가 필요하며, 추가적인 기능으로 날짜를 인식하거나 할 경우 시스템 엔티티가 필요할 것이다. 참고로, 엔티티의 정의가 중복될 경우 봇이 햇갈려 할 수 있으므로 명확히 나누어 주어야 한다.
엔티티는 다음과 같이 미리 설계를 한 후 발화등록하면 제작과정이 편해질 것이다.
시스템 엔티티 목록과 예시도 적어두었다.
시스템 엔티티 목록과 예시 - 카카오 i 챗봇 도움말
이 색으로 된 것들은 이후에 사용할 예정이다.
엔티티명 | 설명 | 예시 | 발화 예시 |
@sys.date | '날짜'에 해당하는 엔티티를 태깅합니다. | 오늘, 내일, 어제, 2018년 1월15일, 1월 1일, 수요일 | 오늘 뉴스 들려줘 1월 1일은 무슨 요일이야 |
@sys.date.period | 날짜 중에서 '기간 범위'에 해당하는 엔티티를 태깅합니다. | 이번주, 올해, 주말, 2019년, 1월, 1일부터 10일까지 | 이번주 사수자리 운세 알려줘 올해 무슨 해야 이 |
@sys.date.lunar | 날짜 중에서 '음력'에 해당하는 엔티티를 태깅합니다. | 음력 1월1일, 음력 2019년 5월 5일, 올해 음력 5월 16일, 음력 설날 | 음력 1월 1일이 언제야 음력 2019년 5월 5일 양력으로 며칠이야 |
@sys.date.period.lunar | 날짜 중에서 '음력 기간'에 해당하는 엔티티를 태깅합니다. | 음력 1월, 음력 6월, 음력 8월 | 정월은 음력 1월을 말합니다 음력 8월은 음력에서 여덟 번째 달이다 |
@sys.time | '시간'에 해당하는 엔티티를 태깅합니다. ※시간흐름에 따른 date 정보 속성값도 포함됨 |
30분, 7시, 10분 뒤, 오전 6시, 30초, 정오 | 7시 알람 맞춰줘 알람 정오 지워줘 |
@sys.time.period | 시간 중에서 '시간대'에 해당하는 엔티티를 태깅합니다. ※시간흐름에 따른 date 정보 속성값도 포함됨 |
오전, 아침, 새벽, 저녁, 1시부터 2시까지 | 오전 알람 삭제해줘 아침 뉴스 틀어줘 |
@sys.date.time | 날짜 중에서 '날짜와 시간' 조합에 해당하는 엔티티를 태깅합니다. | 내일 7시, 현재, 모레 오후 11시, 내일 오전 7시, 오늘 1시, 1월1일 오후 2시 | 내일 7시 알람 맞춰줘 현재 상영작 알려줘 |
@sys.date.time.period | 날짜 중에서 '기간 범위와 시간' 조합에 해당하는 엔티티를 태깅합니다. | 오늘 낮, 내일 오전, 모레 오후, 어젯밤, 월요일 오후, 오늘 1시부터 2시까지, 1월1일 9시부터 10시 | 오늘 낮 날씨 어때 내일 오전 알람 꺼 |
@sys.number | '숫자'에 해당하는 엔티티를 태깅합니다. | 1, 삼, 다섯, 열명, 30개 | 삼 더하기 삼 볼륨 다섯 키 낮춰 줘 |
@sys.number.times | 숫자 중에서 '회차'에 해당하는 엔티티를 태깅합니다. | 11회차, 40회, 1화, 2부, 1편, 3차, 834회 | 미우새 1부 틀어줘 로또 당첨 번호 제 834회 알려줘 |
@sys.number.percent | 숫자 중에서 '퍼센트'에 해당하는 엔티티를 태깅합니다. | 20퍼센트, 30프로, 백퍼센트, 50% | 블라인드 20퍼센트 정도 열어줘 블라인드 30프로만 내려줘 |
@sys.number.ordinal | 숫자 중에서 '순서'에 해당하는 엔티티를 태깅합니다. | 1번, 첫 번째, 열 번째, 백 번째 | 플레이리스트 1번 틀어줘 네 번째 playlist 재생 |
@sys.number.age | 숫자 중에서 '나이'에 해당하는 엔티티를 태깅합니다. | 1살, 18세, 스무살, 20세 | 내 아이는 1살입니다 스무살에 대학에 입학했어요 |
@sys.number.birthyear | 숫자 중에서 '출생년도'에 해당하는 엔티티를 태깅합니다. | 1995년생, 85년생, 72년도생 | 1996년생 운세 알려줘 87년생 운세 알려줘 |
@sys.number.decade | 숫자 중에서 '년대(~년대)'에 해당하는 엔티티를 태깅합니다. | 1900년대, 2000년대, 80년대, 90년대 | 90년대 인기 팝 들려줘 1990년대 발라드 틀어줘 |
@sys.number.album | 숫자 중에서 '앨범(~집)'에 해당하는 엔티티를 태깅합니다. | 1집, 2집, 3집, 10집 | winner 2집 재생해줘 자우림 10집 틀어줘 |
@sys.number.rank | 단위 중에서 '순위'에 해당하는 엔티티를 태깅합니다. | 1위, 100위, 1등 | 실시간 이슈 10위 알려줘 멜론 차트 10위부터 틀어줘 |
@sys.unit.duration | 단위 중에서 '기간/시간'을 의미하는 엔티티를 태깅합니다. | 1시간, 1시간 반, 1개월, 4주, 일주일, 이주일, 5년 2개월, 5개월, 5개월 20일, 이틀, 30분 동안, 3일동안, 4분 30초동안 | 1시간 타이머 시작 빗소리 10분 동안 틀어줘 |
@sys.unit.length | 단위 중에서 '길이'에 해당하는 엔티티를 태깅합니다. | 5mm, 1cm, 10cm, 1m, 1km, 100km, 1야드, 100피트, 20인치, 1마일 | 1m 간격으로 앉아주세요 서울부터 부산까지 거리는 325km입니다 |
@sys.unit.area | 단위 중에서 '넓이'에 해당하는 엔티티를 태깅합니다. | 1제곱미터, 25m², 100km², 1헥타아르, 200헥타아르, 1yd², 200ft², 25평, 30에이커 | 서울의 면적은 605.2km²입니다 152 제곱미터는 몇 제곱킬로미터입니까 |
@sys.unit.weight | 단위 중에서 '무게'에 해당하는 엔티티를 태깅합니다. | 1g, 1kg, 10kg, 100mg, 100g, 1톤, 100파운드, 10온스, 7그레인, 1돈, 1근, 10냥, 10관 | 1kg 상자에 넣어주세요 금 1돈은 정확히 3.75 그램입니다. |
@sys.unit.volume | 단위 중에서 '부피'에 해당하는 엔티티를 태깅합니다. | 1세제곱미터, 1cc, 10ml, 500ml, 10데시리터, 1리터, 100cc, 1갤론, 100cm³, 10m³, 10in³, 10ft³, 1yd³, 1홉, 1되, 1말 | 물 1세제곱미터는 약 1 톤 물의 중량이다 1cc는 0.001 리터를 의미한다 |
@sys.unit.pressure | 단위 중에서 '압력'에 해당하는 엔티티를 태깅합니다. | 1기압, 20프사이, 20파스칼, 20헥토파스칼, 20킬로파스칼, 20메가파스칼, 100밀리바, 100바, 1수은주밀리미터, 1mmH₂O, 10inHg, 10inchH₂O | 1기압은 몇 파스칼입니까? 1bar는 100kPa 입니다. |
@sys.unit.temperature | 단위 중에서 '온도'에 해당하는 엔티티를 태깅합니다. | 17°c, 20도, 33.8°f | 거실 난방 20도로 맞춰줘 거실 난방 온도 22도로 맞춰줘 |
@sys.unit.speed | 단위 중에서 '속도'에 해당하는 엔티티를 태깅합니다. | 100m/s, 1마하, 10km/h, 1knot | 100m/s는 0.1km/s 입니다 10000km/h는 8.17마하입니다.. |
@sys.unit.data | 단위 중에서 '정보(데이터량)'에 해당하는 엔티티를 태깅합니다. | 1바이트, 100기가바이트, 100GB, 1TB | 1바이트는 8비트 입니다 1TB는 1024GB입니다. |
@sys.unit.energy | 단위 중에서 '에너지 단위'에 해당하는 엔티티를 태깅합니다. | 1헤르츠, 1킬로헤르츠, 1메가헤르츠, 1기가헤르츠, 100데시벨, 10ampre, 10암페어, 10마력 | 1Mhz는 1000kHz 입니다 |
@sys.unit.currency | 단위 중에서 '통화'에 해당하는 엔티티를 태깅합니다. | 천원, 5천원, 1달러, 100엔, 100위안, 1유로, 오백 파운드, 1파운드, 10프랑, 10센트 | 1달러 환율이 어떻게 돼? 1파운드가 한화로 얼마야 |
@sys.text | 되묻기 상황에서 '유저가 입력한 문장 전체'를 태깅합니다. | ||
@sys.location | 지역 중에서 '국내 지역'에 해당하는 엔티티를 태깅합니다. | 제주도, 강원도, 서울, 송파구, 잠실동 | 제주도 날씨 알려줘 내일 강원도 날씨 |
@sys.nation | '국가명'에 해당하는 엔티티를 태깅합니다. | 대한민국, 프랑스, 일본, 영국, 미국 | 1월 7일 대한민국 날씨 알려줘 지금 프랑스 파리 몇시야? |
@sys.state | 지역 중에서 '해외 주 단위'에 해당하는 엔티티를 태깅합니다. | 캘리포니아, 버몬트, 뉴저지, 콜로라도 | 지금 캘리포니아 몇 시야 미국 뉴저지 시간은 어떻게 돼요 |
@sys.city | 지역 중에서 '해외도시명'에 해당하는 엔티티를 태깅합니다. | 뉴욕, 도쿄, 워싱턴 D.C., 베이징, 런던 | 오늘 뉴욕 날씨 좋아? 워싱턴 D.C.와 베이징의 시차 알려줘 |
@sys.fortune.starsign | '별자리 이름'에 해당하는 엔티티를 태깅합니다. | 물병자리, 물고기자리, 게자리 | 이번주 물병자리 운세 알려줘 1월 이달의 사자자리 운세 어때 |
@sys.fortune.zodiac | '띠 이름'에 해당하는 엔티티를 태깅합니다. | 돼지띠, 쥐띠, 소띠 | 이번주 돼지띠 운세 알려줘 토끼띠는 몇 년생이야 |
@sys.person.name | '인물 : 개인'에 해당하는 엔티티를 태깅합니다. | 아이유, 박지성, 김광석 | 아이유 인기곡 들려줘 박지성에 대해서 알려줘 |
@sys.person.group | '인물 : 그룹명'에 해당하는 엔티티를 태깅합니다. | 엑소, exo, 퀸, queen, 블랙핑크, blackpink, 방탄소년단, bts | 방탄소년단 최신 앨범 틀어줘 퀸 1991년 앨범 틀어줘 |
@sys.currencyname | '통화명'에 해당하는 엔티티를 태깅합니다. | 달러, 엔, 유로, 오스트레일리아달러, 베트남동, 파운드 | 미국의 통화는 달러입니다 영국의 화폐단위는 파운드입니다. |
@sys.currency.code | '통화 코드'에 해당하는 엔티티를 태깅합니다. | USD, JPY, EUR, AUD, VND, GBP, ZWD | 일본 화폐인 '엔'의 통화코드는 JPY입니다. |
@sys.sports.name | 스포츠 정보 중에서 '종목명'에 해당하는 엔티티를 태깅합니다. | 야구, 축구, 태니스, 태권도 | 오늘 축구 경기 있어? 내일 야구 일정 알려줘 |
@sys.sports.league | 스포츠 정보 중에서 '리그명'에 해당하는 엔티티를 태깅합니다. | 프리미어리그, NBA, KBO리그, mlb | 작년 프리미어리그 순위 알려줘 이번달 KBO리그 경기 있어? |
@sys.sports.team | 스포츠 정보 중에서 '팀명'에 해당하는 엔티티를 태깅합니다. | 리버플, 토트넘, 맨체스터 유나이티드, KIA 타이거즈 | 2018년 1월15일 리버풀 경기 알려줘 토트넘 경기에 손흥민 나왔어? |
@sys.sports.stadium | 스포츠 정보 중에서 '경기장'에 해당하는 엔티티를 태깅합니다. | 잠실 종합 운동장 야구장, 수원 월드컵 경기장, 대구 스타디움, 문학 경기장 | 상암월드컵 경기장 축구 경기 있어? 대구 스타디움 경기장 오늘 일정 없어? |
@sys.tv.name | TV 정보 중에서 '프로그램명'에 해당하는 엔티티를 태깅합니다. | 무한도전, 라디오 스타, 런닝맨 | 오늘 라디오 스타에 누구 나와? 런닝맨 멤버 알려줘 |
@sys.tv.channelname | TV 정보 중에서 '채널명'에 해당하는 엔티티를 태깅합니다. | tvn, mbc, kbs 1tv, ocn, jtbc | 지금 tvn에서 뭐 해? mbc 편성표 알려줘 |
@sys.radio.name | 라디오 정보 중에서 '프로그램명'에 해당하는 엔티티를 태깅합니다. | 음악캠프, 정오의 희망곡, 별이 빛나는 밤에, 정지영 라디오 | 배철수의 음악캠프에 나온 노래 들려줘 정지영 라디오 선곡표 들려줘 |
@sys.radio.channelname | 라디오 정보 중에서 '채널명'에 해당하는 엔티티를 태깅합니다. | MBC FM 4u, SBS 러브FM, kbs1 라디오 | mbc fm 4u 틀어줘 sbs 파워 fm 틀어줘 |
@sys.movie.name | 콘텐츠 정보 중에서 '영화명'에 해당하는 엔티티를 태깅합니다. | 신과 함께, 킹스맨, 어벤져스 인피니티 워 | 신과 함께 관객수 알려줘 영화 킹스맨 장르 알려줘 |
@sys.organization.name | 콘텐츠 정보 중에서 '제작사'에 해당하는 엔티티를 태깅합니다. | 디즈니, 월트디즈니픽쳐스, 마블 스튜디오, 롯데엔터테인먼트 | 디즈니에서 제작한 영화 알려줘 마블 스튜디오에서 만든 영화 뭐 있어? |
@sys.theater.name | 콘텐츠 정보 중에서 '극장명'에 해당하는 엔티티를 태깅합니다. | CGV천호점, 메가박스, 롯데시네마 | cgv천호점 상영영화 알려줘 메가박스 개봉작 알려줘 |
@sys.broadcast.name | 콘텐츠 정보 중에서 '방송사'에 해당하는 엔티티를 태깅합니다. | KBS, MBC, SBS, 극동방송, 불교방송 | 극동방송 틀어줘 불교방송 틀어 주세요 |
@sys.url | 문장에서 'URL'에 해당하는 패턴을 태깅합니다. | https://www.kakaocorp.com, http://www.kakaocorp.com, www.kakaocorp.com | 카카오의 공식사이트는 https://www.kakaocorp.com 입니다. |
@sys.bussiness.number | 문장에서 '사업자등록번호'에 해당하는 패턴을 태깅합니다. | 120-81-47521 | 카카오의 사업자등록번호는 120-81-47521 입니다. |
@sys.phone.number | 문장에서 '전화번호'에 해당하는 패턴을 태깅합니다. | 010-1234-5678, 02-2456-7890 | 전화번호는 010-1234-5678 입니다. |
@sys.licenseplate.number | 문장에서 '차량번호'에 해당하는 패턴을 태깅합니다. | 12 가 1234, 123 가 1234 | 차량번호는 12 가 1234 입니다. 123 가 1234 번호가 제 차량입니다. |
엔티티의 예시로, 학식을 제공하기 위해선 여러 식당 중 사용자가 원하는 식당의 정보를 얻어야 하는데, 이를 엔티티로 인식하여 식당을 구별 하려고 한다.
경상국립대학교의 경우 가좌캠퍼스에 교직원식당, 중앙1식당, 교육문화1층식당이 있고 칠암캠퍼스에 교직원식당, 학생식당이 통영캠퍼스에도 교직원식당, 학생식당이 있다. (추가로 가좌캠퍼스 기숙사 식당인 아람관이 있다.)
프로그램 구현 과정에서 캠퍼스를 먼저 확인 한 후 식당을 정할 것이므로 식당이름을 엔티티로 정하여 모든 캠퍼스의 식당을 입력해도 될 것 같다고 생각한다.
이런식으로 제공할 서비스에 필요한 엔티티들을 작성하자. 필자는 식당 이름, 캠퍼스 이름, 공지 카테고리를 작성했다.
2. 시나리오 (Scenario)
시나리오는 챗봇이 사용자에게 줄 수 있는 서비스 단위다. 좀 이해가 어렵다면 우리가 만드는 챗봇이 사용자에게 줄 수 있는 서비스 단위(시나리오)는 '학식', '공지', '시간표' 등이 있다.
챗봇 관리자센터에서는 사용자의 의도(Intent)를 응대하는 가장 작은 단위를 블록(Block)이라고 하는데, 하나의 시나리오는 다양한 블록들이 모여서 이루어지게됩니다. 즉, 봇 작업자는 이러한 시나리오 단위로 다수의 블록들을 원하는 서비스 별로 그룹핑하여 체계적으로 관리할 수 있습니다. - 카카오 i 챗봇 도움말
시나리오는 기본 시나리오와 커스텀 시나리오로 나뉘는데, 기본 시나리오는 아래 3가지 블록들을 가지고 있다.
커스텀 시나리오는 서비스 단위로 필요한 만큼 마음껏 자유롭게 생성할 수 있다.
3. 블록 (Block)
블록이란 사용자 의도의 기본 단위로, 인텐트(Intent)라고도 불린다. 1개의 블록은 1개의 의도를 표현하며, 사용자 발화가 봇으로 유입되면, 블록안에 사전에 등록된 발화내용을 기반으로 사용자 의도가 파악되어 1개 블록이 최종 추출된다.
이때 블록안에는 사용자 예상 발화, 그리고 봇이 수행할 액션과 응답할 내용이 설계된다.
예를 들면, 이 챗봇은 학식 알려주기, 공지 메시지 보내기와 같이 봇의 수행 미션(Task) 단위로 블록이 설계된다.
앞서 나온 기본 블록부터 설정을 조금씩 해보자. 웰컴 블록은 사용자가 처음 챗봇에 접근했을때 출력되는 웰컴 메시지인데, 처음에 사용자가 받게 될 메시지 이므로 친근하게 다가갈 수 있도록 작성했다.
웰컴 블록에 인사말을 설정해 주었다.
인사말에 추가적으로 챗봇 사용을 빠르고 쉽게 하도록 버튼을 추가해 사용할 수 있는 기능을 추가시켜 주었다.
2일차에서 계속 이어가도록 하자.
참조
각주
- 사용자가 봇과 커뮤니케이션하기 위해 내뱉는 말 또는 텍스트 등을 의미합니다. 챗봇의 경우에는 입력하는 텍스트 데이터이고, 스피커봇의 경우에는 실제 사용자의 음성일 수 있습니다. 사용자 발화는 블록 내 사용자 발화 패턴 설정 영역을 통해 입력됩니다. - 카카오 i 챗봇 도움말 [본문으로]