[지난] 왓츠뉴 챗봇 작업 로그

[우당탕탕 챗봇 만들기] 카카오톡 봇빌더 스킬 적용

Haejiness 2022. 6. 12. 13:22

본 게시글은 비개발자가 우당탕탕 구글링과 삽질로 꾸역꾸역 챗봇이 작동하게 만드는 과정에 대한 기록입니다. 작성자의 웹개발 지식은 0이며, 개인이 운영 상에 있어 맥락 파악을 목적으로 기록해놓은 것으로, 도움이 된다면 정말 다행이지만 도움이 되지 못하더라도 양해해주시면 감사하겠습니다... 반대로, 도움이 될 만한 코멘트도 환영합니다! 왜냐하면 또 챗봇을 만들어볼 생각이거든요!!

 

+ 해당 글은 2020년 10월에 작성된, 과거의 글이라는 점 참고해주시기 바랍니다.

 

 

goormide에 코드 작성하기

_새로운 프로젝트 생성 (파이썬(.py)로 생성해야 함!)

현재 코드의 대략적 의미는, content 를 json 형식 코드의 ['action']['detailParams'][news_keyword']['value'] 에 해당하는 값으로 설정해 둠

content = request.get_json()
content = content['action']['detailParams']['news_keyword']['value']

(참고) 봇빌더의 [스킬] - [키워드 검색(해당 스킬)] 로 접속하면 JSON 파일 형식이 어떻게 생성되는지 확인할 수 있다. 여기에서 내가 원하는 게 어디로 할당되는지 체크하고 코드 작성에 참고.

 

즉, content는 [키워드 검색] 블록에 필수 파라미터로 설정해둔 'news_keyword'에 들어온 값이 저장되는 변수. (참고로 keyword 파라미터로는 news.keyword 엔티티를 설정해뒀음. 따라서 태깅된 엔티티 값이 content 변수에 저장된다고 보면 됨)

 

content에 할당된 값을 조건으로 응답을 나눈다. "content가 ㅁㅁㅁ이면, 다음의 내용(dataSend)을 응답으로 보내라." (이 부분을 데이터프레임 활용해서 코드 하나로 자동화하고 싶다.)

if content == u"나영석":
    dataSend = {

그 내부에 포함되는 내용은 봇빌더 도움말을 참고. 여기서는 캐러셀인데, 그 안에 basicCard 양식 활용.

"version": "2.0",
"template": {
    "outputs": [
        {
            "carousel": {
                "type": "basicCard",
                "items": [
                    {
                        "title": "나영석 PD의 다음 주제는 패션?",
                        "description": "왓츠뉴 001_2월 마지막 주 새로 나온 것들",
                        "thumbnail": {
                            "imageUrl": "<http://t1.daumcdn.net/brunch/service/user/aNn/image/PGuV0ZzlaD7vIaPdyIVGlgAWnd0.png>",
                            "link": {
                                "web": "<https://brunch.co.kr/@hardw1996/17>"
}...

(참고) Basic Card 양식은 위와 같은 형식의 응답


스킬 URL 가져오기

우리가 사용 중인 goormide 컨테이너는 무료 버전이기 때문에 서버가 상시 구동(?)이 안된다. 작업 중일 때만 작동함 ㅠ 그리고 자세히는 모르겠지만 매번 실행포트가 달라져서, 봇빌더의 [스킬] - [키워드 검색(해당 스킬)] - [기본 정보] 의 url을 매번 수정해줘야 함. (왜 이러는 건지 모르겠다. 이 문제는 빠르게 알아봐야 할 듯,,)

저 URL은 어디서 받아오느냐,

goormide 작업 창에 [컨테이너] - [포트포워딩 설정] - [명령어] 부분을 복사해주고 http://명령어/message 로 넣어주면 됨. 여기서 /message는 어디서 온 것이냐,

@app.route('/message', methods = ['POST'])

코드 작성 시 함수 정의하기 전 맨 앞에 이렇게 route를 설정해준다. 요기서 가져오면 됨.


적용 방법

일단 우리 무료 버전에서는 그 서버 돌아가게 하려면 goormide 터미널에 python chatbot.py 처럼 'python 파일명.py' 로 실행해줘야 함. 수정사항 있으면 저장 후 다시 실행시키는 게 좋음.

그렇게 하면 봇빌더와 연결이 되는 거고, 봇빌더 내용을 실제 챗봇(카카오톡 채널)과 연결하려면 봇빌더에서 [배포]를 하면 됨!

꿀팁

이상하게 항상 테스트를 해보면 한 번은 되묻기 질문이 튀어나오고 그 이후에 정상적인 반응이 돌아왔다. 그냥 학습을 안 시킨 문제겠거니 생각하기도 했지만 사실 그게 아니었음. 해결 방법은 아래와 같다!

 

[파라미터 설정] 에서 필수 파라미터로 설정한 부분의 문제였음.

일단, 구름 ide 코드 상에서 필수 파라미터로 잡힌 엔티티의 값을 기준으로 응답을 불러오기 때문에 코드를 수정하는 건 추후에 돌이켜야할 가능성을 생각해본다면 너무 위험한 선택 같았다. 그리고 필수 파라미터로 들어가 있어야하는 게 맞으니까..! 코드 수정은 ㄴㄴ

위 이미지! 그걸 눌러서 세부 설정을 하러 가보면, (지금은 $news_keyword로 채워져있는) '값' 부분이 문제였다.

위의 세부사항에서 필수로 채워야하는 '파라미터명'과 '엔티티'는 설정해두었는데, '값'을 비워놨던 것.

 

(챗봇 가이드에 가보면 파라미터 - 값 에 대한 설명이 위와 같이 나와있다.)

사실 위의 설명을 읽고도 정확하게 어떻게 동작하는지는 잘 파악이 안됐지만,,! 값으로 '엔티티 값' 외에도 '고정 값', '특정 값' 등이 있었는데 대애충 읽어보니 '엔티티값'으로 설정해주면 내가 연결해둔 엔티티를 먼저 인식한 뒤에 그 엔티티의 어떤 값과 매칭시키는... 그런 구조가 아닐까 싶었다. 설명에 나와있듯이 '값은 엔티티를 통해서 채우거나 이전 또는 현재의 정보에 접근해서 값을 채울 수 있습니다'라고 하니, 이걸 엔티티와 연결을 해줘야 그 파라미터가 필요로하는 값을 전달해줄 수 있구나... 하는 느낌?

정말 감으로 때려맞추고 있구만...ㅋ 하여튼 이렇게 바꾸니까 곧바로 대답해주는 우리 왓츠뉴봇!!