AI 接线员是如何工作的:拆解 AI 电话代理背后的架构
AI 接线员从外面听起来很简单:来电者说话,系统应答,对话一直持续到来电者得到答案或转接到真人。
但这段对话背后,是一条由电话基础设施、语音识别、语言模型、应用逻辑、API、数据库和呼叫路由组成的完整流水线。
有意思的不只是 AI 模型本身,而是这些组件如何协同工作,把音频流转化为实际的业务操作。
想要这些能力的企业有两条路可走。
一是购买现成的产品。目前市面上已有专门的 AI 接线员,比如 Nextiva 的 XBert,以及 Goodcall、Dialzara 等其他工具。
二是自己搭建,这也是本文要带你了解的内容。无论走哪条路,理解这套架构都有帮助:它能让你看清商业产品背后的运作原理,也知道自建系统需要组装哪些部件。
典型的架构大致如下:
在本文中,我们会拆解 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 上与我交流。