← 文章 / AI技术
freeCodeCamp 5小时前 · 2026-09-09 00:54:59 · 3 阅读

AI 接线员是如何工作的:拆解 AI 电话代理背后的架构

AI 接线员从外面听起来很简单:来电者说话,系统应答,对话一直持续到来电者得到答案或转接到真人。

但这段对话背后,是一条由电话基础设施、语音识别、语言模型、应用逻辑、API、数据库和呼叫路由组成的完整流水线。

有意思的不只是 AI 模型本身,而是这些组件如何协同工作,把音频流转化为实际的业务操作。

想要这些能力的企业有两条路可走。

一是购买现成的产品。目前市面上已有专门的 AI 接线员,比如 Nextiva 的 XBert,以及 GoodcallDialzara 等其他工具。

二是自己搭建,这也是本文要带你了解的内容。无论走哪条路,理解这套架构都有帮助:它能让你看清商业产品背后的运作原理,也知道自建系统需要组装哪些部件。

典型的架构大致如下:

AI Receptionist architecture

在本文中,我们会拆解 AI 电话代理背后的架构——从来电者拨打企业号码的那一刻,一直讲到通话结束后的处理流程。

你会看到电话系统如何接通呼叫,语音如何变成文字,AI 如何识别意图并维持对话上下文,以及函数调用如何把代理连接到日历、CRM 等业务系统。我们还会讨论代理如何判断何时把电话转给真人,以及转接时能传递哪些信息。

本文将涵盖:

电话进入系统

流程的起点和日常通话一样:客户拨打企业号码,电信运营商接收来电。

运营商随后需要将来电路由到能够处理它的应用程序。

一种常见方式是 webhook。来电到达时,通信服务商向应用发送 HTTP 请求,应用返回指令来描述如何处置这通电话。

通话本身需要运营商级连通。生产环境通常使用 SIP trunking,通过互联网将语音应用或电话系统接入公共电话网络。

Nextiva、Twilio、Bandwidth 等服务商提供 SIP trunking 服务,为 AI 语音系统提供号码和通话容量。之后,应用层接管后续流程。

Twilio 为例,来电到达时会向已配置的应用发送 HTTP 请求,应用用 TwiML 指令响应并控制通话行为。

一个简化的 Node.js 端点大致如下:

app.post("/incoming-call", (req, res) => {
  const response = new VoiceResponse();

  response.say("Hello. How can I help you today?");

  res.type("text/xml");
  res.send(response.toString());
});

这个示例还没有涉及任何 AI,只是展示了第一层架构边界。

电话网络负责承载通话,应用接收事件并决定下一步。

从这里开始,应用需要处理主叫方的语音。

语音转文字

用户通过语音与系统交互,但大多数应用逻辑基于结构化数据和文本运行。

自动语音识别系统(ASR)负责将主叫方的语音转换为文本。

例如,主叫方可能会说:

"我需要把周五的预约改到周一下午。"

语音识别层可能输出:

{
  "text": "I need to move my appointment from Friday to Monday afternoon."
}

具体返回什么取决于语音识别系统。部分系统还能提供时间戳、置信度、说话人信息或逐句转写结果。

应用随即将识别出的文本传递给对话层。

这种分层设计很关键:AI 推理层无需处理原始电话音频,它接收文本、输出决策或回复。

系统判断来电者的意图

接下来的难点是理解意图。

假设三位来电者分别说:

"我想预约一次咨询。"

"我的预约能改到下周吗?"

"你们办公室在哪?"

系统需要识别出这些请求对应不同的工作流。

应用可以将识别出的意图表示为结构化数据:

{
  "intent": "reschedule_appointment",
  "entities": {
    "current_day": "Friday",
    "requested_day": "Monday",
    "time_preference": "afternoon"
  }
}

这个结构可以由语言模型直接生成,也可以由应用通过额外的分类层推导得出。

架构上的关键点在于:应用将自然语言转化为下游系统可处理的结构化信息。

模型可能理解来电者想改期,但仅凭它生成了这个解读,并不意味着它应该直接去修改日历。

接下来做什么,需要应用来掌控。

对话以循环方式运行

AI 电话代理通常不会在一次请求中处理完整个对话,而是以循环方式工作。

来电者说话,语音识别将音频转为文本,应用将文本及相关上下文发送给 AI 系统,AI 判断该说什么或该执行什么操作,应用生成语音并回传给来电者。

然后来电者再次说话。

简化流程如下:

while (callIsActive) {
  const audio = await receiveAudio();

  const text = await speechToText(audio);

  const result = await processConversation({
    text,
    context: conversationContext
  });

  conversationContext = result.updatedContext;

  const audioResponse = await textToSpeech(result.response);

  await sendAudio(audioResponse);
}

这只是概念性代码,不是完整的电话实现。真实的系统还需要处理流式音频、打断、超时、错误、鉴权以及各家服务商特定的协议。

上下文同样很关键。

如果来电者说:

"我想预约。"

系统可能会问:

"您要预约什么类型的服务?"

来电者接着说:

"初次咨询。"

这句话之所以能被理解,是因为应用记住了之前的对话内容。

会话状态可能包含如下信息:

{
  "intent": "book_appointment",
  "appointment_type": "initial_consultation",
  "customer_name": "Jane Smith",
  "preferred_date": null
}

随着对话推进,系统可以不断向这个状态中补充信息。

AI 对接业务系统

到了这一步,AI 接线员就不再只是一个语音聊天机器人了。

假设来电者问:

"明天下午有空位吗?"

仅凭对话内容,AI 无法可靠地回答这个问题,它需要从日历或排班系统中获取实时信息。

