call-center-ai

2025-11-26

ai

人生最大的错误是不断担心会犯错。——亨利·福特

Call Center AI:用 Azure + OpenAI GPT 打造“能打电话、能接电话、能落地业务数据”的 AI 呼叫中心

项目地址:https://github.com/microsoft/call-center-ai
项目描述:Send a phone call from AI agent, in an API call. Or, directly call the bot from the configured phone number!
许可证:Apache-2.0
技术栈关键词:Azure Communication Services、Azure Cognitive Services(STT/TTS/Translation)、Azure OpenAI(gpt-4.1 / gpt-4.1-nano / Embedding)、Azure Container Apps、Cosmos DB、AI Search、Event Grid、Redis、Application Insights

当“AI 助手”从网页走向现实电话线,才真正具备“服务”的温度。Call Center AI 是一个面向电话客服场景的开源 PoC(概念验证):它既支持“AI 主动外呼”,也支持“用户拨打电话接入”。语音实时转写、LLM 智能对话、多语言、多音色、RAG 检索增强、通话录音、工单/理赔(claim)数据落库、质量回放/报告……这些你能想到的功能,这个项目都把“怎么做”教给你了。

下面,我们从“能做什么—怎么运行—如何定制—如何优化—成本与上线”五个角度,带你快速吃透这个仓库。


能做什么:业务功能与工程特性一图速览

  • 入呼与出呼一体:开放 API 触发外呼;或直接拨打配置的电话号码与机器人对话
  • 多语言/多音色:自动理解用户语言,支持配置多语 TTS 声音;可接入自定义神经音色(CNV)
  • 两套 LLM 组合:gpt-4.1 与 gpt-4.1-nano;按场景平衡质量/成本/时延
  • 对话与数据双落地:
    • 结构化“claim/工单”字段(时间、设备、地点、联系方式等)写入数据库
    • 对话消息流、下一步动作(next)、提醒(reminders)、长短摘要(synthesis)等全量记录
  • 可观测与安全:
    • 特性开关(Feature Flags)热更新、人工兜底转接、通话录音(可选)
    • Application Insights 端到端遥测与 OpenLLMetry LLM 指标
  • 云原生部署:
    • Azure 上容器化、Serverless 弹性扩缩;事件驱动与消息中间件清晰解耦
    • RAG 能力基于 AI Search + Embedding(ADA,1536 维)

项目 README 明确:这是一个 PoC。它演示了 Azure Communication Services、Azure Cognitive Services、Azure OpenAI 的组合方式,并提供了“从零到线上/本地”的完整路径。


现场感:官方演示与数据存证

  • Demo(法语):https://youtube.com/watch?v=i_qhNdUUxSI
    演示了用户拨入、机器人应答、对话推进、数据写库(claim/todo/summary 等)
  • 呼叫结束“用户报告页”:/report/[phone_number]
    展示历史对话、提醒、理赔信息等,便于人工回看与复核

架构怎么搭:从“拨通”到“落库”的模块协作

高层视角(简化):

  • User ↔ Communication Services ↔ App(Call Center AI)↔ Agent(人工)
  • App 负责语音编解码/转写、LLM 推理、TTS 回传、数据落库、RAG 检索、事件编排

组件级视角(精要):

  • 语音与通话:Azure Communication Services(通话/短信网关)
  • 语音能力:Speech-to-Text、Text-to-Speech、Translation(认知服务)
  • LLM:gpt-4.1 / gpt-4.1-nano(Azure OpenAI)
  • 检索:AI Search + Embedding(ADA)
  • 存储与缓存:Cosmos DB(会话与 claim 数据)、Redis(Cache)、Azure Storage(声音/队列)
  • 事件流:Event Grid(Broker)+ Azure Queues(队列)
  • 运维:Application Insights(Trace、LLM 指标、业务自定义指标)

这一组合基本覆盖了“实时语音—智能对话—结构化业务数据—可观测”的全链路要素。


三分钟上手:API 外呼与本地调试

1) 让机器人“打电话”给用户(外呼 API)

README 提供了一个直接易用的 POST /call 示例:你可以在后端系统中按需触发外呼,并传入本次任务的“公司名、机器人名、被叫号码、任务目标、claim 字段 schema”等参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 请求机器人外呼某个号码
data='{
"bot_company": "Contoso",
"bot_name": "Amélie",
"phone_number": "+11234567890",
"task": "Help the customer with their digital workplace. Assistant is working for the IT support department. ...",
"agent_phone_number": "+33612345678",
"claim": [
{ "name": "hardware_info", "type": "text" },
{ "name": "first_seen", "type": "datetime" },
{ "name": "building_location", "type": "text" }
]
}'

