개발업무/개발

카카오톡 챗봇 ChatGPT 연동하기

NickTop 2026. 5. 19. 23:56

카카오톡 챗봇은 사용자는 앱을 새로 설치하거나 웹사이트에 접속할 필요가 없기 때문에 카카오톡에 챗봇을 만들면 접근성이 좋다

 

카카오톡 챗봇에서 ChatGPT를 직접 호출하는 것은 아니다.

중간에 별도 서버가 필요하다

 

사용자: ChatGPT가 뭐야?
카카오 챗봇
→ 내 FastAPI 서버 호출
→ FastAPI 서버가 OpenAI API 호출
→ GPT 답변 생성
→ FastAPI가 카카오 응답 JSON으로 변환
→ 카카오톡 말풍선 출력

 

프로젝트 구성

가장 간단하게 잡았다

kakao-gpt-bot/
├── main.py
└── .env

 

.env

OPENAI_API_KEY=본인의_OPENAI_API_KEY
OPENAI_MODEL=gpt-4o-mini

API키는 OpenAI 플랫폼에서 생성한다

https://platform.openai.com/api-keys

 

main.py

import os
import logging
from typing import Any

from pydantic import BaseModel
from openai import AsyncOpenAI
from fastapi import FastAPI
from dotenv import load_dotenv


load_dotenv()

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

app = FastAPI()

client = AsyncOpenAI()
MODEL = os.getenv("OPENAI_MODEL", "gpt-5.5")


class ChatRequest(BaseModel):
    message: str


def kakao_simple_text(text: str) -> dict[str, Any]:
    return {
        "version": "2.0",
        "template": {
            "outputs": [
                {
                    "simpleText": {
                        "text": text
                    }
                }
            ]
        }
    }


async def ask_gpt(user_message: str) -> str:
    response = await client.responses.create(
        model=MODEL,
        reasoning=None,
        instructions=(
            "너는 카카오톡 챗봇 상담원이다. "
            "따뜻하게 응대하세요"
        ),
        input=user_message,
    )

    return response.output_text.strip()


@app.get("/health")
async def health():
    return {"status": "ok"}

@app.post("/kakao/skill")
async def kakao_skill(payload: dict[str, Any]):
    """
    카카오 챗봇 스킬 서버용 API
    """
    try:
        user_request = payload.get("userRequest", {})
        utterance = user_request.get("utterance", "")

        if not utterance:
            return kakao_simple_text("질문을 입력해주세요.")

        answer = await ask_gpt(utterance)
        logger.info(answer)
        return kakao_simple_text(answer)

    except Exception as e:
        logger.exception(e)
        return kakao_simple_text("답변 생성 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요.")

@app.post("/kakao/hello")
async def kakao_skill(payload: dict[str, Any]):
    """
    카카오 챗봇 스킬 서버용 API (테스트용)
    """
    return kakao_simple_text("안녕하세요, 반갑습니다")

테스트하는데 비용 드는것이 신경쓰인다면 /kakao/hello URL로 테스트한다

 

외부에서 호출해야하므로 로컬에서 기동하고 ngrok 연동한다

uvicorn main:app --reload --host 0.0.0.0 --port 8000

# 다른터미널에서 
ngrok http 8000

 

아래와 같은 식의 주소가 나온다

Forwarding  https://abc-123.ngrok-free.app -> http://localhost:8000
 

외부망에서 https://abc-123.ngrok-free.app/ 를 통해 접근가능하다 

 

카카오i오픈빌더

아래 링크에서 카카오톡 챗봇을 만든다. 

https://i.kakao.com/

카카오톡 챗봇 만들기

 

 

사이드바 > 스킬 > 스킬목록

에서 스킬을 생성한다

 

아래와 같이 입력하고 저장한다

스킬 등록

 

자세한 스킬 가이드는 아래 링크를 참고한다

https://kakaobusiness.gitbook.io/main/tool/chatbot/skill_guide/answer_json_format

 

좌측 사이드바 시나리오 > 폴백 블록에 들어간다

스킬을 등록해주고 봇 응답에 스킬데이터를 사용한다

폴백 등록

 

왜 이렇게 하냐면,

카카오 챗봇 룰베이스 챗봇으로 대략 이렇게 동작합니다.

사용자 발화
→ 어떤 블록과 매칭되는지 판단
→ 매칭 안 되면 폴백 블록 실행
→ 폴백 블록의 응답 실행
 
여기서 아무런 시나리오나 블록을 만들지 않으면 모든 발화는 바로 폴백 블록으로 떨어집니다

 

봇테스트를 통해 확인할 수 있습니다

봇테스트 결과 확인

 

유의사항

카카오 문서 기준으로 스킬 처리시간 SLA가 5초이기 때문에 5초가 넘어가면 콜백 등록을 별도로 진행해야 합니다.