정비소를 위한 AI 전화 접수원 만들기 (RAG + Voice Agent 실전 구현)
I built an AI receptionist for a mechanic shop
TL;DR Highlight
RAG 파이프라인과 Vapi 음성 플랫폼을 조합한 AI 접수원이 자동차 정비소의 전화 미응답으로 인한 매달 수천 달러 손실을 제거했다.
Who Should Read
소규모 비즈니스용 AI 음성 에이전트나 전화 자동화 시스템을 만들어보려는 개발자, 또는 RAG 파이프라인을 실제 프로덕션 수준의 앱에 연결하는 흐름을 처음 배우고 싶은 백엔드 개발자.
Core Mechanics
- 문제의 출발점은 단순했다. 형이 하루 종일 차 밑에서 작업하느라 전화를 못 받고, 고객은 그냥 끊고 다른 곳에 전화한다. 브레이크 교체 $450짜리, 엔진 수리 $2,000짜리 일감이 그냥 날아가는 상황이었다.
- 날것의 LLM을 그대로 쓰면 위험하다. 고객이 '브레이크 얼마예요?'라고 물었을 때 실제 가격은 $450인데 모델이 $200로 추측해서 답하면 고객 신뢰가 깨진다. 이 문제를 막기 위해 RAG(Retrieval-Augmented Generation, 실제 지식 문서를 검색해서 답변하는 방식)를 도입했다.
- 지식 베이스 구축은 형의 웹사이트를 스크래핑해서 마크다운 파일로 만드는 것부터 시작했다. 서비스 종류, 가격, 소요 시간, 영업시간, 결제 방법, 취소 정책, 보증 정보, 대차 차량 여부, 취급 차종 등 21개 이상의 문서로 정리했다.
- 각 문서는 Voyage AI의 voyage-3-large 모델로 1024차원 벡터로 변환해 MongoDB Atlas에 저장했다. Atlas Vector Search 인덱스를 걸어두면, 고객 질문도 같은 모델로 벡터화한 뒤 의미적으로 가장 유사한 문서 상위 3개를 가져온다. '브레이크 작업 얼마야?'처럼 정확히 같은 단어가 없어도 관련 문서를 찾아낸다.
- 검색된 문서 3개를 컨텍스트로 Anthropic Claude(claude-sonnet-4-6)에게 넘기고, 시스템 프롬프트로 '지식 베이스에 있는 내용만 답하고, 모르면 모른다고 하고 콜백 정보를 받아라'고 제한을 걸었다. 파트 1 완료 시점에서 터미널에 질문하면 정확한 답이 나왔다. 예: '오일 교환 얼마예요?' → '일반 오일 $45, 합성 오일 $75입니다. 오일 필터 교체, 오일 보충, 타이어 공기압 점검 포함이며 약 30분 소요됩니다.'
- 음성 인프라는 Vapi를 선택했다. Vapi 하나로 전화번호 구매, 음성 인식(Deepgram), 텍스트 음성 변환(ElevenLabs), 실시간 함수 호출까지 전부 처리된다. 개발자는 Vapi가 호출할 웹훅 서버만 만들면 된다.
- 서버는 FastAPI로 구현했다. 고객이 질문하면 Vapi가 /webhook 엔드포인트에 tool-calls 요청을 보내고, 서버는 RAG 파이프라인으로 답을 뽑아서 반환하면 Vapi가 음성으로 읽어준다. 개발 중에는 Ngrok으로 로컬 포트 8000을 외부에 노출해서 Vapi와 연결했다.
- Vapi 어시스턴트 설정에서 인사말('안녕하세요, Dane's Motorsport입니다, 무엇을 도와드릴까요?')과 두 가지 툴(answerQuestion: RAG 기반 답변, saveCallback: 이름과 연락처 수집)을 연결해서 정보를 모를 때는 콜백 메시지를 남길 수 있게 했다.
Evidence
- 전직 서비스 어드바이저 출신 댓글러가 실용성에 심각한 문제를 제기했다. 부품 가격은 실시간으로 변하고 재고도 매일 다르기 때문에 정확한 견적을 미리 답하는 건 불가능에 가깝다는 것. 일부 주에서는 부정확한 견적이 법적 문제로 이어질 수도 있다고 했다. 이 시스템이 유용한 영역은 '차 수리가 완료됐으니 픽업하세요' 같은 단방향 알림 정도라는 의견이었다.
- RAG가 꼭 필요한 게 맞냐는 의문도 나왔다. 가격표, 영업시간 같은 정보는 양이 적어서 요즘 LLM 컨텍스트 윈도우에 전부 다 넣어도 충분한데 굳이 벡터 검색을 쓸 필요가 있냐는 지적이었다. 서비스 매뉴얼 전체를 넣는 게 아니니까 RAG 오버헤드가 불필요할 수 있다는 주장이다.
- 아웃소싱 리셉션 서비스를 쓰는 게 더 현실적이지 않냐는 댓글도 있었다. 월 $500짜리 외부 전화 응대 서비스를 쓰면 됐을 텐데, AI 시스템을 직접 구축·유지하는 비용과 비교했을 때 ROI가 어떻게 될지 따져봐야 한다는 의견이었다.
- AI 전화 응대에 대한 사용자 반응은 엇갈렸다. 민트 모바일 AI 상담원이 대기 없이 1분 안에 문제를 해결해줬다는 긍정 경험이 있는 반면, 지역 에어컨 업체 AI 응대가 '언캐니 밸리' 느낌을 줘서 불신이 생겨 사람을 찾아 헤맸다는 부정 경험도 공유됐다. 로봇이라는 걸 알면 그냥 끊어버리겠다는 댓글도 여럿 있었다.
- 부정적인 댓글이 쏟아지는 상황에서 '이 특정 사례에 쓸 만하냐'가 핵심이 아니라 '여기서 배운 기술을 내 프로젝트에 어떻게 쓸 수 있냐'가 더 중요하다는 옹호 댓글도 있었다. TTS를 위한 텍스트 포맷팅 처리 같은 실질적인 팁을 얻었다는 반응도 있었다. 한편 실제로 해당 번호에 전화해봤더니 챗봇이 아직 배포도 안 됐다며 'HN에서 본 최악의 테크 데모'라는 혹평도 있었다.
How to Apply
- 소규모 자영업자(식당, 정비소, 미용실 등) 대상 AI 전화 에이전트를 만들려는 경우, 이 글의 스택(Vapi + FastAPI + MongoDB Atlas Vector Search + Voyage AI 임베딩 + Claude)을 그대로 참고해 빠르게 프로토타입을 만들 수 있다. 단, 댓글에서 지적된 것처럼 가격이 동적으로 변하는 서비스라면 실시간 가격 조회 API 연동을 별도로 고려해야 한다.
- RAG 파이프라인을 음성 인터페이스에 연결하려고 할 때, Vapi의 tool-calls 웹훅 방식은 기존 HTTP 서버를 그대로 재사용할 수 있어서 진입 장벽이 낮다. 로컬 개발 단계에서는 Ngrok으로 즉시 외부 노출이 가능하므로, Vapi 대시보드에 ngrok URL을 붙여넣는 것만으로 실제 전화 테스트가 가능하다.
- 지식 베이스 양이 적고(수십 개 문서 이하) 내용이 자주 바뀌지 않는다면, 이 글처럼 RAG를 구현하는 대신 전체 내용을 시스템 프롬프트에 직접 넣는 방식도 검토할 것. 벡터 DB 설정과 임베딩 비용을 아낄 수 있고 오히려 레이턴시도 줄어들 수 있다.
- AI가 모르는 질문에 대응하는 fallback 설계는 필수다. 이 글에서는 saveCallback 툴로 이름과 연락처를 수집하는 방식을 썼는데, 음성 에이전트에서 '모르면 그냥 죄송하다고만 하는' 것보다 훨씬 실용적이다. 유사한 프로젝트라면 이 패턴을 복사해서 쓸 수 있다.
Terminology
관련 논문
Airbyte Agents – 여러 데이터 소스를 아우르는 Agent용 Context Layer
Airbyte가 Slack, Salesforce, Linear 등 여러 SaaS 시스템의 데이터를 미리 인덱싱해서 Agent가 API를 일일이 뒤지지 않아도 되는 Context Store를 출시했다. 기존 MCP 방식보다 토큰을 최대 90%까지 줄이는 효과를 확인했다.
Polynomial Autoencoder가 Transformer Embedding에서 PCA를 능가하는 방법
PCA 인코더에 2차 다항식 디코더를 붙여서 닫힌 형태(closed-form)로 embedding 압축 품질을 크게 개선하는 기법으로, SGD 없이 numpy만으로 구현 가능하다.
비정형 Recall에서 Schema 기반 Memory로: 반복적 Schema-Aware Extraction을 통한 신뢰할 수 있는 AI Memory
RAG 스타일 텍스트 검색 대신 Schema로 정의된 구조화 레코드에 메모리를 저장하면, 정확한 사실 조회·상태 추적·집계 쿼리에서 압도적으로 높은 정확도를 얻을 수 있다.
Atomic – Local-first, AI 기반 개인 지식 그래프 앱
노트, 웹 클립, RSS 피드를 자동으로 임베딩·태깅·연결해주는 오픈소스 개인 지식 그래프 앱으로, 시맨틱 검색과 LLM 기반 위키 합성, MCP 통합까지 지원한다.
RAG 대신 Virtual Filesystem으로 AI 문서 어시스턴트 만든 이야기
Mintlify의 ChromaFs(Chroma DB 위의 UNIX 명령어 흉내 가상 파일시스템)가 RAG 청킹 한계를 극복해 세션 부팅 시간을 46초에서 100ms로 단축한다.
Chroma Context-1: Self-Editing 기능을 갖춘 검색 에이전트 학습 방법
Chroma의 20B 파라미터 agentic search 모델이 프론티어급 LLM 수준의 검색 성능을 1/10의 비용과 10배 빠른 속도로 달성한다.