curl \
--header 'Content-Type: application/json' \
--request POST \
--url https://xxx/call \
--data "$data"

你可以按调用场景,动态改变 task(本次通话目标)与 claim(业务字段)。机器人在通话中将主动采集这些信息并写入数据库。

2) 本地快速验证(免电话流量)

项目提供了一个“本地测试脚本”,你无需拨打电话就能驱动对话逻辑:

1
python3 -m tests.local

开发时:

1
2
3
4
5
6
# 一次性安装依赖
make install

# 启动本地服务(代码热加载)
make dev
# API 默认 http://localhost:8080

如果需要对接真实的入呼/外呼通道,本地也可以使用 Azure Dev Tunnels 暴露端口(独立终端常驻):

1
2
devtunnel login
make tunnel

上线也不难:Azure 快速部署

  • 建议用 GitHub Codespaces 快速启动(README 提供一键入口)
  • 基础工具:Azure CLI、yq、Make、bash/zsh 等;推荐 macOS 下 make brew 一键装齐
  • Azure 侧准备:
    1. 资源组(命名尽量简洁小写短横线)
    2. Azure Communication Services(开启系统身份)
    3. 电话号码(入/出呼、开启语音,短信可选)

部署(远程 Azure):

1
2
3
4
5
6
7
8
9
10
11
# 1) 登录
az login

# 2) 准备配置
# 将 config-remote-example.yaml 拷贝为项目根目录的 config.yaml 并填写

# 3) 一键部署(image_version 可指定固定镜像标签,避免未来破坏性更新)
make deploy name=my-rg-name

# 4) 查看日志
make logs name=my-rg-name

说明:项目提供了已构建的容器镜像(ghcr),支持按分支/标签拉取,便于版本固定与回滚。


怎么“调性格”:语言、提示词、Schema、特性开关全可配

该项目把“场景定制”作为一等公民——全部集中在配置层,避免你直接去改 Prompt 源码。

1) 多语言 + 多音色(TTS)

支持多语言理解与音色选择;如接入 Azure Speech Custom Neural Voice(CNV),可为某语言指定自定义端点:

1
2
3
4
5
6
7
8
9
10
11
12
# config.yaml
conversation:
initiate:
lang:
default_short_code: fr-FR
availables:
- pronunciations_en: ["French", "FR", "France"]
short_code: fr-FR
voice: fr-FR-DeniseNeural
- pronunciations_en: ["Chinese", "ZH", "China"]
short_code: zh-CN
voice: zh-CN-XiaoqiuNeural

自定义音色示例:

1
2
3
4
5
6
7
8
9
10
# config.yaml
conversation:
initiate:
lang:
default_short_code: fr-FR
availables:
- pronunciations_en: ["French", "FR", "France"]
short_code: fr-FR
voice: xxx
custom_voice_endpoint_id: xxx

2) 结构化“理赔/工单”字段(Claim Schema)

你可以为不同场景定义不同的数据字段,并强校验数据类型(datetime/email/phone_number/text):

1
2
3
4
5
6
7
8
9
10
# config.yaml
conversation:
default_initiate:
claim:
- name: additional_notes
type: text
- name: device_info
type: text
- name: incident_datetime
type: datetime

当然也可以在“单次外呼 API”中覆盖:

  • POST /call 里传入 claim 字段数组(与上例结构一致)

3) LLM 背景与对话规则(Prompts)

所有提示词都模板化,变量 {bot_name}{bot_company}{phone_number} 等会在运行时自动替换。示例(节选):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# config.yaml
prompts:
tts:
hello_tpl:
- : |
Hello, I'm {bot_name}, from {bot_company}! ...
llm:
default_system_tpl: |
Assistant is called {bot_name} and is in a call center for the company {bot_company} ...
Today is {date}. Customer is calling from {phone_number}. ...
chat_system_tpl: |
# Objective
Provide internal IT support to employees. ...
# Rules
- Answers in {default_lang}, ...
- Cannot talk about any topic other than IT support
...

4) 特性开关(Feature Flags)

