最近在做一个企业级 AI 智能客服项目,客户对系统的并发能力和智能水平要求都很高。市面上方案很多,但要么太'重',要么扩展性差。经过一番调研和选型,我们最终决定采用微服务技术栈来搭建,感觉它在平衡性能、成本和开发效率方面做得不错。今天就把我们整个从架构设计到落地的实战经验梳理一下,希望能给有类似需求的同学一些参考。
背景痛点:企业级客服系统到底难在哪?
在动手之前,我们得先搞清楚要解决什么问题。企业级智能客服,尤其是面向 C 端海量用户的场景,挑战远比想象中多。
- 高并发与低延迟:这是最直观的痛点。想象一下大促期间,瞬时涌入的咨询请求可能是万级 QPS(每秒查询率)。系统必须在几百毫秒内完成从接收用户问题、理解意图、查询知识到生成回复的全流程。任何环节的延迟都会导致用户体验急剧下降。
- 意图识别准确率:用户的问题千奇百怪,口语化、错别字、中英文混杂都是常态。如何让机器精准理解用户'到底想问什么',是智能的核心。传统的规则匹配或简单分类模型在这里完全不够用。
- 多轮对话状态维护:客服对话往往不是一问一答。用户可能会中途切换话题、指代上文(比如'上面说的那个')、或者进行复杂的业务办理。系统需要像人一样记住对话的上下文(Context),并基于此进行状态管理,否则对话就会'断片'。
- 系统稳定性与容灾:7x24 小时在线是基本要求。任何单点故障、第三方服务(如语音识别、知识库接口)不稳定,都可能导致整个客服链路瘫痪,需要有完善的熔断、降级和容灾策略。
- 知识更新与模型迭代:业务知识在变,用户问法也在变。如何在不中断服务的情况下,快速更新知识库和优化 AI 模型,是一个持续性的挑战。
面对这些,一个单体(Monolithic)架构的应用显然力不从心。它把所有功能耦合在一起,牵一发而动全身,难以针对高并发的 NLU(自然语言理解)模块或复杂的对话管理模块进行独立扩缩容,也不利于团队协作和故障隔离。
架构设计:微服务化是必然选择
基于上述痛点,我们选择了微服务(Microservices)架构。核心思想是解耦和专精。每个核心功能独立成服务,可以独立开发、部署、伸缩和替换。
整个流程可以分解为以下几个关键步骤和组件:
- 请求入口与网关:所有用户请求(来自 App、Web、H5 等)首先到达API 网关。网关负责统一鉴权(JWT)、限流、路由和请求聚合。它是系统的安全屏障和流量调度中心。
- 自然语言理解(NLU)服务:这是 AI 的'大脑'。网关将用户原始语句转发给 NLU 服务。该服务内部通常包含:
- 意图识别(Intent Classification):判断用户意图,如'查询物流'、'退货'、'投诉'。
- 实体抽取(Entity Extraction):从语句中提取关键信息,如订单号、日期、商品名称。
- 情感分析(Sentiment Analysis):判断用户情绪,为后续的回复策略提供参考。我们使用了基于 BERT 的模型,并通过 ONNX Runtime 进行优化部署,后面会详细讲。
- 对话管理(DM)服务:这是对话的'导演'。它接收 NLU 的分析结果,并结合当前的对话状态(Dialog State)(存储在 Redis 中),决定下一步该做什么。例如,如果 NLU 识别出意图是'查物流',但没提取到'订单号',DM 就会决定发起一次'追问'。
- 知识库/技能服务:根据 DM 的决策,调用相应的后端服务。比如:
- 问答知识库:用于回答常规问题。
- 业务技能:对接订单系统查物流、对接 CRM 系统查客户信息。
- 知识图谱:用于处理更复杂的关联查询,比如'这款手机和上周发布的那款有什么区别?'。
- 回复生成与多模态集成:将获取到的信息,组织成自然流畅的回复文本。同时,如果需要,可以集成TTS(文本转语音) 或语音识别(ASR) 服务,支持语音交互。
- 状态存储(Redis):贯穿整个流程的'记忆体'。存储每个会话(Session)的上下文、历史记录和临时变量。我们采用了 Redis 分片集群来应对海量会话状态存储和高并发读写。

