这两年我先后参与过三个 AI 系统的架构设计与重构,一个是从零搭起来的推荐类服务,两个是接手别人跑得跌跌撞撞的存量系统。反复被验证的一个事实是:AI 系统架构的复杂度,几乎全在模型之外。很多人一听"AI 系统架构",下意识想到的就是选什么框架、用什么网络结构、怎么调参,但真正上了生产,决定系统上限的往往是数据管道怎么设计、推理服务怎么做高可用、模型版本怎么管理这些听起来不那么"AI"的环节。
这篇文章我想完整梳理一套可落地的 AI 系统架构:从业务需求如何映射成技术形态,到数据层、训练层、推理服务层、应用集成层和平台治理层怎么衔接,再到生产环境里最常见的故障长什么样、怎么排查。无论你是正准备从零搭建一个 AI 系统,还是正在维护一个已经上线的 AI 服务,这篇文章应该都能给你一张可以用来对照的架构地图。
1. 先别画架构图,把三个业务问题回答清楚
1.1 AI 是业务的核心链路,还是辅助决策工具
这个问题的答案直接决定整套架构的可用性要求和成本投入。如果 AI 是业务的核心链路,比如推荐系统、风控模型、智能客服机器人,那它出问题用户会直接感知:推荐变差了、审核漏过了、客服答非所问。这类系统的架构设计必须围绕高可用、低延迟、可降级来做,模型服务要常驻,资源要预留冗余,发布要有灰度机制。
反过来,如果 AI 只是辅助决策工具,比如给运营看的经营分析、给客服看的答案建议,那它一次跑几个小时也没关系,架构可以做得简单很多,甚至复用已有的离线计算能力。
我之前接过一个"智能客服"项目,早期被当成辅助工具设计,每天离线批量跑一轮答案,用户提问要等很久才能拿到回复,业务方觉得"根本不智能"。后来把它的定位改成核心链路,架构完全重做,才变成实时响应。这个案例说明,定位判断错了,后面所有技术选型都会白做。
1.2 实时性需求:毫秒级、秒级还是小时级
实时性需求要拆成三个层级,每个层级对应的架构形态完全不同:
| 场景类型 | 典型业务 | 延迟指标 | 架构形态 |
|---|---|---|---|
| 在线实时 | 推荐、风控、智能客服 | P99 通常在 200ms 以内 | 常驻推理服务,资源持续占用,需要容量规划和弹性扩缩容 |
| 近线准实时 | 内容理解、画像更新、批量打分 | 秒级到分钟级 | 定时任务或流式窗口触发,资源可以错峰使用 |
| 离线批处理 | 报表分析、全量数据打分 | 小时级到天级 | 分布式批处理任务,弹性拉起资源,跑完释放 |
很多团队会从离线批处理起步,再逐步往在线演进。这个演进过程本身是合理的,但要注意:每次跨一个层级,架构都要动刀子,不是简单改个调用方式就行。先想清楚业务到底要哪个层级,能省掉后面整个架构翻新的大成本。
1.3 团队规模和维护能力决定架构复杂度
这是我最想强调的一点。AI 系统架构最大的风险不是"缺组件",而是"组件太多但没人维护"。
三五人的小团队,不要一上来就铺微服务、搭完整平台层。把模型训好、用最简单的服务方式跑起来、留好监控,比引入一套健全但没人会用的容器化平台实在得多。我见过一个很小的团队上了多集群架构,半年后没人能说清楚依赖关系,每次上线都像拆炸弹。
我自己定的原则是:架构复杂度必须用"团队能看懂、能接手"来约束。宁可多写文档,不要多上组件。等到团队规模、业务复杂度确实撑得起平台化投入时,再逐步加层次,反而更稳。
2. AI 系统骨架:五层架构拆开揉碎
2.1 数据层:离线数据仓库与实时数据管道并存
数据层是 AI 系统的地基,但很多人对它理解得太简单。一个生产级 AI 系统的数据层,至少要同时跑两条管道。
离线管道负责把原始日志清洗成结构化数据,经过加工落到数据仓库里,形成宽表、特征表、样本表。训练要用的全量样本,都是从这里来的。实时管道则处理业务事件,经过消息队列进流处理引擎,产出实时特征,写入低延迟的特征存储,供在线推理时查询。
这两条管道会同时存在,原因很朴素:训练需要的是"完整、准确、可回溯"的数据,在线服务需要的是"快、可用"的数据。为了两个目标并存,同一份原始数据往往会在不同存储引擎里各存一份,这是正常设计,不是冗余。"一份数据,多种用途"落到架构上,通常就是多份副本、不同引擎。
存储选型时要分清读写模式:数据仓库系统要扛得住批量大查询,在线特征存储要扛得住低延迟随机读,两者需求完全相反,别指望一个存储引擎通吃。
2.2 训练层:从单机实验到分布式训练
训练层不仅仅是"跑模型",它由三部分构成:开发环境、任务管理、实验跟踪。
开发环境是算法工程师日常做实验的地方,核心诉求是交互式、可试错。任务管理负责把训练任务提交到算力池,做资源分配、排队、优先级调度。实验跟踪负责记录每次实验的数据集版本、代码版本、超参数和结果指标。
对小模型来说,一台训练机器可能就够了。但一旦模型规模上来、数据量大,就要做分布式训练。分布式训练的核心不是框架怎么调用,而是三件事:算力怎么池化、通信怎么不拖后腿、断点怎么续。
2.3 推理服务层:在线、近线、离线三种形态
同一个模型,在真实系统里往往要同时以三种形态部署。
在线推理是常驻服务,接收 API 请求,加载模型,实时返回结果。它是延迟敏感型,要专门做容量规划、弹性伸缩、动态批处理。近线推理是按固定窗口触发的,比如每五分钟对新增的一批内容做理解打标,它不苛求单个请求的延迟,但要求窗口内能处理完。离线推理是对海量数据批量打分,比如给全量用户算一遍推荐候选集,它通常复用训练集群的空闲资源。
这三种形态共享同一个模型产物,架构上要对"一次训练、多处部署"有清晰支持。我见过很多团队只做了在线推理,业务想跑个批量任务时发现没有入口,只能临时写脚本,这就是架构没把推理形态设计完整的典型表现。
2.4 应用集成层:业务方怎么调用 AI 能力
推理服务之上,通常还要有一层应用集成层,核心是 API 网关和结果处理。
网关负责统一入口、鉴权、限流、路由,把业务方的请求转发给对应的推理服务。结果处理负责模型输出的后加工,比如格式化、归因解释、兜底逻辑。这里有一个重要的设计原则:业务方不应该感知到背后是模型还是规则,API 契约在一开始就要定清楚。这样以后模型换规则、规则换模型,对业务方都是透明的,降级切换也不会惊动上游。
降级方案也要在这一层提前设计。模型服务不可用时,是返回规则引擎的结果,还是返回缓存的历史结果,还是快速失败?这些决策要在架构阶段就想好,而不是故障发生时在值班群里临时争论。
2.5 平台治理层:模型注册、版本管理与权限审计
模型一多,治理就不可避免。平台治理层解决的是"哪个模型在线上、谁允许它上线、上线之后怎么回滚"这些问题。
模型注册中心是治理层的核心,每个模型有唯一 ID、版本号、来源实验、训练数据范围、离线评估指标、上线记录。有了这个基础,才能做到可追溯、可回滚。权限和审计则回答"谁训练了它、谁批准了上线、谁改动过服务配置",对多人协作的团队来说不是可选项,是必需品。
我维护存量系统时最大的教训就是:没有治理层的系统,模型一多必然失控。一个团队里有七八个模型同时在迭代,如果不知道哪个版本在线上、上一次实验用的什么数据,所有调优都变成玄学。
3. 数据管道里最容易被低估的特征一致性问题
3.1 特征一致性问题到底是什么
特征一致性(业内常说的训练服务偏差)是 AI 系统里最隐蔽、最难排查的问题之一,但它在架构层面的存在感一直被低估。
训练样本里的特征,是历史数据批量算出来的,完整、干净、可以回溯。线上推理时的特征,是实时从管道里取出来的,可能有缺失、有延迟、单条计算。两边只要有一点口径不一致,模型在服务端看到的特征分布就和训练时不一样,效果会悄悄变差。
举个例子:一个"最近 7 天购买金额"的特征,训练代码里按交易日历取最近七天,线上实时服务按过去 168 小时的滚动窗口算。周末这种边界时刻,两边算出来的数值就差一截。模型在训练时学会了对某个分布的理解,上线后发现输入分布变了,输出自然偏。这种问题不报错、不告警,只会表现为业务指标缓慢下滑,很难定位。
3.2 特征平台的解题思路:一套定义,两套执行
解决特征一致性问题的行业主流做法,是建一个轻量级的特征平台,核心思路就一句话:特征定义只维护一份,离线在线共用。
具体落地是:把每个特征的定义集中登记,离线训练时根据这份定义生成批量计算逻辑,在线服务时根据同一份定义生成实时计算逻辑。两边逻辑同源,口径天然一致,不会再出现"训练一套、服务一套"。
同时,还要在特征存储之间做周期性对齐校验。离线特征表和在线特征存储会定期跑对账任务,把同一批实体的特征值拉出来对比,发现不一致就告警。这相当于给特征管道装了体检系统,问题在早期暴露,而不是等到线上效果崩了才回头查。
3.3 数据质量监控:盯住缺失率、分布漂移和时效性
数据质量监控至少要盯三件事。
第一是特征缺失率。实时特征拿不到时,系统通常会填默认值或前值。如果填充策略不合理,线上会出现大量填充值,模型在"假数据"上运行而不自知。这是最危险的情况,因为一切指标看着都正常。
第二是特征分布漂移。特征分布和训练期差异过大,模型效果必然劣化。业界常用的量化指标是 PSI,可以给每个关键特征设置漂移阈值,超了就告警。
第三是时效性。特征产出的延迟,比如用户画像标签每天是否按时更新,上游数据任务延迟会直接传导到推理质量。
我建议把数据质量告警和核心业务指标联动分析。只看特征指标容易误报,只看业务指标又定位不到根因,两者对照才是完整的问题发现链路。
4. 训练平台设计:GPU 不是插上就能用
4.1 算力池化与任务调度
训练平台第一个要回答的问题是 GPU 资源怎么管理。我见过两种典型做法。
做法 A:物理机绑定,一个人分到一台训练机器,独占使用。简单直接,小团队早期够用。缺点是利用率低——有人训练任务只跑一会儿,机器大部分时间空着,别人又用不了。
做法 B:容器化资源池。用户提交训练任务,调度器自动分配资源,支持多租户隔离。好处是资源利用率高,任务可以排队、可以抢占,空闲算力还能被离线推理任务利用。缺点是平台本身的搭建和维护成本高。
如果团队已经到多个人同时训模型、GPU 开始闲置浪费的阶段,就应该考虑做法 B。调度策略上要注意两点:一是任务优先级,线上紧急修复任务要能抢占批处理任务;二是资源上限控制,防止一个任务把池子吃光。
4.2 实验管理与模型资产沉淀
训练平台里最容易被忽略、后期最让人后悔的,是实验管理。
没有实验管理的时候,算法团队的日常是这样的:改了一版特征,训练效果提升 2%,但没人记得是改了哪几个特征;三个月后发现当时那个实验的记录丢了,只能重新试。这个问题在一个多人协作、长期迭代的团队里会放大到灾难级别。
实验管理要记录的核心信息包括:数据集版本、代码版本、超参数配置、评估指标、模型产物路径。更进一步是做模型注册,每个模型训练完成后登记一张"模型卡":任务类型、训练数据范围、离线评估结果、已知失败模式。这张卡直接流转给部署环节,部署的人不用去问算法"这个模型怎么用、有什么坑"。
4.3 分布式训练的通信瓶颈与断点续训
分布式训练不是卡越多越快。数据并行模式下,每张卡独立算梯度,然后做梯度同步,这步跨卡通信在网络里走一圈,特别耗时。
有一个经验值可以参考:从 8 卡扩到 16 卡、32 卡时,超线性加速基本不要想。实际加速比通常只有 2.5 到 3 倍,而不是理论上的 4 倍。通信开销、负载不均、数据读取都可能变成瓶颈。优化方向一般是梯度累积、混合精度训练、合理的通信拓扑,但这些都是收益递减的工程调优,要控制投入。
另一个必须提前设计的是断点续训。大模型的训练任务动辄几百小时,任何一个训练节点异常退出,如果没有定期保存检查点,前面所有计算全部作废。检查点的保存频率要在"恢复成本"和"保存开销"之间取平衡,同时检查点存储本身也要做冗余,不然存储坏了比节点坏了更致命。
5. 推理服务架构:在线服务设计的核心决策
5.1 在线推理链路:网关、动态批处理与排队
在线推理服务的链路不算复杂:请求先到 API 网关,经过鉴权、限流、路由,进入推理服务,推理服务读取特征、跑模型、返回结果。真正的设计难点在推理服务内部的两个机制:动态批处理和排队策略。
动态批处理是 GPU 场景下的核心吞吐优化手段。GPU 擅长批量计算,单个请求推理和多请求一起推理的耗时差距不大,但吞吐差距很大。所以推理服务会短暂积攒请求(比如攒 10 到 30 毫秒),把一批请求合并推理。这个"攒批窗口"的时长是个关键参数:窗口太大,单请求延迟上升;窗口太小,批量效果差。正确做法是基于目标 P99 延迟反推最大可接受攒批时间。
排队策略同样重要。当请求量超过服务容量,要么排队、要么快速失败、要么降级。我的经验是:宁可快速失败加降级,也不要无限排队。排队时间一长,用户体验不可控,而且队列堆积后新旧请求一起涌入,服务更容易雪崩。给队列设一个超时上限,超时直接返回兜底结果,是更稳的方式。
5.2 批量推理任务:高峰期怎么别打架
在线推理服务和离线批量任务共享算力时,有一种典型的资源打架现象:白天在线流量高峰,离线任务同时启动,把 GPU 抢走一批,在线延迟立刻恶化。
解决办法是资源池隔离加错峰调度。在线推理服务要有独立的资源配额,离线任务只能在剩余容量里运行,不能越界抢占。离线任务还可以设置运行时间窗,比如凌晨低峰时段跑大批量任务,白天只跑小批量紧急任务。
更进一步可以按优先级调度:在线服务是最高优先级,不可被抢占;近线任务次之;离线任务是可抢占的弹性负载。这样设计之后,离线任务跑多少取决于在线服务的空闲容量,而不是反过来挤压在线服务。
5.3 模型加速与部署形态的选型思路
模型加速有三个常见方向:量化、蒸馏、剪枝。量化是把模型参数的精度降下来,换取计算加速和显存节省;蒸馏是用大模型教小模型,把能力迁移到更小的网络上;剪枝是去掉不重要的连接或通道。
但在做这些之前,先要搞清楚延迟瓶颈到底在哪。我见过不止一个团队,花大力气压模型,结果发现瓶颈根本不在模型计算,而在特征查询的网络开销和数据反序列化。这种场景应该优先优化特征读取链路,而不是动模型。
部署形态上,小模型用 CPU 实例往往就够,成本比 GPU 低一个数量级;大模型和在线高并发场景才需要 GPU。是否要上模型加速,判断标准只有一个:先量化评估,确认模型计算确实占延迟大头,再动手,否则就是在错误的方向上优化。
6. 生产环境的高频故障与排查经验
6.1 故障一:模型没动,效果却突然变差了
现象:某推荐服务的核心指标连续一周下滑,模型版本没变,代码没发版,流量也没波动。
排查链路:先看推理服务错误率和延迟,正常;再看模型输出分布,略偏;最后翻特征监控,发现某个特征从某天凌晨开始缺失率从 2% 涨到 18%。根因是上游一个数据任务延迟,下游实时特征管道在拿不到数据时静默填了默认值。模型在大量默认值特征上跑了一周,输出自然偏移。
修复动作分两层:第一层,特征缺失必须显式标记并在监控上可见,不能静默填充;第二层,默认值策略要按特征单独配置,有些特征填 0 合理,有些特征填 0 等于灾难。这次之后,我们把"特征缺失率异常"提升为最高优先级告警。
6.2 故障二:扩容反而把服务扩死了
现象:高峰期延迟上升,触发了自动扩容,结果新实例不断加入,服务延迟不降反升,最终大面积超时。
复盘链路:新实例启动后要加载模型,冷启动耗时几十秒,期间 CPU 被打满;但实例一注册就立刻开始接流量,新实例一边加载一边处理请求,比旧实例还慢;延迟进一步恶化,又触发新一轮扩容,形成雪崩循环。
修复方案:第一,加启动健康检查,模型加载完成之前不接流量;第二,扩容加冷却期,避免抖动触发连环扩容;第三,限制单次扩容的步长,避免瞬间拉起太多实例;第四,保持一定的最小实例数,防止流量一波动就从零开始扩容。这套组合拳之后,同样的流量冲击没有再出现过。
6.3 故障三:灰度发布时正确的 5% 流量切法
现象:新模型灰度上线,按 5% 流量切,业务方反馈部分用户"体验不稳定,有时候准有时候不准"。
排查链路:灰度逻辑是按请求数随机切流,同一个用户在两次连续请求里,第一次落到新模型,第二次落回旧模型,感知结果完全不同。技术上没有报错,但业务体验是"模型抽风"。真正的错误不是灰度比例,而是灰度维度选错了。
修复方案:按用户维度做哈希分桶,同一个用户的所有请求都落到同一个模型版本上。灰度期间还要同时盯新旧版本的业务指标对比,而不只是离线评估指标。灰度灰度,本质上是拿一小部分真实用户的体验做实验,前提是"实验单元"要稳定,不能同一个用户一会儿实验组一会儿对照组。
6.4 故障四:告警疲劳让核心故障被淹没
现象:监控告警数量太多,团队已经麻木。一次核心服务 P99 延迟超标持续半小时,竟然没有一个人响应。
复盘链路:告警系统配置了几百条规则,大量低价值告警刷屏,真正严重的问题被淹没。工程师默认"告警都是狼来了",值班时只看最高优先级的页面告警,延迟超标这种中等级告警被忽视了。
修复方案:第一,告警分级,页面级告警对应极度严重问题,及时通知的告警限制数量,其余降级为日志记录;第二,收敛重复告警,同一根因的告警合并为一条,避免刷屏;第三,每条告警必须可行动,附处理手册,不能行动的告警直接关掉;第四,定期做告警演练,让团队在模拟故障里走一遍真实处理路径。告警系统的目标不是"多",而是"每个告警都值得被响应"。
最后说点个人体会。AI 系统架构没有银弹,我经历过最顺的项目都不是一步设计到位的,而是先跑通一个最小闭环,再根据监控数据和真实故障逐步加组件。架构是长出来的,不是画出来的。还有一个习惯我强烈建议保持:任何架构讨论,先从数据流画起,而不是从技术栈画起。数据从哪来、怎么变成特征、特征怎么进模型、结果怎么回到业务,这条主线理顺了,技术选型只是沿着主线填空。这个习惯帮我避开了很多"组件选得很先进、但连起来不解决业务问题"的坑。