카카오톡 API → AI 에이전트 → 업무 실행 파이프라인
카카오톡 메시지를 받아 AI가 처리하고 업무를 자동 실행하는 파이프라인 구조를 설명합니다. 카카오 비즈니스 채널 API부터 n8n 연동까지 실제 구현 방법을 공유합니다.
카카오톡 API → AI 에이전트 → 업무 실행 파이프라인
문제 정의: 카톡에서 바로 업무를 처리할 수 없을까?
한국에서 업무 커뮤니케이션의 시작은 대부분 카카오톡이다. "이번 달 매출 현황 알려줘", "내일 미팅 잡아줘", "지난주 발주서 다시 보내줘" — 이런 요청이 카톡으로 오면, 담당자가 사내 시스템에 접속해 수동으로 처리하고 다시 카톡으로 응답한다.
이 과정을 카카오톡 메시지 수신 → AI 에이전트 판단 → 업무 시스템 실행 → 결과 자동 응답으로 자동화할 수 있다. 2025년 10월 카카오가 ChatGPT를 카카오톡에 직접 통합하면서 AI 기반 카톡 자동화에 대한 관심이 폭발적으로 증가했다.
카카오톡 비즈니스 API 구조
카카오 비즈메시지는 크게 3가지 채널로 구성된다.
| 채널 | 용도 | 특징 |
|---|---|---|
| 알림톡 | 정보성 메시지 발송 | 템플릿 기반, 건당 ~8원, 수신 동의 불필요 |
| 친구톡 | 광고/마케팅 메시지 | 친구 추가 필수, 이미지 포함 가능 |
| 챗봇 | 대화형 자동 응답 | 스킬(Skill) 서버 연동, 실시간 대화 |
AI 에이전트 연동에는 카카오 i 오픈빌더의 스킬(Skill) 서버 방식을 사용한다. 사용자가 채널에 메시지를 보내면, 카카오 서버가 우리가 등록한 Webhook URL로 요청을 전달하고, 우리 서버가 응답을 반환하는 구조다.
아키텍처
┌──────────┐ ┌──────────────┐ ┌─────────────────┐
│ 사용자 │ │ 카카오 서버 │ │ 우리 서버 │
│ (카카오톡)│────▶│ (오픈빌더) │────▶│ (FastAPI) │
│ │ │ │ │ │
│ │◀────│ │◀────│ ┌────────────┐ │
│ │ │ │ │ │ AI 에이전트 │ │
└──────────┘ └──────────────┘ │ │ (GPT-4o) │ │
│ └─────┬──────┘ │
│ │ │
│ ┌─────▼──────┐ │
│ │ 업무 시스템 │ │
│ │ - DB 조회 │ │
│ │ - 캘린더 │ │
│ │ - ERP │ │
│ └────────────┘ │
└─────────────────┘
sequenceDiagram
participant U as 사용자 (카카오톡)
participant K as 카카오 오픈빌더
participant S as FastAPI 서버
participant AI as AI 에이전트
participant BIZ as 업무 시스템
U->>K: "이번 달 매출 현황 알려줘"
K->>S: POST /webhook (JSON payload)
S->>AI: 의도 분류 + 파라미터 추출
AI->>BIZ: query_sales(month="2026-02")
BIZ-->>AI: {total: 52000000, ...}
AI-->>S: 응답 텍스트 생성
S-->>K: JSON 응답 (SimpleText)
K-->>U: "2월 매출 현황: 5,200만원 (전월 대비 +12%)"구현 예시: FastAPI + OpenAI Function Calling
1단계: Webhook 서버
from fastapi import FastAPI, Request
from pydantic import BaseModel
import json
app = FastAPI()
class KakaoRequest(BaseModel):
"""카카오 오픈빌더 스킬 요청 구조"""
intent: dict
userRequest: dict
bot: dict
action: dict
@app.post("/webhook")
async def kakao_webhook(request: Request):
body = await request.json()
# 사용자 메시지 추출
user_message = body["userRequest"]["utterance"]
user_id = body["userRequest"]["user"]["id"]
# AI 에이전트로 처리
response_text = await process_with_agent(user_message, user_id)
# 카카오 응답 포맷
return {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": response_text
}
}
]
}
}2단계: AI 에이전트 (Function Calling)
from openai import OpenAI
client = OpenAI()
# 업무 도구 정의
tools = [
{
"type": "function",
"function": {
"name": "query_sales",
"description": "월별 매출 현황을 조회합니다",
"parameters": {
"type": "object",
"properties": {
"month": {
"type": "string",
"description": "조회할 월 (YYYY-MM 형식)"
}
},
"required": ["month"]
}
}
},
{
"type": "function",
"function": {
"name": "schedule_meeting",
"description": "미팅을 예약합니다",
"parameters": {
"type": "object",
"properties": {
"date": {"type": "string", "description": "날짜 (YYYY-MM-DD)"},
"time": {"type": "string", "description": "시간 (HH:MM)"},
"attendees": {
"type": "array",
"items": {"type": "string"},
"description": "참석자 목록"
}
},
"required": ["date", "time"]
}
}
}
]
async def process_with_agent(user_message: str, user_id: str) -> str:
"""AI 에이전트: 의도 분류 → 도구 호출 → 응답 생성"""
messages = [
{
"role": "system",
"content": (
"당신은 회사 업무를 돕는 AI 비서입니다. "
"카카오톡으로 들어온 요청을 분석하고 적절한 도구를 호출하세요. "
"응답은 카카오톡에 표시되므로 간결하게 작성하세요 (200자 이내)."
)
},
{"role": "user", "content": user_message}
]
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
# 도구 호출이 필요한 경우
if message.tool_calls:
for tool_call in message.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
# 실제 업무 시스템 호출
result = await execute_business_function(func_name, func_args)
messages.append(message)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result, ensure_ascii=False)
})
# 결과를 기반으로 최종 응답 생성
final_response = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
return final_response.choices[0].message.content
return message.content3단계: 업무 시스템 연동
async def execute_business_function(func_name: str, args: dict) -> dict:
"""실제 업무 시스템(DB, API 등) 호출"""
if func_name == "query_sales":
# 예시: DB에서 매출 조회
# result = await db.query("SELECT ... WHERE month = ?", args["month"])
return {
"month": args["month"],
"total": 52000000,
"prev_month_change": "+12%",
"top_product": "클라우드 컨설팅"
}
elif func_name == "schedule_meeting":
# 예시: Google Calendar API 호출
return {
"status": "scheduled",
"date": args["date"],
"time": args["time"],
"meeting_link": "https://meet.google.com/xxx-yyy-zzz"
}
return {"error": "알 수 없는 기능입니다"}실전 팁
메시지 파싱 주의사항
- 카카오톡 메시지에는 이모지, 줄바꿈, 사진 설명 등이 포함될 수 있다
utterance필드를 그대로 LLM에 전달하기 전에 기본 전처리(공백 정리, 길이 제한)를 수행하라- 카카오 오픈빌더의 스킬 서버 응답 시간 제한은 5초 — 복잡한 작업은 비동기 처리 후 알림톡으로 결과 전송
에러 핸들링 필수 패턴
@app.post("/webhook")
async def kakao_webhook(request: Request):
try:
body = await request.json()
user_message = body["userRequest"]["utterance"]
response_text = await process_with_agent(user_message, "user")
except Exception as e:
logger.error(f"처리 실패: {e}")
response_text = "죄송합니다. 일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."
return {"version": "2.0", "template": {"outputs": [{"simpleText": {"text": response_text}}]}}보안 체크리스트
- API 키는 환경 변수 또는 Secret Manager로 관리 (코드에 절대 하드코딩 금지)
- 카카오 오픈빌더 서버 IP 화이트리스트 적용
- 개인정보(이름, 전화번호 등)가 LLM API로 전송되지 않도록 PII 마스킹 처리
- 대화 로그 보관 시 개인정보보호법 준수 (동의 확보, 보관 기간 설정)
비용 구조
월 5,000건 메시지 처리 기준:
| 항목 | 예상 비용 |
|---|---|
| 알림톡 발송 (결과 응답) | ~40,000원 (건당 ~8원) |
| OpenAI API (GPT-4o) | ~$20 (~28,000원) |
| 서버 (AWS t3.small) | ~$15 (~21,000원) |
| 카카오 비즈 채널 | 무료 (기본) |
| 월 합계 | ~89,000원 |
메시지당 약 18원. 담당자 인건비 대비 극도로 효율적이다.
결론
카카오톡 + AI 에이전트 조합은 한국 업무 환경에 최적화된 자동화 패턴이다. 카카오 오픈빌더의 스킬 서버와 LLM의 Function Calling을 결합하면, 별도 앱 개발 없이도 카톡 메시지 하나로 매출 조회, 미팅 예약, 문서 검색까지 처리하는 AI 비서를 구축할 수 있다.
이런 시스템을 우리 회사에도 도입하고 싶다면 → 기술 상담 신청
우리 회사, 어디부터 자동화할 수 있을까?
무료 업무 진단으로 반복 업무를 찾아드립니다. 30분 통화로 월 몇 시간을 아낄 수 있는지 바로 확인하세요.
관련 글
AI 자동화 인사이트를 받아보세요
새로운 가이드와 사례가 올라올 때 알려드립니다. 스팸 없이, 유용한 글만.