사용자를 조작하지 않는 AI 구독 취소/유지 에이전트 구축하기
요약
본 글은 사용자를 조작하는 다크 패턴을 피하고, 고객의 구독 취소 및 유지 요청을 처리하는 에이전트 구축 방법을 제시합니다. 이 에이전트는 AI 추론으로 사유와 감성을 분류하고, 관련성 높은 단 하나의 유지 옵션을 제공하며, 직접적인 취소 요청은 즉시 존중하여 안전하게 흐름을 종료시키는 것이 핵심입니다.
핵심 포인트
- AI Inference로 고객의 취소 사유 및 감성을 구조화된 JSON으로 분류합니다.
- 직접적 취소/긴급 문구는 어떤 제안보다 우선하는 하드코딩 오버라이드를 적용합니다.
- 모호한 답변에 대한 루프를 방지하기 위해 명확화 프롬프트는 단 한 번만 제공됩니다.
- 멱등성 웹훅 처리와 통화 종료 추적 등 실제 운영 환경을 고려한 설계가 포함되어 있습니다.
구독 취소(Cancel-save) 흐름은 과도하게 엔지니어링되어 사용자를 조종하는 다크 패턴(dark patterns)으로 만들거나, 혹은 수익을 잃게 만드는 '구독이 취소되었습니다. 안녕히 계세요' 같은 경험으로 너무 단순화되기 쉽습니다. 좋은 취소/유지 에이전트는 세 가지를 수행합니다: 사유를 분류하고, 관련성 높은 유지 옵션 하나를 제공하며, 직접적인 취소 요청을 존중하는 것입니다.
Telnyx의 코드 예시는 다음과 같습니다:
이것은 Telnyx Voice, AI Inference, 그리고 Messaging을 결합한 Python Flask 앱으로, 몇 분 안에 클론하여 실행할 수 있는 작은 데모입니다.
흐름 (The Flow)
고객이 전화해서 취소하고 싶다고 말합니다. Flask 앱은 웹훅(webhook)을 받고, 발신자 ID로 고객을 인증하며, 왜 취소하고 싶은지 묻습니다. AI Inference는 사유(too_expensive, not_using, missing_feature, support_issue, competitor_switch, temporary_pause, other)와 감성(sentiment)을 반환합니다. 하드코딩된 긴급 문구(lawyer, sue, fraud, chargeback)와 직접적인 취소 문구(cancel now, please cancel my subscription)는 어떤 제안보다 먼저 작동하여 흐름을 종료시킵니다 (short-circuit).
그 외의 경우, 에이전트는 OFFER_POLICY 매핑에서 유지 옵션 하나를 제공합니다. '예(yes)'라고 답하면 유지를 적용하거나 구독을 일시 중지합니다. '아니오(no)' 또는 '취소(cancel)'는 우아하게 취소를 진행하며 통화를 종료합니다. 애매모호한 예/아니오 답변에는 정확히 한 번의 명확화 프롬프트만 제공되며, 에이전트는 절대 루프에 빠지지 않습니다.
케이스는 결과(saved, cancelled, paused, transferred, needs_followup)와 함께 기록되고, 고객 레코드가 업데이트됩니다. 해결되기 전에 끊어진 통화(Hangups)는 담당자가 다시 전화할 수 있도록 needs_followup으로 기록됩니다.
이 예시가 좋은 이유 (Why I Like This Example)
실시간 데모를 할 만큼 작지만, 'Hello World' 음성 AI 데모에서 자주 생략되는 부분들(the parts that often get cut)을 모두 다루고 있습니다:
- 구조화된 JSON을 반환하는 단일 프롬프트 AI 추론 분류
- 이유를 하나의 제안과 하나의 기본 결과로 매핑하는 오퍼 정책
- 에이전트가 안전성을 확보하기 위해 LLM에 의존하지 않도록 긴급 문구나 직접 취소에 대한 하드코딩된 재정의(overrides)
- 대화가 루프되는 것을 방지하기 위한 모호한 예/아니오 질문에 대한 한 번의 명확화 프롬프트
- 재시도 시 사례가 중복 로깅되지 않도록 하는멱등성 웹훅 처리(Idempotent webhook handling)
- 열려 있는 케이스가 사라지지 않도록 하는 통화 종료 추적(Hangup tracking)
제가 가장 중요하게 생각하는 설계 선택은 비조작성(non-manipulation)입니다. 에이전트는 직접적인 취소에 반대하지 않으며, 고객이 하나의 옵션에 열려 있을 때 다섯 개가 아닌 단 하나의 유지 옵션을 제공합니다. 이는 실제로 훌륭한 고객 성공 팀들이 작동하는 방식과 일치합니다.
로컬에서 실행하기
git clone https://github.com/team-telnyx/telnyx-code-examples.git
cd telnyx-code-examples/ai-subscription-cancel-save-retention-agent-python
cp .env.example .env
...
웹훅 노출하기:
grok http 5000
Telnyx Portal에서 음성 API 앱 웹훅 URL을 https://<ngrok-id>.ngrok-free.app/webhooks/voice로 설정합니다. POST /customers를 사용하여 고객을 생성한 다음, 해당 고객의 전화번호로 Telnyx 번호를 호출합니다.
시연할 내용
저는 시연을 짧게 유지하고 세 가지 흐름(flow)을 연속적으로 보여줄 것입니다:
- 고객이
데모는 인메모리(in-memory) 상태를 사용하며, 이는 학습용으로는 괜찮습니다. 실제 운영 환경에서는 고객 및 케이스 저장소(customer and case stores)를 귀사의 결제 시스템(Stripe, Recurly, Chargebee)에 연결하여, saved 결과가 실제로 할인을 적용하고 paused 결과가 다음 청구서를 연기하도록 구현해야 합니다. 규정 준수 감사(compliance audits)를 위해 동의 기록(consent recording)(record_channels: "dual")을 추가하고, 발신자 ID 일치(caller-ID match)는 실제 검증을 위해 일회용 코드 흐름(one-time code flow)으로 대체해야 합니다.
자료 (Resources)
- 코드 예시: [https://github.com/team-telnyx/telnyx-code-examples/tree/main/ai-subscription-cancel-save-retention-agent-python]
- Telnyx Voice 문서: [https://developers.telnyx.com/docs/voice/call-control]
- Telnyx AI 추론(Inference) 문서: [https://developers.telnyx.com/docs/inference]
- Telnyx 메시징(Messaging) 문서: [https://developers.telnyx.com/docs/messaging]
- Telnyx 포털: [https://portal.telnyx.com]
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기