这时就轮到 function calling(也叫 tool calling)登场了。

应用可以向 AI 开放一组有限的函数:

const tools = [
  {
    name: "check_calendar",
    description: "Find available appointment slots",
    parameters: {
      date: "string",
      appointmentType: "string"
    }
  },
  {
    name: "book_appointment",
    description: "Book an available appointment",
    parameters: {
      slotId: "string",
      customerId: "string"
    }
  }
];

模型可以判断出自己需要调用 check_calendar

随后应用执行该函数:

const slots = await checkCalendar({
  date: "2026-08-21",
  appointmentType: "consultation"
});

执行结果会被放回对话上下文中:

{
  "available_slots": [
    "2026-08-21T14:00:00",
    "2026-08-21T15:30:00"
  ]
}

AI 随后会告知来电者有哪些可选时段。

关键的架构边界在于:AI 负责判断需要执行什么操作,而应用代码负责控制操作的具体执行方式。

这让开发者有明确的切入点来实施权限控制、校验输入、处理异常,以及管控对业务系统的访问。

预约日程

再看最后一步。

来电者从可选时段中挑选一个。

AI 可以发起预约请求:

{
  "tool": "book_appointment",
  "arguments": {
    "slotId": "slot_123",
    "customerId": "customer_456"
  }
}

应用会先校验这些参数,再调用日历系统。

例如:

async function bookAppointment(slotId, customerId) {
  const slot = await getAvailableSlot(slotId);

  if (!slot || slot.booked) {
    throw new Error("Appointment slot is no longer available");
  }

  return calendar.createEvent({
    customerId,
    start: slot.start,
    end: slot.end
  });
}

应用随后将实际执行结果返回给 AI。

这个区分很关键。

AI 不能仅仅因为自己决定调用 book_appointment,就告诉来电者预约已成功。

必须由日历系统确认操作成功。

日历 API 通常提供创建事件的接口。例如,Google Calendar 就提供了 events.insert 方法。

只有收到成功响应后,对话层才能告知来电者预约已确认。

采集销售线索

同一套架构也可以在销售对话中采集信息。

来电者可能会提供姓名、邮箱、公司、电话、服务需求以及期望的跟进时间。

对话过程中可以逐步填充一个结构化的线索对象:

{
  "name": "Jane Smith",
  "email": "jane@example.com",
  "company": "Example Corp",
  "interest": "enterprise consultation",
  "appointment_booked": true
}

应用随后可以将这些信息同步到 CRM。

这就区分了对话数据和业务数据。

通话记录反映的是来电者说了什么。

CRM 记录则是企业需要据此采取行动的结构化信息。

CRM 中可能包含来电者联系方式、咨询类型、资质数据、预约详情和跟进状态。

具体字段取决于企业的 CRM 和销售流程。

何时转接人工

并非所有对话都该由 AI 独自处理。

生产系统需要升级规则。

触发升级的情形包括:来电者要求转人工、请求超出智能体支持的流程范围、或业务方判定某类请求必须由人工介入。

应用可以显式地表达这一决策:

if (shouldEscalate(conversation)) {
  return transferToHuman({
    callerId,
    reason,
    conversationContext
  });
}

关键在于转接过程中传递了什么。

好的交接应当携带上下文,而不是让员工从零开始。

人工坐席可能收到:

{
  "caller": {
    "name": "Jane Smith",
    "phone": "+1-555-0100"
  },
  "reason": "Complex billing question",
  "summary": "Caller needs help resolving an invoice discrepancy.",
  "actionsCompleted": [
    "Customer identity verified"
  ]
}

具体的交接数据取决于系统实现。

电话平台还能通过语音 API 支持通话转接和回拨。例如,Twilio 的语音文档中描述了通话路由和 <Dial> 功能,可将通话转接至另一目标。

挂断之后

来电者挂断并不意味着对话就此结束。

根据系统和配置,应用可以保留通话记录及其他通话数据。

一条简化的通话记录可能长这样:

{
  "callId": "call_123",
  "duration": 342,
  "customerId": "customer_456",
  "intent": "book_appointment",
  "appointmentId": "appointment_789",
  "leadCaptured": true,
  "escalated": false
}

通话记录提供详细的对话内容,结构化字段则为下游应用提供可查询的信息。

因此,一通电话可以触发多个业务操作。

  • 销售电话可以创建线索。

  • 预约电话可以更新日历。

  • 客服电话可以创建工单。

  • 复杂的对话可以转接给人工处理。

电话系统还可以通过状态回调通知应用呼叫生命周期事件。例如,Twilio 会在通话结束时向号码的 StatusCallback URL 发送请求,并支持通过 statusCallbackEvent 属性订阅外呼线路的生命周期事件,如 initiated、ringing、answered 和 completed。

业务人员看到的是什么

从员工的角度看,所有这些基础设施都隐藏在几条业务记录背后。

员工可能只看到一个包含联系信息和来电原因的新 CRM 线索。

日历里可能多了一条新预约。

对话系统里保存着通话记录和摘要。

如果通话被转接,员工在接手客户之前就能拿到相关上下文。

这就是 AI 电话代理背后的核心架构思想。

语音界面只是一层外壳,底下是一整套系统:把语音转成文字、理解来电者的需求、维护对话状态、调用外部服务、校验业务操作,最后把结果返回给来电者。

语言模型负责对话推理,而周边应用提供状态、工具、权限、集成和业务规则,把对话变成真正的工作流。

希望这篇文章对你有帮助。欢迎在 LinkedIn 上与我交流

原始来源: freeCodeCamp

评论 (0)