为豪华汽车修理店构建 AI 接待员一、概述1. 简介A. 是什么这是一个为豪华汽车修理店定制的 AI 语音接待员系统，名为 Axle。它能够接听电话、回答价格和服务相关问题、记录回访请求，帮助店主挽回因漏接电话造成的业务损失。B. 为什么学展示 RAG（检索增强生成）在实际业务中的应用演示如何将 LLM 与语音通信集成了解 AI Agent 的完整开发流程学习向量搜索和知识库构建的最佳实践C. 学完能做什么使用 MongoDB Atlas 构建向量知识库集成 Vapi 实现语音 AI 代理使用 Claude 构建基于知识库的问答系统设计企业级 AI 应用的升级路径二、项目背景1. 业务问题Dane 经营一家豪华汽车修理店，每天因在车底下工作而漏接数百个电话。每个未接电话都意味着潜在的收入损失：从 45 美元的刹车服务到 2000 美元的发动机维修。客户电话无人接听时，会转向其他服务商。2. 解决方案概述构建一个名为 Axle 的 AI 接待员，具备以下能力：24/7 接听电话准确回答价格和服务问题了解营业时间、政策等业务信息在无法回答时收集回访信息graph LR A[客户来电] --> B[Vapi 语音平台] B --> C[FastAPI Webhook] C --> D[MongoDB Atlas 向量搜索] D --> E[检索相关文档] E --> F[Anthropic Claude] F --> G[生成回复] G --> C C --> B B --> H[语音播放给客户]三、技术栈1. 核心组件组件用途说明Vapi语音平台电话号码、语音识别/合成、工具调用Deepgram语音转文字集成于 VapiElevenLabs文字转语音集成于 VapiFastAPI + UvicornWebhook 服务处理 Vapi 回调请求MongoDB Atlas数据存储知识库、向量搜索、通话记录Voyage AI文本嵌入voyage-3-large 模型Anthropic Claude响应生成claude-sonnet-4-6Ngrok隧道服务本地开发时暴露公网地址Copilot CLIAI 辅助开发代码生成工具2. 为什么选择这套技术栈Vapi：一站式语音解决方案，无需单独处理电信复杂性MongoDB Atlas：原生向量搜索，知识库和通话记录统一存储Voyage AI：高质量的语义嵌入，适合专业领域知识Claude：优秀的指令遵循能力，减少幻觉问题四、实施步骤1. 步骤一：构建大脑（RAG 管道）A. 知识库准备抓取修理店网站数据，提取以下信息：服务类型和定价（21+ 份文档）营业时间支付方式取消政策质保信息代步车服务擅长的汽车品牌B. 向量化存储使用 Voyage AI 将每个文档转换为 1024 维向量：# 示例：文档向量化 import voyageai voyage_client = voyageai.Client(api_key="your_key") document = "刹车服务：450美元，包含前后刹车片更换..." embedding = voyage_client.embed( [document], model="voyage-3-large" )C. 检索流程graph TD A[用户提问] --> B[使用 Voyage AI 嵌入查询] B --> C[MongoDB Atlas 向量搜索] C --> D[返回前3个最相关文档] D --> E[传递给 Claude + 严格系统提示] E --> F{是否包含答案?} F -->|是| G[生成简洁对话回复] F -->|否| H[请求回访信息] G --> I[返回答案] H --> J[保存到 callbacks 集合]D. 系统提示设计关键原则：仅从知识库回答保持简短对话风格不知道时明确说明禁止幻觉五、步骤二：连接真实电话号码1. FastAPI Webhook 服务器from fastapi import FastAPI, Request from pymongo import MongoClient app = FastAPI() @app.post("/webhook") async def handle_call(request: Request): data = await request.json() # 提取用户查询 query = data.get("message", "") # 调用 RAG 管道 response = rag_pipeline(query) # 记录到 MongoDB client = MongoClient("mongodb+srv://...") db = client["mechanic_shop"] db["calls"].insert_one({ "caller_number": data.get("caller_number"), "query": query, "response": response, "timestamp": datetime.now() }) return {"response": response}2. Ngrok 隧道配置开发阶段使用 Ngrok 暴露本地服务：# 启动 Ngrok ngrok http 8000 # 将生成的 URL 配置到 Vapi Dashboard # https://abc123.ngrok.io/webhook3. Vapi 助手配置在 Vapi Dashboard 中设置：欢迎语："Hi, thanks for calling Dane's Motorsport, how can I help you today?"工具函数：answerQuestion：RAG 支持的问答saveCallback：收集回访信息Webhook URL：指向 FastAPI 服务器4. 对话记忆管理Vapi 在每次请求中发送完整对话历史，RAG 管道可以获取前文作为上下文：def rag_pipeline(query, conversation_history=[]): # 构建带历史记录的查询 context = "\n".join([f"Q: {h['query']}\nA: {h['response']}" for h in conversation_history]) # 结合历史和当前查询进行检索 enhanced_query = f"{context}\nCurrent question: {query}" # ... 执行检索和生成六、步骤三：语音优化1. 选择合适的声音作者测试了约 20 种 AI 声音，最终选择 Christopher：平静自然语速适中符合汽车修理店的专业氛围声音选择的重要性超预期：错误的语音会让完美的 AI 回复感觉不对。2. 语音专用系统提示文本回复和语音回复截然不同。针对语音优化：文本风格语音风格"Great question!"避免"$45.00""forty-five dollars"项目符号列表完整句子markdown 格式纯文本详细说明2-4 句话上限优化后的提示词示例：你是一家豪华汽车修理店的接待员。回答时： - 使用短句 - 语气友好专业 - 价格用完整单词表达 - 最多 2-4 句话 - 不知道时请求回访信息3. 升级流程设计当问题超出知识库范围时：明确告知客户不知道答案询问客户姓名和回访电话保存到 callbacks 集合店主可以批量跟进def handle_unknown_query(query, caller_info): # 保存回访请求 db["callbacks"].insert_one({ "caller_number": caller_info.get("number"), "name": caller_info.get("name"), "question": query, "timestamp": datetime.now(), "status": "pending" }) return "我不太确定这个问题的答案。方便留下您的姓名和电话吗？店主会尽快回电。"七、数据价值1. 通话日志记录每次交互存储到 calls 集合：来电号码查询内容AI 回复是否转人工时间戳2. 业务洞察店主可以分析：客户最常问的问题来电高峰时段AI 转人工的频率回访转化率这使电话系统成为数据资产，指导业务改进。八、测试策略1. 集成测试覆盖测试套件包含：RAG 管道测试Webhook 处理器测试端到端流程测试2. 边缘案例处理场景处理方式Vapi 发送格式错误的请求优雅降级或返回错误向量搜索无高置信度结果触发升级流程客户未留下回访电话请求提供或礼貌结束知识库信息过时定期更新机制九、未来计划1. 即将推出的功能日历集成：通话中直接预约短信通知：新回访请求即时通知管理仪表板：统一管理待回访列表安全加固：生产环境安全配置Railway 部署：持久化公网 URL2. 业务影响预期每周漏接电话：100+每个未接电话潜在价值：50-2000 美元系统优势：24/7 运行，永不占线，熟悉所有价格和政策十、核心经验1. 关键洞察不要将原始 LLM 用于特定业务的语音代理。原因：可能产生错误的价格信息破坏客户期望导致客户流失2. 最佳实践基于真实知识库：所有回答必须基于可验证的信息约束回答范围：仅从知识库回答优先设计升级路径：这不是边缘案例，是核心功能重视语音体验：声音和表达方式与内容同样重要持续监控和改进：通过通话日志优化系统3. 开发时间项目分三个冲刺阶段完成：第一阶段：RAG 管道第二阶段：电话集成第三阶段：语音优化最困难的部分不是代码，而是让语音听起来像是在汽车修理店工作的人，而不是硅谷创业公司的聊天机器人。参考资料How I Built an AI Receptionist for a Luxury Mechanic Shop - Part 1