最近半年我一直在帮团队做 AI Agent 平台的底层设施,踩了不少坑,也把之前很多想当然的设计推翻重来了。先说结论:如果用传统云那套"计算归计算、存储归存储、网络归网络"的思路去做 Agent 基础设施,性能和成本都会崩得非常难看。AI Agent 时代,云必须把计算、推理和数据重新整合起来,这不是概念包装,是实打实的架构需求。
这篇文章就围绕这个判断展开。我会结合自己实际搭建 Agent 服务平台的经验,聊聊为什么传统云架构在 Agent 面前失效、计算/推理/数据三者为什么要重新捏合、落地时怎么设计分层,以及实操中那些文档里不会写的坑。适合正在做 Agent 平台、AI 推理服务或者云原生架构的工程师参考,也适合想搞清楚"Agent 到底对云提出了什么新要求"的产品和技术负责人。
1. AI Agent 的负载特征,和传统应用完全不是一回事
1.1 传统云的"三层分离"设计逻辑
先回顾一下传统云架构的核心逻辑。过去二十年,云厂商一直在做的一件事就是"解耦":存储和计算分离,让对象存储、块存储独立扩展;数据库和业务逻辑分离,让数据层可以单独扩容;网络则是大二层、VPC、负载均衡那一套,把流量调度做到极致。这套思路在 Web 应用时代是成立的,因为典型的互联网应用是"无状态 + 短事务":请求进来,应用层算一下,读几个数据库记录,返回结果,完事。
无状态意味着节点的增删是随意的,计算资源可以被调度到任何地方,只要网络能通、数据能取回来就行。这也是 Serverless、容器编排能大行其道的基础。但 AI Agent 的工作负载完全不是这样,它带着两个传统应用没有的核心特征:长链路的状态累积,以及毫秒级的交互敏感度。
1.2 Agent 的实时交互对延迟的敏感度
我最初给团队搭 Agent 服务时,就是按传统微服务的思路来的:Agent 进程放一批容器,推理服务单独部署,业务数据放云数据库,向量库另外买一个实例。结果第一个版本上线,用户反馈只有一个字:慢。不是一般的慢,是每轮对话都要等三四秒的那种慢。排查下来,时间全花在跨网络调用上了:Agent 进程要调用推理服务,推理服务要拉取用户历史上下文,上下文里嵌着向量检索结果,向量库又在另一个可用区。
这里面最大的问题不是带宽,而是多跳网络带来的累积延迟。一次 Agent 决策可能需要调用 3 到 5 次推理,每次推理之间还要穿插检索、工具调用、状态更新。每一次跨服务调用哪怕只多 20 毫秒,整个链路就是上百毫秒的额外开销,再加上推理本身的延迟,体验直接崩掉。
传统 Web 应用可以接受"请求来了再去远端取数据",因为一次请求只需要一次往返。但 Agent 是"一次任务、多次往返",每一次往返都是在消耗用户体验和用户耐心。这就是我必须重新审视架构的第一个触发点:不能再用"需要时才去取"的思路,而是要把数据放在推理发生的地方。
1.3 长链路状态与上下文管理
Agent 的第二个特征是状态密集。一个完整的 Agent 任务,比如"帮我分析这个季度的销售数据并生成报告",可能要经过规划、拆解、调用工具、读取数据、多轮推理、汇总输出这么一长串过程。每一步都有中间状态:当前的目标拆解到什么程度了,已经调用了哪些工具,拿到了哪些数据,上下文窗口里现在塞了多少内容。
传统应用的状态管理很简单,大不了 Redis 里存一下,丢了就重试。但 Agent 的上下文状态是推理质量的命脉,上下文一旦丢失或不同步,Agent 就可能"失忆",开始胡说八道。而如果把上下文存在远端数据库,每次推理前都要重新加载,然后又回到了延迟问题。所以 Agent 天然要求"状态贴近计算":推理发生在哪里,上下文就应该在哪里。
这也解释了为什么业界越来越强调 Agent 的运行时(runtime)不能只是一个调度器,还需要承担状态管理、记忆持久化、上下文裁剪这些脏活累活。传统云把"状态存储"和"计算"分开的做法,对 Agent 来说就是在人为制造延迟和一致性风险。
2. 为什么计算、推理和数据必须重新整合
2.1 数据引力法则:数据不动,计算动
分布式系统里有个经典概念叫"数据引力"(Data Gravity):数据越庞大、越活跃,就越会吸引计算靠近它。传统云架构其实是顺着这个法则走的,所以大数据领域搞出了存算分离加数据本地化(Data Locality)的折中方案。但有意思的是,到了 AI 时代,云厂商反而把计算和数据分得更开了,GPU 算力池在一处,对象存储在另一处,向量库再独立部署。
在 Agent 场景下,这个矛盾被放大到不可忽视的程度。因为 Agent 的推理不仅需要大模型权重,还需要海量的私有数据做检索增强(RAG)、需要实时更新的业务数据做决策依据、需要用户上下文做个性化。如果每次推理都要跨越网络去把数据"搬"过来,那 GPU 再快也白搭,瓶颈全在数据通路上。
我实测过一组数据:在同等推理负载下,数据本地化和跨 AZ 拉取数据相比,端到端延迟可以差 3 到 5 倍。更麻烦的是,跨网络拉取大块数据还会造成带宽成本暴涨,尤其是当你把几千个文件切块做 embedding 后,向量化的数据量往往比原始文本还要大好几倍。
所以整合的第一个含义是:把数据"搬到"推理引擎附近,而不是让推理引擎每次去远端点数据。这不是优化,是 Agent 场景下必须满足的硬约束。
2.2 推理引擎与数据通道:整合的核心接口
很多人以为推理引擎就是个"模型盒子",输入 prompt 输出 token。真正做过推理服务的人都知道,推理引擎其实是一个极度挑剔的运行时:它对显存、带宽、批处理大小、KV Cache 的命中率极其敏感。同样是 LLaMA 类模型,推理框架选得对不对、KV Cache 配多大、是否开启连续批处理,性能可以差出一个数量级。
而 Agent 场景对推理引擎的挑战更加特殊:单一模型不够用,一个 Agent 可能会按需切换多个规格的模型。简单的问题用小模型省成本,复杂的推理用大模型保证质量。这意味着推理层必须具备多模型管理、动态加载、按需路由的能力,也就是要有一个真正意义上的"推理引擎",而不是简单地部署几个模型服务。
这个推理引擎必须是整合的中心节点。它一方面向下对接算力资源(GPU 池),一方面横向对接数据层(向量库、业务数据库、文件存储),还要对上承接 Agent 运行时发来的推理请求。我在实际架构里,是把推理引擎做成一个"智能数据通道":请求进来时,引擎根据任务类型自动决定加载哪个模型、按需拉取哪些上下文数据、以什么批处理策略执行。这样做的效果是,Agent 运行时不再需要关心"数据在哪、模型在哪",它只需要把任务语义表达清楚,剩下的交给推理引擎去整合。
2.3 成本账怎么算:整合反而更省钱
有朋友问我:把数据和推理放在一起,GPU 节点的存储成本不是更高吗?传统云不是一直倡导存储和计算分离来省钱吗?这确实是个好问题,我一开始也被这个思路带着走。
答案是:对 Agent 场景来说,分离省下的存储成本,远远抵不上推理过程中的浪费。算一笔简单的账:假设一个 Agent 任务平均需要 4 次推理调用,每次推理的上下文包含 50KB 的检索增强数据。如果数据远在对象存储里,每次调用都要拉取,那就是 200KB 的跨网络数据传输,同时推理等待时间拉长导致 GPU 利用率下降。GPU 一小时的成本是存储的几十倍,利用率掉 10 个点,损失就可以买下好几倍的本地存储了。
更关键的是,只有数据和推理整合在一起,才能实现真正高效的推理批处理。多个 Agent 同时发起推理请求时,如果它们的上下文数据都在本地,引擎就可以把相似的任务合并成一个大 batch 跑,GPU 利用率能拉到 70% 以上。而数据如果不在一起,batch 里的每个请求都要等待自己的数据到位,批处理优势就完全发挥不出来。成本账一算下来,整合反而是更经济的方案。
3. 重新整合的落地架构:我是怎么设计的
3.1 四层嵌套架构:算力、数据、引擎、运行时
踩过一轮坑之后,我现在的架构可以概括成四层嵌套:GPU 算力层在最底,数据层紧贴算力层,推理引擎横跨两者,Agent 运行时在最上层只做语义编排。每一层都做整合,但整合的方式不一样。
算力层不再是一个孤立的 GPU 资源池,而是按照"推理集群"来规划:每个集群内配置固定的 GPU 机型,并配有本地 NVMe 或高性能 SSD,用于放置模型权重和高频访问的向量索引。这就保证了模型加载和向量查询都在本地完成,不会出现推理时还要从远端下载模型权重的情况。
数据层做了一个"热温冷"分层:热数据(用户近期会话上下文、高频检索的文档切片)放在推理集群本地;温数据(业务数据库里经常访问的记录)通过缓存通道同步到近线存储;冷数据(历史归档、原始文件)才放到低成本对象存储里。Agent 推理时只访问热数据,其余数据通过预取或异步同步机制提前进入热层。这样既保证了推理的低延迟,又没有让成本失控。
3.2 推理引擎的选型与配置要点
推理引擎我前后试过多个方案,从直接用开源的推理框架到自研调度层都折腾过。经验是:不要试图自己写算子,但一定要自己写调度。模型推理的算子层用成熟框架,调度层必须贴合自己的业务场景做定制。
具体配置上,有几个关键参数直接影响整合效果。第一个是 KV Cache 的大小,它决定了并发推理时能承载多少上下文。我一般按照"最大上下文长度 × 预期并发数 × 1.2 冗余系数"来估算显存需求,宁可预留多一点,也不要在运行中出现 OOM 导致整个集群雪崩。第二个是连续批处理(Continuous Batching)的开关,这个必须打开,否则长短请求混在一起时,短请求会被长请求堵死,延迟抖动非常严重。第三个是模型热加载策略,我采用"常用模型常驻、冷门模型按需加载"的方式,并设置模型的冷却时间,超过 10 分钟没有被调用就自动卸载,避免显存被低频模型长期占用。
调度层我做了两个定制。一是"数据感知调度":推理请求进来时,调度器先判断请求所需的上下文数据在哪个集群本地,然后把请求路由到对应集群,保证数据访问是本地的。二是"模型感知路由":根据任务的复杂度预算自动选择模型规格,简单任务优先用小模型,长链路深度的推理才升级到大模型。这两个定制让推理引擎真正做到"跟着数据走、按任务配模型"。
3.3 数据层改造:向量库、传统数据库与文件存储的协同
数据层是整合中最容易翻车的部分。Agent 需要的数据不只是向量,还有结构化业务记录、半结构化的日志、甚至有图片和音视频。早期我天真地想把所有东西都塞进向量库,结果发现结构化查询、多条件过滤、事务更新这些需求,向量库根本做不好。
现在的做法是各司其职再加一层同步网关:结构化业务数据留在传统数据库;文档类和知识库类内容走向量库;原始文件进对象存储。同步网关负责三件事:一是把文档入库时同时生成向量、维护源文件和向量之间的映射关系;二是把业务数据变更实时同步到推理集群本地的热缓存;三是做数据版本管理,避免 Agent 读到不一致的旧数据。
这里有个很重要的细节:向量库的高效查询依赖合理的索引分区策略。不要只按时间分区,要结合 Agent 的实际使用场景,比如按用户维度分区,或者按知识领域分区。分区粒度太粗,单次检索要扫描的向量太多,延迟上不去;分区粒度太细,又容易造成跨分区查询。我一般按"单个分区向量规模不超过 2000 万"这个量级来设计,实测既能保证召回质量,又能把单次查询延迟控制在 50 毫秒以内。
4. 实操中的关键细节与避坑经验
4.1 数据一致性与延迟的权衡:别追求强一致
整合架构里最容易踩的坑之一,是试图让本地热缓存和远端数据库保持强一致。Agent 场景下,数据弱一致的代价是可以接受的,但锁等待的代价是不能接受的。一次 Agent 决策往往涉及多次数据读取,如果每次读取都要等本地缓存与源库对账,那延迟又回去了,整合的意义就没了。
我的实践方案是:热缓存采用"写后失效 + 异步刷新"策略。业务数据变更时,首先更新源库,然后立即把本地缓存标记为失效;下一次推理需要读取时,如果发现缓存失效,先返回旧数据并触发后台异步刷新。绝大多数场景下,旧数据对 Agent 决策的影响可以忽略,而换来的是持续的毫秒级数据访问。真正要求强一致的操作(比如支付、订单状态变更)单独走一条直连源库的通道,不让它们挤在推理链路上。
4.2 监控体系要重新设计:不能只看 GPU 利用率
整合架构的监控和传统云监控完全是两个思路。传统监控盯着 CPU、内存、网络 IO,但 Agent 场景下,这几个指标根本反映不出系统健康度。我现在的监控体系围绕三个维度来搭:数据本地命中率、推理批处理效率、端到端任务延迟。
数据本地命中率是个关键指标,它统计每次推理请求所需的数据有多少是在本地命中的,如果这个数字低于 90%,说明热数据分层或预取策略有问题。推理批处理效率则反映引擎的调度质量,我习惯用"每 GPU 每秒处理的请求 token 数"来衡量,而不是单纯看 GPU 利用率——利用率高但都在处理无效请求没有意义。端到端任务延迟则直接对标用户体验,一旦某个 Agent 任务类型的 P95 延迟超标,我会反向追踪是数据访问慢还是推理排队慢。
监控数据的采集也不能用传统的抽样方式,Agent 任务是有状态的,必须用 trace 把一次任务的所有推理调用串起来看。我用了 OpenTelemetry 规范来打 trace,每个 Agent 任务生成一个完整的调用链,这样一旦出问题,就能快速定位是规划阶段慢、检索阶段慢还是推理阶段慢。
4.3 一套值得参考的容量评估方法
整合架构的容量评估比传统架构复杂得多,不能简单地按"模型参数量 × 并发数"来预估 GPU。我的方法是先算"推理吞吐基线",再算"数据通路带宽",两者取最大值来定集群规模。
推理吞吐基线:以实际任务负载为基准,统计一个典型 Agent 任务平均消耗的输入 token 数和输出 token 数,乘上每秒预期的任务数,再除以单个 GPU 的有效吞吐(我实测取框架理论值的一半做保守估计),得出 GPU 数量下限。数据通路带宽:估算典型任务的上下文数据大小,乘上每秒任务数,再乘上单跳数据访问的倍数(因为一次任务多次访问数据),算出所需的本地存储 IOPS 和网络带宽,用它来校验集群配置是否够用。
我吃过一次亏,就是只按 GPU 算力来买机器,忽略了本地磁盘 IOPS,结果数据量一上来,推理引擎被磁盘的随机读取卡住,GPU 大量时间在空转等待数据。后来加了缓存层级,把高频向量索引用内存映射(mmap)方式加载,情况才好转。所以容量评估一定要算数据通路,这是整合架构里最容易低估的瓶颈。
5. 常见问题与排查技巧实录
5.1 我把踩过的坑整理成了排查速查表
| 症状 | 可能原因 | 排查方向 |
|---|---|---|
| 推理首 token 延迟突然飙升 | 模型权重被换出,首次加载触发 | 检查模型热加载策略和冷却时间设置 |
| 批处理吞吐上不去 | 上下文数据分散在不同集群,无法合并 | 检查数据感知调度开关,确认路由是否失效 |
| 向量检索偶发超时 | 分区粒度过大,单分区扫描量过高 | 重新设计分区策略,按业务维度拆分 |
| Agent 回答前后矛盾 | 上下文数据版本不一致,读到旧数据 | 检查热缓存失效策略,确认异步刷新是否被阻塞 |
| GPU 利用率高但任务延迟也高 | 批处理队列里混入超长任务 | 打开连续批处理,或设置单批最大上下文数 |
| 显存频繁 OOM | KV Cache 估算偏小 | 按最大上下文 × 并发数 × 1.2 冗余重新规划 |
5.2 两个让我印象最深的排障经历
第一个是典型的"数据本地化失效"问题。最开始我们的推理集群和数据层用的是同一个 VPC 下不同子网,理论上内网互通、延迟不高,但实际跑起来延迟还是超出预期。排查到最后发现,问题出在 DNS 解析上——每次推理请求都要做一次域名解析,解析结果没有做本地缓存,导致每次数据访问都多出几次额外的 DNS 往返。把服务发现改成直连 IP 加健康检查之后,延迟立刻降了接近一半。这种问题是架构图上永远看不出来的,必须用 trace 数据一层层往下挖。
第二个是模型路由策略造成的"小马拉大车"。我早期把所有 Agent 请求都路由到最强的模型上,以为这样回答问题质量最高。结果发现大部分简单任务根本不需要那么大模型,不仅成本高,而且大模型的推理延迟明显高于小模型,用户反而觉得变慢了。后来我在路由策略里增加了任务复杂度预估,用两个维度的信号来判断:一是用户请求里是否包含明确的复杂指令词,二是任务规划层给出的子任务数量。当子任务超过 5 个或包含数据分析类指令时,才升级到大模型,其余一律走小模型。这个改动让推理成本降了四成,端到端延迟反而低了。
5.3 关于推理引擎调度的一些额外心得
调度策略是整合架构里最容易隐藏性能问题的地方,很多坑不跑到一定量级根本暴露不出来。比如我最初用的是"先到先服务"的简单队列,结果某个 Agent 任务一次性提交了几十个推理请求,直接把队列堵死,其他用户的任务全部排队。后来我改成了带优先级的调度:把交互型任务(用户在线等待的)和高吞吐型任务(后台批量处理的)分流到不同的调度队列,同时给每个任务设置最大并发推理数限制,避免单个任务占满整个集群。
另外想特别提醒一点:不要把模型配置文件和权重放在网络文件系统(NFS)上共享。表面上方便统一管理,实际上多节点同时读取巨型模型文件时,NFS 会成为绝对的瓶颈,而且一经堵塞,整个集群的推理任务都会连锁失败。我的做法是每个节点至少保留一份最新版本的模型权重副本,配置管理走集中式下发,但权重文件必须本地化。
以一段个人体会收尾
整个重构做下来,我对"AI Agent 时代的云"有了一个比较实在的理解:传统云的解耦是为了弹性,而 Agent 时代的整合是为了质量。解耦解决的是"资源不够怎么办",整合解决的是"任务做不好怎么办"。两者不是矛盾,而是不同阶段的不同核心矛盾。计算、推理和数据重新整合,不是要把所有东西都塞回一台机器,而是要在架构层面重新设计它们之间的通道,让数据主动靠近计算,让推理引擎成为整合的枢纽,让 Agent 运行时只关心语义不关心资源。
如果你也在做类似的平台,我建议不要急着买一大堆 GPU,先把你现有的数据访问模式摸清楚,算一算跨网络拉数据到底浪费了多少时间,然后再决定架构怎么改。踩过几次坑之后你就会发现,真正决定 Agent 体验的不是模型有多大,而是从数据到推理的那条路有多顺畅。