챗봇만들기- 구현 목표

Song Chae Won·2022년 8월 25일
0
post-thumbnail

😃 동작나래관 챗봇

구현 목표

➕ 길찾기 API

  • 카카오맵 이용하여 사용자의 현위치에서 동작나래관 찾아오는 길을 안내

➕ 외박 신청

  • 동작나래관 홈페이지 마이페이지 링크를 연동

➕ 식단표

  • 매주 식단표 사진(단순 이미지) 업데이트
    (담당은 누가 할 것인지..?)

➕ 식사 시간

  • 단순 텍스트 입력

➕ 건의사항 관리

  • 네이버폼 링크를 연동하고, 폼 결과를 동작나래관 담당 선생님들께 전송

➕ 학교별 장학관 위치 추천(🎇)

  • 서울권 대학교 목록 이름을 입력하면 각 대학교 정문부터 동작나래관/ 도봉나래관 길찾기 결과를 제공하고, 어떤 장학관이 더 가까운 거리에 있는지 추천해주는 기능

  • 테스트 블록에서 발화패턴을 만드는 과정이 필요. 사용자가 조금씩 다르게 말하더라도 각각의 '의도'에 해당하는 블록을 선택해 보여주어야함. 사용자 의도를 이해하기 위해선 엔티티 정보를 정확하게 추출해야함.

EX) 사용자가 '이화', '이화여대', '이대', '이ㅎ여대' 등 다르게 입력하더라도, 이화여자대학교 라는 의도를 인식하여 동작나래관과 도봉나래관 중에 더 가까운 길찾기를 선별해내기.

➕ 종합게시판

  • 동작나래관 오픈채팅방을 활용하면 될 것 같음.
  • 동작나래관 오픈채팅방 링크 안내

➕ 동작구 상도동 실시간 날씨 정보(🎇)

  • 스킬 개발 가이드 이용
    1) 스킬 서버 세팅
    봇 시스템에 응답하는 간단한 http api 서버를 세팅

2) 개발환경
언어: nodejs(https://nodejs.org/en/)
웹 프레임워크: expressjs(http://expressjs.com/)
실행 환경: ubuntu 16.04
스킬 서버에서는 두 개의 엔드포인트 제공

/api/sayHello

‘안녕’ 이라는 텍스트를 보여주는 간단한 텍스트형 응답을 돌려줍니다.

/api/showHello

라이언이 손을 흔드는 이미지를 보여주는 간단한 이미지형 응답을 돌려줍니다.

링크 참조: https://i.kakao.com/docs/skill-build#%EC%8A%A4%ED%82%AC-%EC%84%9C%EB%B2%84-%EC%84%B8%ED%8C%85

  • 블록과 스킬을 연결하여 실시간 날씨 정보 가져오기

➕ 동작구 상도동 인근 버스정류장 및 지하철 시간 확인(🎇)

  • 성대시장 정류장, 상도초등학교 정류장 ➡ 카카오버스 시간 연동
  • 신대방삼거리역, 장승배기역, 신림역, 노량진역
    ➡ 원하는 시간/ 분/ 초 단위로 입력을 사용자에게 받고, 그 시간 이후의 지하철 방면별 해당 역 출발 시간 정보 받기

➕ 추가기능

  • 벼룩시장: 당근마켓 이용?
  • 동작나래관 인근 맛집, 카페 등: 카테고리를 나눠서 한식, 양식, 중식, 일식, 분식, 디저트 각각의 봇 응답을 카드형으로 만들어서 나열해도 좋을 것 같음
  • 동작나래관 연락처

🔻 chatbot_api

class KakaoTemplate:
    def __init__(self):
        # 템플릿 버전
        self.version = "2.0"

    # 단순 텍스트 출력 요소
    def simpleTextComponent(self, text):
        return {
            "simpleText": {"text": text}
        }

    # 단순 이미지 출력 요소
    def simpleImageComponent(self, imageUrl, altText):
        return {
            "simpleImage": {"imageUrl": imageUrl, "altText": altText}
        }

    # 사용자에게 응답 스킬 전송
    def send_response(self, bot_resp):
        responseBody = {
            "version": self.version,
            "template": {
                "outputs": []
            }
        }

        # 이미지 답변이 텍스트 답변보다 먼저 출력 됨
        # 이미지 답변이 있는 경우
        if bot_resp['AnswerImageUrl'] is not None:
            responseBody['template']['outputs'].append(self.simpleImageComponent(bot_resp['AnswerImageUrl'], ''))

        # 텍스트 답변이 있는 경우
        if bot_resp['Answer'] is not None:
            responseBody['template']['outputs'].append(self.simpleTextComponent(bot_resp['Answer']))

        return responseBody
        

🔻 chatbot_api

from flask import Flask, request, jsonify, abort
import socket
import json

# 챗봇 엔진 서버 접속 정보
host = "127.0.0.1"  # 챗봇 엔진 서버 IP 주소
port = 5050  # 챗봇 엔진 서버 통신 포트

# Flask 어플리케이션
app = Flask(__name__)


# 챗봇 엔진 서버와 통신
def get_answer_from_engine(bottype, query):
    # 챗봇 엔진 서버 연결
    mySocket = socket.socket()
    mySocket.connect((host, port))

    # 챗봇 엔진 질의 요청
    json_data = {
        'Query': query,
        'BotType': bottype
    }
    message = json.dumps(json_data)
    mySocket.send(message.encode())

    # 챗봇 엔진 답변 출력
    data = mySocket.recv(2048).decode()
    ret_data = json.loads(data)

    # 챗봇 엔진 서버 연결 소켓 닫기
    mySocket.close()

    return ret_data


@app.route('/', methods=['GET'])
def index():
    return 'hello', 200


# 챗봇 엔진 query 전송 API
@app.route('/query/<bot_type>', methods=['POST'])
def query(bot_type):
    body = request.get_json()

    try:
        if bot_type == 'TEST':
            # 챗봇 API 테스트
            ret = get_answer_from_engine(bottype=bot_type, query=body['query'])
            return jsonify(ret)

        elif bot_type == "KAKAO":
            # 카카오톡 스킬 처리
            body = request.get_json()
            utterance = body['userRequest']['utterance']
            ret = get_answer_from_engine(bottype=bot_type, query=utterance)

            from KakaoTemplate import KakaoTemplate
            skillTemplate = KakaoTemplate()
            return skillTemplate.send_response(ret)

        elif bot_type == "NAVER":
            # 네이버톡톡 이벤트 처리
            pass

        else:
            # 정의되지 않은 bot type인 경우 404 오류
            abort(404)

    except Exception as ex:
        # 오류 발생시 500 오류
        abort(500)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
profile
@chhaewxn

0개의 댓글