无需重启即可通过 App Configuration 动态生效(默认 60s 刷新),包括但不限于:

  • answer_hard_timeout_sec(默认 15)
  • answer_soft_timeout_sec(默认 4)
  • phone_silence_timeout_sec(默认 20)
  • recognition_retry_max(默认 3)
  • recording_enabled(默认 false)
  • vad_* 一系列语音端点检测阈值/时延

开启通话录音:创建存储容器(如 recordings)→ 将 recording_enabled=true

5) Twilio 短信(可选)

如需 SMS 通知/跟进,可切换至 Twilio:

1
2
3
4
5
6
7
# config.yaml
sms:
mode: twilio
twilio:
account_sid: xxx
auth_token: xxx
phone_number: "+33612345678"

加一把“知识火”:RAG 数据与向量索引

  • 索引字段(节选):question / answer / context / created_at / file_path / vectors(1536 维,OpenAI ADA)
  • 配套“索引构建”工具仓库:Synthetic RAG Index(README 已给出链接)
  • 使用场景:在通话过程中按需检索领域知识,为 LLM 对话提供“可溯源背景”

时延与稳定性:怎么“更快、更稳、更可观测”

时延优化(README 提示)

  • 语音 in/out 已是流式;长延迟主要来自 LLM“首 token 等待”
  • 可选用更快模型(如 gpt-4.1-nano;项目新版本默认倾向较快模型),或做 PTU/推理优化
  • 用 Application Insights 观测端到端瓶颈

监控可观测

  • Application Insights:Trace、依赖调用、数据库查询、外部服务、LLM Metrics(延迟、token 用量、Prompt 内容、原始响应)
  • 自定义指标示例:
    • call.aec.droped:回声消除完全丢音次数
    • call.aec.missed:回声消除未及时去除回声次数
    • call.answer.latency:用户结束说话到机器人开始说话的时间

这要花多少钱:README 提供的“估算模型”

以“每月 1000 次通话,每次 10 分钟”为例(2024-12-10 的美元价格估算,可能变化):

  • 基本项合计约 $720.07/月($0.12/小时),覆盖 Communication Services、OpenAI(gpt-4.1/4.1-nano/Embedding)、Container Apps(Serverless vCPU/内存)、AI Search、AI Speech、Cosmos DB
  • 可选项(录音、监控等)约 $343.02/月
  • 生产建议:私网/专线、vNET、合规安全,会额外提升成本

建议将“通话频率、对话轮数、平均发声时间、RAG 片段长度、日志采样率”等变量纳入自己的成本模型持续观测。


生产可用性:Checklist(README 节选)

  • 质量:单测/集测覆盖、可复现实验
  • 可靠性:可复现构建、Trace/Telemetry、运行手册
  • 可维护性:静态检查、服务解耦(Assistant 与 Insights)、多人评审
  • 韧性:IaC、多区域部署、性能测试
  • 安全:构建签名、CodeQL、GitOps、私网、红队演练
  • 负责任 AI:有害内容检测、Grounding 检测、社会影响评估

PoC 的意义是“把路打穿”,真正上生产要把上述项逐一补齐。


从“看得到”到“做得到”:一份可复用的小清单

  • 快速打样:Codespaces → make installmake devpython3 -m tests.local
  • 对接业务:用 POST /call 按场景传入 task/claim 定制一次通话的目的与字段
  • 多语言:在 config.yaml 中配置多语言短码、音色,必要时接入 CNV
  • 数据侧:使用默认 claim schema 起步,稳定后按领域扩展;引入 AI Search 做 RAG
  • 可观测:先接 Application Insights 与自定义指标,再做优化
  • 成本:先按 README 的估算模型做“粗预算—上线后再校准”的闭环

结语

Call Center AI 把“打电话这件事”做成了工程化的“能力组合”:通话通道、语音识别/合成、多语言、多轮智能、RAG 背景、结构化落库、质量回放、可观测与成本意识。它不是一个“开箱即商用”的产品,而是一份“能跑起来、可快速定制、可被生产化”的路线图。

如果你要做:

  • 客服热线/理赔报案/IT 帮助台/预约回访/售后关怀
  • 多语言、跨时区、弹性峰谷的语音服务
  • “能沉淀数据、能形成洞察、能持续优化”的 AI 呼叫体验

那么,这个仓库会是你极具价值的起点。

祝你调好“语音线”和“成本线”,让业务和体验一起跑起来 🎧📞🚀