사람을 동일한 통화에 참여시킬 수 있는 음성 AI 어시스턴트를 구축했습니다
요약
Telnyx를 활용하여 AI 어시스턴트가 대화 도중 인간 전문가를 동일한 통화에 참여시킬 수 있는 다자간 음성 AI 워크플로우 구축 방법을 소개합니다. AI가 대화 맥락을 유지하며 전문가에게 인수인계하는 기술적 구현 방식을 다룹니다.
핵심 포인트
- AI 어시스턴트가 대화 중 전문가를 호출하여 다자간 통화로 전환 가능
- Node.js와 Express를 이용한 백엔드 도구(Backend Tool) 구현 방식 제시
- AI가 대화 맥락을 유지하며 전문가에게 상황을 요약 전달하는 인수인계 구현
- Telnyx 웹훅과 API를 활용한 실시간 통화 제어 및 브리지 기술
대부분의 음성 AI 데모는 어시스턴트 단계에서 멈춥니다. 발신자가 AI와 대화하고, AI가 응답하며, 어쩌면 티켓(ticket)을 생성한 뒤 통화가 종료되는 식입니다.
하지만 많은 실제 워크플로우(workflows)에는 인간의 개입(human in the loop)이 필요합니다. 지원 어시스턴트는 통합 엔지니어(integrations engineer)가 필요할 수 있습니다. 의료 어시스턴트는 케어 팀 구성원이 필요할 수 있습니다. 금융 서비스 어시스턴트는 자격증을 갖춘 상담사가 필요할 수 있습니다. 영업 어시스턴트는 적절한 어카운트 이그제큐티브(account executive)가 필요할 수 있습니다.
흥미로운 점은 발신자가 전화를 끊거나, 다른 번호로 전화를 걸거나, 다른 사람에게 동일한 맥락을 반복하지 않도록 하면서 이 과정을 수행하는 것입니다.
Telnyx 코드 예제는 여기에 있습니다:
이 예제는 Telnyx AI 어시스턴트가 동일한 라이브 AI 대화에 다른 참여자를 추가할 수 있도록 하는 Node.js + Express 백엔드를 보여줍니다.
흐름 (The Flow)
발신자가 Telnyx 번호로 전화를 겁니다. Telnyx는 앱에 call.initiated 웹훅(webhook)을 보냅니다. 앱은 인라인 AI 어시스턴트 설정과 함께 전화를 받습니다.
어시스턴트는 몇 가지 도구(tools)를 가지고 있습니다:
classify_issue(이슈 분류)record_specialist_consent(전문가 동의 기록)dial_specialist(전문가 호출)
앞의 두 가지는 어시스턴트가 즉시 누군가에게 전화를 걸지 않도록 하기 위해 존재합니다. 어시스턴트는 이슈를 이해하고 다른 참여자를 추가하기 전에 허가를 구해야 합니다.
세 번째 도구는 백엔드로 연결되는 브리지(bridge)입니다. 어시스턴트가 dial_specialist를 호출하면, 백엔드는 POST /v2/calls를 통해 두 번째 통화 레그(call leg)를 생성합니다.
그 후, 전문가가 전화를 받으면 Telnyx는 해당 두 번째 레그에 대해 call.answered 웹훅을 보냅니다. 그 시점에 백엔드는 ai_assistant_join을 호출하며 두 가지 중요한 값을 전달합니다:
- 기존 AI의
conversation_id(대화 ID) - 전문가의
call_control_id(통화 제어 ID)
그 순간 통화가 다자간 참여(multiparticipant) 상태가 됩니다.
내가 주목하는 부분
AI는 단순히 발신자를 전환하는 것이 아닙니다. AI는 통화를 조정(coordinating)하고 있습니다.
발신자는 원래의 대화에 그대로 머물러 있습니다. 어시스턴트는 이미 문제의 맥락 (context)을 파악하고 있습니다. 전문가가 참여할 때, 어시스턴트는 현재 상황을 요약한 뒤, 명확한 설명이 필요하거나, 티켓 (ticket)을 생성하거나, 피드백 루프 (close the loop)를 종료해야 하는 경우가 아니라면 개입을 멈추고 물러날 수 있습니다.
덕분에 사용자 경험은 실제 지원 업무의 인수인계 (handoff)와 매우 유사하게 느껴집니다:
발신자: 웹훅 (webhook) 전달 실패가 발생하고 있습니다
AI: 이 통화에 통합 (integrations) 전문가를 바로 연결해 드릴 수 있습니다. 괜찮으신가요?
발신자: 네
...
포털 설정만 사용하는 대신 백엔드 도구 (Backend Tool)를 사용하는 이유
Telnyx Portal은 어시스턴트 도구 (assistant tools)를 지원하며, 문서에는 다중 참여자 통화 (multi-participant calls)에 대한 내용이 포함되어 있습니다. 이 예제는 백엔드 주도 방식 (backend-driven version)에 집중하는데, 그 이유는 개발자들이 다음과 같은 요소들을 제어해야 하는 경우가 많기 때문입니다:
- 어떤 참여자에게 전화를 걸지
- 동의 (consent)가 언제 기록되었는지
- 두 번째 통화 레그 (call leg)가 어떻게 추적되는지
- 어떤 메타데이터 (metadata)가 저장되는지
- 참여자가 응답하지 않을 경우 어떻게 처리할지
- 인수인계 (handoff)가 어떻게 감사 (audited)되는지
백엔드 도구는 이러한 로직을 명시적으로 만들어 줍니다.
로컬에서 실행하기
git clone https://github.com/team-telnyx/telnyx-code-examples.git
cd telnyx-code-examples/ai-assistant-multiparticipant-calling-nodejs
cp .env.example .env
...
외부로 노출하기:
ngrok http 8787
사용자의 Programmable Voice / Voice API 애플리케이션 웹훅 (webhook)을 다음으로 지정하세요:
그 다음, Telnyx 번호로 전화를 걸어 전문가가 필요한 지원 케이스 (support case)를 요청하세요.
코드에서 주목할 부분
메인 파일은 server.js입니다.
어시스턴트 지침 (instructions)과 도구 정의 (tool definitions)가 인라인 (inline)으로 작성되어 있어, 미리 구축된 Portal 어시스턴트를 복사할 필요 없이 폴더 내의 내용만으로 데모를 재현할 수 있습니다. dial_specialist 엔드포인트 (endpoint)가 도구 호출 (tool call)을 처리합니다. call.answered 핸들러 (handler)는 전문가를 대화에 참여시킵니다.
핵심 호출은 다음과 같습니다:
await fetch(`https://api.telnyx.com/v2/calls/${id}/actions/ai_assistant_join`, {
method: "POST",
headers: telnyxHeaders(),
...
이것이 바로 인수인계 (handoff)입니다.
프로덕션 참고 사항 (Production Notes)
코드 샘플은 실행하기 쉽게 만들기 위해 상태(state)를 메모리에 유지합니다. 프로덕션(Production) 환경에서는 세션 상태(session state)를 Redis 또는 Postgres에 저장하고, 웹훅 서명(webhook signatures)을 검증하며, 외부 발신(outbound dialing) 시 재시도(retries) 로직을 추가하고, 동의(consent) 여부를 로그로 남기며, 사람들이 서로 직접 대화할 때를 위한 어시스턴트 동작(assistant behavior)을 추가해야 합니다.
패턴은 여전히 동일합니다:
AI가 입구(front door)를 관리합니다
AI가 백엔드 도구(backend tool)를 호출합니다
백엔드가 다음 참여자에게 전화를 겁니다
...
리소스 (Resources)
- 코드 예제: https://github.com/team-telnyx/telnyx-code-examples/tree/main/ai-assistant-multiparticipant-calling-nodejs
- 다중 참여 통화(Multi-participant calls) 문서: https://developers.telnyx.com/docs/inference/ai-assistants/multi-participant-calls
- AI 어시스턴트 대화 참여(Join AI Assistant Conversation) API: https://developers.telnyx.com/api-reference/call-commands/join-ai-assistant-conversation
- Telnyx 개발자 문서: https://developers.telnyx.com
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기