← 블로그 목록
부재중 전화 자동 응대 AI — 영업시간 외 24시간 메모·콜백 자동화
영업시간 외 전화에 AI 가 응답하고 용건·연락처 받아 다음 영업일에 자동 callback 큐로 처리. 부재중 손실 0.
부재중 전화 자동 응대 AI — 영업시간 외 24시간 메모·콜백 자동화
영업시간 외 전화는 대부분 다음날까지 놓침. 음성 안내 ARS 는 사용자 이탈률 높음. ClawOps 070 + AI 가 자연스럽게 받고 용건·연락처 받아 다음 영업일에 자동 callback 큐로.
0. 활용 예
- 식당·카페·미용실 야간 예약 문의
- 병원·치과 야간 응급 외 문의
- B2B 영업팀 해외 시차 클라이언트
- 1인 사업자 외출 중 통화
1. 영업시간 분기 webhook
ClawOps 는 인바운드 콜 시 webhook 으로 application/x-www-form-urlencoded 파라미터(From/To/CallId 등)를 POST 하고, 핸들러는 VoiceML(XML)로 응답한다. 영업중에는 <Dial> 로 사람에게 연결, 야간에는 <Connect><Stream> 으로 AI 가 실시간 응대한다.
from flask import request, Response
@app.route("/voice-route", methods=["POST"])
def voice_route():
import datetime
from zoneinfo import ZoneInfo
now = datetime.datetime.now(ZoneInfo("Asia/Seoul"))
business_hours = 9 <= now.hour < 18 and now.weekday() < 5
if business_hours:
# 영업중 — 사람 상담사에게 전환
xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial timeout="20" action="https://your-server.com/dial-status">
<Number>07012340001</Number>
</Dial>
</Response>"""
else:
# 영업외 — AI 가 실시간 응대 (WebSocket 핸들러에서 STT/LLM/TTS, save_voicemail 로직)
xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Connect>
<Stream url="wss://your-server.com/after-hours"/>
</Connect>
</Response>"""
return Response(xml, mimetype="application/xml")
system_prompt·save_voicemail같은 AI 응대 로직은<Stream>이 연결되는 WebSocket 핸들러(아래 § 2·§ 3) 안에 둔다. VoiceML 은 "AI 로 보낸다"는 라우팅만 담당한다.
2. system prompt — 자연스럽고 짧게
AFTER_HOURS_PROMPT = """
당신은 OOO 회사의 야간 안내원입니다.
지금은 영업시간 외(평일 18시 이후 또는 주말)입니다.
# 첫 발화
"안녕하세요, OOO 회사입니다. 지금은 영업시간이 아니어서 AI 가 우선 메모받겠습니다.
용건 짧게 말씀해주시면 영업 첫 시간에 직접 연락드릴게요."
# 받아야 할 정보
1. 이름
2. 연락처 (전화 안 받은 사람한테 다시 걸 번호)
3. 용건 1-2 문장
4. (가능하면) 선호 callback 시간대
# 다 받았으면
- save_voicemail tool 호출 → DB 저장 + Slack 알림
- 정중히 안내: "메모 잘 받았습니다, 영업일 09시부터 순서대로 연락드릴게요. 감사합니다."
- hang_up
# 규칙
- 한국어, 짧게 (전체 통화 2분 이내)
- 응급 의심시 (의료 통증, 사고, 화재 등) → 119 안내 후 즉시 종료
- 메모만 받기. 가격·예약 확정·법적 답변 금지
"""
3. save_voicemail tool
from clawops.agent import ClawOpsAgent, OpenAIRealtime
agent = ClawOpsAgent(
from_=number.number,
session=OpenAIRealtime(system_prompt=AFTER_HOURS_PROMPT, language="ko", voice="marin"),
)
@agent.tool
async def save_voicemail(name: str, phone: str, reason: str, preferred_callback_time: str = "") -> str:
"""야간 메모 저장 + 영업일 첫 시간 callback 큐 추가."""
db.execute(
"INSERT INTO callbacks (name, phone, reason, preferred_time, status) "
"VALUES (?, ?, ?, ?, 'pending')",
(name, phone, reason, preferred_callback_time),
)
# Slack 알림 (사장/매니저 채널)
notify_slack(
f"🌙 야간 메모: {name}({phone})\n"
f"용건: {reason}\n"
f"선호 시간: {preferred_callback_time or '미명시'}"
)
return "메모를 저장했습니다."
4. 영업일 첫 시간 callback 큐 실행
크론 또는 fly cron 으로 매일 09:00 KST:
# scripts/morning_callback.py
import datetime
from zoneinfo import ZoneInfo
def run_morning_callbacks():
now = datetime.datetime.now(ZoneInfo("Asia/Seoul"))
if now.weekday() >= 5: return # 주말은 skip
pending = db.execute(
"SELECT * FROM callbacks WHERE status = 'pending' ORDER BY created_at"
).fetchall()
for cb in pending:
# 사람 상담사 + AI 1차 안내 둘 다 가능
# AI 가 먼저 callback 해서 용건 확인
client.calls.create(
to=cb['phone'], from_=number.number,
agent_id=CALLBACK_AGENT_ID, # 콘솔에서 만든 콜백 안내 에이전트
call_context={ # 이번 통화에만 적용되는 지시
"instruction": f"""
어젯밤 {cb['name']} 님이 남긴 메모: "{cb['reason']}"
지금 callback 드린 것입니다. 다음 흐름으로 진행하세요.
1. "어젯밤 메모 주셔서 callback 드렸습니다. 지금 통화 가능하실까요?"
2. 가능하면 → 용건 자세히 듣고 답변 가능 범위 답변. 복잡하면 담당자 연결 약속.
3. 불가능하면 → 다시 편한 시간 받고 통화 종료.
""",
"variables": {"callbackId": cb['id'], "name": cb['name']},
},
)
db.execute("UPDATE callbacks SET status = 'called' WHERE id = ?", (cb['id'],))
5. 통화 예시 (야간)
손님: "여보세요?"
AI: "안녕하세요, OOO 회사입니다. 지금은 영업시간 외라 AI 가 우선 메모받겠습니다.
용건 짧게 말씀해주시면 영업 첫 시간에 직접 연락드릴게요."
손님: "내일 아침에 예약 변경하려고요. 김OOO, 010-1234-5678 입니다.
원래 11시 예약을 14시로 옮기고 싶어요."
AI: "김OOO 님, 11시→14시 예약 변경 요청 메모해드렸어요.
내일 09시부터 담당자가 순서대로 연락드릴 거예요. 감사합니다."
[hang_up]
다음날 09시: callback 큐 자동 실행, 사람 직원이 받음.
6. 비용 / 효과
- ClawOps Individual ₩19,000/월
- 영업외 시간 응답률 100% → 신규 예약/문의 손실 0
- 다음날 callback 자동화로 직원 부담 ↓