나의 AI 직원 역할을 하는 Telegram 봇을 만들었습니다 (아키텍처 공개)
요약
소규모 비즈니스의 고객 서비스와 주문 관리를 자동화하기 위해 Telegram 봇 기반의 AI 직원을 구축한 사례를 소개합니다. Python, Flask, NGINX 및 DeepSeek 모델을 활용한 아키텍처를 공개하며, 멀티프로세싱을 통해 효율적인 병렬 처리를 구현했습니다.
핵심 포인트
- Telegram API와 Flask를 활용한 웹훅 기반 시스템 구축
- NGINX를 리버스 프록시로 사용하여 SSL/TLS 처리 최적화
- 멀티프로세싱을 통한 여러 AI 역할의 병렬 실행 및 응답성 확보
- DeepSeek 모델을 활용하여 저비용 고효율의 AI 추론 구현
나의 AI 직원 역할을 하는 Telegram 봇을 만들었습니다 (아키텍처 공개)
소규모 비즈니스를 운영한다는 것은 항상 시간이 부족하다는 것을 의미합니다. 고객 문의는 쌓여가고, 주문은 추적해야 하며, 견적서는 보내야 합니다. 그런데 당신은 단 한 명뿐입니다. 만약 24시간 내내 일하고, 병가도 내지 않으며, 하루에 커피 한 잔 값보다 적은 비용으로 일하는 직원을 고용할 수 있다면 어떨까요?
그것이 바로 제가 만든 것입니다. Telegram을 통해 배포 가능한 AI 직원(AI Employee)으로, 소규모 비즈니스를 위해 고객 서비스, 주문 관리 및 영업 지원을 처리합니다. 내부적으로 어떻게 작동하는지 소개합니다.
문제점
소규모 비즈니스 소유자는 너무 많은 역할을 수행합니다. 당신은 CEO이자, 영업팀이며, 고객 지원 담당자이자, 창고 관리자 역할을 동시에 수행합니다. "이 제품 재고 있나요?"라는 질문에 답하는 데 쓰는 매 분은 비즈니스를 성장시키는 데 쓰지 못하는 시간입니다.
기존의 솔루션들은 너무 비싸거나(정규직 고용), 너무 비인격적이거나(기본적인 챗봇), 또는 너무 복잡합니다(자체 AI 시스템 구축). 다음과 같은 요건을 갖춘 무언가에 대한 공백이 존재합니다:
- 저렴함 (Affordable) — 월 /미만
- 개인화됨 (Personal) — 당신의 특정 비즈니스를 이해함
- 배포가 쉬움 (Easy to deploy) — 코딩이 필요 없음
- 항상 사용 가능 (Always available) — 언제든 몇 초 내에 응답함
그 공백을 채우는 것이 바로 AI 직원(AI Employees)입니다.
아키텍처
시스템은 비교적 단순한 스택으로 실행됩니다. Python/Flask가 Telegram으로부터의 HTTP 웹훅 (webhooks)을 처리하고, NGINX가 리버스 프록시 (reverse proxy)로서 전면에 위치하며, 멀티프로세싱 (multiprocessing)을 통해 여러 직원의 역할을 병렬로 실행할 수 있습니다.
┌─────────────┐ ┌──────────┐ ┌───────────┐ ┌──────────────┐ │ Telegram │────▶│ NGINX │────▶│ Flask │────▶│ Python │ │ Bot API │ │ (Proxy) │ │ Webhooks │ │ Multiprocess │ └─────────────┘ └──────────┘ └───────────┘ └──────┬───────┘ │ ▼ ┌──────────────┐ │ ModelHub │ │ API (Deep- │ │ Seek) │ └──────────────┘
NGINX → Flask: 모든 Telegram 웹훅 (webhook)은 443 포트의 서버로 전달됩니다. NGINX가 SSL을 종료 (terminate)하고 로컬 포트에서 실행 중인 Flask 앱으로 프록시 (proxy)합니다. 이는 표준적인 관행입니다. NGINX가 TLS 오버헤드를 처리하는 동안 Flask는 요청 처리 (request processing)에 집중합니다.
Flask Webhook Handler: 사용자가 봇에게 메시지를 보낼 때마다 Telegram은 POST 요청을 보냅니다. Flask는 이를 수신하여 HMAC 서명을 검증하고, 어떤 봇이 메시지를 받았는지에 따라 적절한 핸들러 (handler)로 전달합니다.
Multiprocessing (멀티프로세싱): 각 직원 역할은 각자의 프로세스에서 실행됩니다. 이는 한 직원이 긴 요청을 처리하고 있더라도 다른 직원들은 즉각적으로 응답을 계속할 수 있음을 의미합니다. 메인 Flask 프로세스는 라우터 (router) 역할을 수행합니다.
ModelHub API: 모든 AI 응답은 DeepSeek 모델에 대한 접근을 제공하는 ModelHub API를 통해 전달됩니다. 이를 통해 더 큰 모델 비용의 극히 일부만으로 고품질의 추론 (reasoning) 및 문맥 이해 (context understanding) 능력을 확보할 수 있습니다.
다음은 웹훅 핸들러의 간소화된 버전입니다:
from flask import Flask, request, jsonify
import hmac
import hashlib
import os
app = Flask(__name__)
# 각 봇은 고유한 토큰과 모델 설정을 가집니다
BOTS = {
'ecommerce': {'token': os.environ.get('ECOMMERCE_TOKEN'), 'role': 'ecommerce_assistant'},
'clerk': {'token': os.environ.get('CLERK_TOKEN'), 'role': 'foreign_trade_clerk'},
'support': {'token': os.environ.get('SUPPORT_TOKEN'), 'role': 'customer_service'},
}
@app.route('/webhook/', methods=['POST'])
def webhook(bot_name):
if bot_name not in BOTS:
return jsonify({'error': 'unknown bot'}), 404
bot = BOTS[bot_name]
data = request.get_json()
...
Telegram 웹훅의 작동 방식
새 메시지를 확인하기 위해 Telegram API를 폴링 (polling)하는 대신, 우리는 웹훅 (webhook)을 사용합니다. 사용자가 봇에게 메시지를 보내면, Telegram은 즉시 메시지 데이터를 우리의 서버 URL로 POST 합니다. 이는 폴링보다 훨씬 효율적입니다. 응답이 거의 즉각적이며, 실제 활동이 있을 때만 요청을 처리하기 때문입니다.
웹훅을 설정하는 것은 단 한 번의 API 호출로 이루어집니다:
POST https://api.telegram.org/bot<TOKEN>/setWebhook { url: https://your-server.com/webhook/bot_name, secret_token: your_hmac_secret }
secret_token은 매우 중요합니다. 이를 통해 요청이 실제로 Telegram에서 온 것인지 확인할 수 있습니다. 이 토큰이 없다면 누구나 당신의 봇에 가짜 메시지를 보낼 수 있습니다.
멀티 봇 패턴 (The Multi-Bot Pattern)
한 가지 흥미로운 과제는, 사용자에게 수십 개의 서로 다른 봇을 설치하도록 요구하지 않으면서 어떻게 여러 직원의 역할을 제공할 것인가 하는 점입니다.
해결책은 허브 봇 (hub bot) 패턴입니다. 단일 메인 봇(@ai_staff_xiaochen_bot)이 진입점 역할을 합니다. 사용자는 사용 가능한 직원 메뉴 — 이커머스 어시스턴트 (Ecommerce Assistant), 무역 사무원 (Foreign Trade Clerk), 고객 서비스 (Customer Service), 영업 어시스턴트 (Sales Assistant) — 를 보고 필요한 것을 선택합니다. 백그라운드에서는 각 역할이 고유한 웹훅 (webhook), 고유한 대화 기록, 그리고 자신의 성격과 능력을 정의하는 고유한 시스템 프롬프트 (system prompt)를 가진 별도의 Telegram 봇으로 작동합니다.
이 패턴의 의미는 다음과 같습니다:
- 사용자는 여러 개를 관리하는 대신 단 하나의 봇만 설치하면 됩니다
- 각 역할은 완전히 격리됩니다 — 대화 간에 컨텍스트 (context)가 유출되지 않습니다
- 기존 역할에 영향을 주지 않고 독립적으로 역할을 추가할 수 있습니다
- 각 역할마다 별도의 가격 책정이 가능합니다 — 사용한 만큼만 지불합니다
허브 봇은 인라인 키보드 마크업 (inline keyboard markup)을 사용하여 깔끔한 선택 인터페이스를 생성합니다:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
def show_role_selection(chat_id):
keyboard = [
[InlineKeyboardButton('🛒 Ecommerce Assistant', callback_data='role_ecommerce')],
[InlineKeyboardButton('📋 Foreign Trade Clerk', callback_data='role_clerk')],
[InlineKeyboardButton('🎧 Customer Service', callback_data='role_support')],
[InlineKeyboardButton('💼 Sales Assistant', callback_data='role_sales')],
]
reply_markup = InlineKeyboardMarkup(keyboard)
# 사용자에게 메뉴 전송
bot.send_message(
chat_id=chat_id,
text='Choose your AI Employee:',
reply_markup=reply_markup
)
무료 체험에서 유료로 (Free Trial to Paid)
모든 신규 사용자는 300개의 무료 메시지를 받게 되며, 이는 직원을 1~2주 동안 테스트해 보기에 충분한 양입니다. 그 이후에는 직원 한 명당 월 0.9달러가 부과됩니다. 이 가격 책정은 의도된 것입니다. 소규모 비즈니스라면 누구나 감당할 수 있을 만큼 저렴하면서도, 무료는 아닙니다 (무료 사용자는 시스템을 정중하게 다룰 동기가 부족하기 때문입니다).
결제 흐름은 Telegram 자체를 통해 처리됩니다. 사용자가 메시지 제한에 도달하면, 봇이 Telegram의 결제 API (Payment API)를 통해 인보이스를 보냅니다. 결제가 완료되면 카운터가 초기화되고 사용자는 AI 직원과 계속해서 업무를 이어갈 수 있습니다.
교훈 (Lessons Learned)
1. 프롬프트 엔지니어링 (Prompt engineering)이 작업의 80%를 차지합니다. AI의 성능은 오직 지침 (Instructions)에 달려 있습니다. 무역 사무원(Foreign trade clerk)을 위한 좋은 시스템 프롬프트 (System prompt)를 작성하려면 실제 도메인 지식이 필요합니다. 예를 들어, 선적 조건에 대해 무엇을 물어봐야 하는지, 가격 문의를 어떻게 처리해야 하는지, 언제 사람에게 에스컬레이션 (Escalate)해야 하는지 등을 알아야 합니다. 이는 결코 생략할 수 있는 부분이 아닙니다.
2. 멀티프로세싱 (Multiprocessing)은 생각보다 훨씬 중요합니다. 처음에는 스레딩 (Threading)을 사용했지만, 실행 시간이 긴 요청들이 모든 것을 차단(Block)하곤 했습니다. 멀티프로세싱으로 전환한 것은 응답성 측면에서 밤과 낮의 차이만큼이나 극적인 변화를 가져왔습니다.
3. 사용자들은 AI 직원을 실제 사람처럼 대합니다. 그들은
만약 소규모 비즈니스를 운영 중이거나 운영하는 지인을 알고 있다면, 직접 시도해 보세요: @ai_staff_xiaochen_bot. 직원을 선택하고 메시지를 몇 개 보내서 어떤 일이 일어나는지 확인해 보세요. 처음 300회는 무료입니다.
기술적인 측면에 관심이 있는 개발자라면, 전체 시스템은 오픈 소스 라이브러리 (open-source libraries)를 포함한 표준 도구들로 구동됩니다. Flask, python-telegram-bot, 그리고 신뢰할 수 있는 API 백엔드 (API backend)만 있으면 유사한 것을 구축하는 데 충분합니다. 진짜 마법은 프롬프트 (prompts)에 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기