资讯详情

云端智能体基础设施:从微服务思维到推理感知架构的转变

📅 2026/10/26 20:44:12 | 华诺云谱 👁 阅读
云端智能体基础设施:从微服务思维到推理感知架构的转变
云端智能体的困境我在上个月的一次线上事故里体会得淋漓尽致。那时我们的Agent平台刚把单会话上下文窗口从32K升到128K测试环境一切正常上线没到一周某天下午集群突然像被人掐住了脖子——任务积压、心跳超时、推理实例批量重启连带着下游几个自动化流程一起抖动。排查到最后负责基础设施的同事憋出一句话“我们把智能体当成普通微服务来养了但它根本不是。”这句话点醒了我云端智能体对基础设施的消耗方式跟传统云原生应用完全是两回事继续沿用老一套资源模型、调度策略和可观测体系瓶颈只会越来越疼。这篇文章想聊的就是这件事。适合正在做AI Agent平台、智能体编排框架或者企业里负责MCP/工具调用服务的架构师、SRE和平台工程师看。我会从负载特性的底层差异讲起拆解瓶颈到底卡在哪几层再给出五条我们实际验证过的设计原则和落地路线最后聊一猜未来12个月基础设施团队应该把力气花在哪。1. 为什么传统云原生的三板斧在智能体面前失灵了过去十年云原生应用的基础设施哲学可以浓缩成三句话无状态、水平扩展、靠消息队列削峰。微服务架构里每个实例杀掉重启都不影响整体流量大了就多拉几个Pod流量峰值靠队列缓冲。这套思路在你处理用户请求、订单交易、内容分发时是成立的因为单个请求的生命周期很短状态要么在数据库要么在缓存实例本身只是个无状态的执行器。但智能体完全不是这种模型。1.1 请求模式从“短连接”变成了“长会话”传统API请求是毫秒到秒级的进来一个HTTP调用服务处理完返回结果连接关闭。智能体一次完整任务呢以我们平台上最常见的“客服工单自动处理”为例Agent要先读取工单然后调用用户画像服务再查订单系统中间还可能问一次大模型要判断口径之后调CRM改状态最后生成处理摘要。整条链路跑下来经常是几十秒到几分钟复杂一点的多Agent协作任务能持续十几分钟甚至更久。长会话带来的第一个问题是资源占用时间长。一个传统微服务实例处理1000个请求每个请求平均100ms那它的CPU峰值窗口很窄。而一个Agent实例同时只处理几个会话但每个会话会持续占用推理上下文、中间状态、工具连接池时长按分钟算。这意味着你不能再用“QPS”去衡量负载你得用“并发活动会话数”这根本上是两套容量模型。1.2 突发性不是流量峰值的问题而是分布模型变了我见过太多团队按“峰值QPS”来给智能体服务做容量规划结果还是出事。原因在于智能体的突发不是流量形态的突发而是执行路径的指数分叉。一个Agent在计划阶段可能只调两次模型但一旦开始执行工具调用每个工具都可能触发更多的子任务调了知识库知识库返回的内容又要分段送进上下文调了外部API外部API可能回调Webhook被调用方自己又是一个Agent。整个执行图是一棵动态生长的树你没法提前预测它到底会占多少算力。传统互联网的峰值是“10倍并发”能扛住因为单请求资源消耗稳定。智能体系统的峰值是“10倍任务数”但每个任务的资源消耗本身还能再乘10倍甚至100倍。我们有一次压测同样100个并发任务A组任务平均每个只消耗2万tokenB组任务因为中间误入了一个需要反复检索比对的分支平均每个消耗了40万token20倍差距。这还不算极端情况。1.3 智能体不是单纯的“调用”而是编排者这是我在架构讨论里最想纠正的一点。很多人把Agent和普通的“调用链”划等号用户请求进来Agent作为入口后面串一串API。但真正的智能体尤其是带规划和反思的更像一个运行时编排器它要维护自己的“计划列表”要根据中间结果动态修改下一步动作要在工具失败时重试甚至换方案还要在多Agent之间传递上下文。这种编排行为让基础设施必须同时支持三件事高频的模型推理、动态的工具调用、可回溯的会话状态。传统云基础设施把这三件事拆成了独立的子系统——推理走GPU集群、工具调用走微服务、状态走Redis/数据库——但智能体要求三者协同而且协同的节奏是模型决定的不是流量决定的。这是一个根本差异调度中心从“流量”变成了“推理决策”。2. 瓶颈到底卡在哪几层一次从上线到崩溃的排查记录光讲理论没用我把我们那次事故的排查过程拉出来一条一条对你就明白瓶颈的分布了。下面的数据是我们平台的真实记录已脱敏调整架构很简单客户端 → 网关 → Agent运行时K8s Deployment → 大模型推理服务vLLM会话状态存Redis工具调用走内部HTTP。2.1 第一层冷启动与token预填充的算力浪涌事故是从下午2点17分开始的。监控图上最先跳动的不是CPU而是推理服务的TTFT首token延迟。原本平均300ms的TTFT一下涨到4秒以上。我们第一反应是GPU不够了但看了利用率A100利用率才62%理论上不该这么卡。后来才想明白问题出在预填充prefill阶段。这批任务都是长上下文会话此前积累了几万token的对话历史。每次模型生成前都需要把完整的上下文重新处理一遍也就是预填充这个阶段是算力密集型的而且和生成阶段不同预填充没法用KV Cache加速——如果Cache没命中就得从头算。当几十个长会话同时进入新一轮推理时预填充产生的算力需求是锯齿状的瞬间能把GPU的算力池抽干但平均利用率看起来又不高。这就好比一个餐厅平时炒菜师傅一桌一桌炒每桌两三个菜节奏稳定。突然来了几十桌团餐每桌20个菜虽然厨房总炉灶利用率不算高但备菜区瞬间被塞满了所有桌的上菜时间都被拖长。2.2 第二层状态不是内存是巨大的KV Cache继续往下查我们发现推理实例的OOM内存溢出次数开始飙升。K8s的HPA自动伸缩在CPU达到75%时触发了扩容但新起的Pod从拉到就绪要50秒vLLM加载模型又花了2分钟。这期间老Pod已经被压垮大量请求排队。等到新实例起来又要把Redis里的会话状态拉回来重建上下文推理服务还得重新计算KV Cache这又加剧了预填充的压力。这里有个关键认知智能体的“状态”不是几十KB的业务数据而是几MB甚至几十MB的KV Cache。以128K上下文的模型为例光KV Cache就能占几个GB显存。传统无状态设计里调度器随便找个实例塞进去就行但智能体调度里如果新实例没有对应会话的KV Cache就得消耗大量算力“重新理解”整个会话历史。会话越长这个代价越大。我们后来统计长会话超过50K token的推理请求有40%的算力消耗在重复预填充上——同一段历史被不同轮次反复解析。2.3 第三层网络I/O模式——从“同步调用”到“扇入扇出”另一个被忽略的瓶颈是网络I/O。传统API网关的模型是“一进一出”请求进来响应出去。但Agent一旦开始执行工具调用网络模式就变成了复杂的扇入扇出fan-in/fan-out。我们的一个工单处理Agent跑一个完整流程时先后调用了17个内部服务每个服务可能还会回调错若干次因为工具结果要送回模型重新评估期间还夹杂着两次大模型的反馈调用。这些调用互相之间有的可以并行有的必须串行还有的要监听Webhook。单个Agent实例瞬间会维持几十个挂起的连接等待各服务响应。更麻烦的是很多服务是同步阻塞的它们自己也会往下游继续调用。最终形成的是一张多层级调用树。传统负载均衡器只看单次请求的源和目的地遇到这种跨多个服务的树状依赖要么超时设置冲突要么连接池被打满。我们排查时发现基础网络组件没崩但各个服务的连接池和线程池此起彼伏地报满因为一个Agent的等待会在多个服务上同时占着资源形成一种“分布式死锁”——每个节点都健康但任务就是推不动。2.4 第四层可观测性黑洞——链路易碎日志成山最痛苦的是排查过程。传统微服务的链路追踪Trace是固定路径的A调B调C链路清晰。但Agent的执行路径是动态的模型决定下一步调哪个工具路径本身不可预测。我们用SkyWalking和Jaeger打出来的Trace断成一截一截的Agent运行时和工具调用之间缺了关联ID工具调用的上下文跟模型推理的prompt又对不上。日志量更是爆炸。因为Agent会把每一步思考过程thought都记录下来一个复杂任务的日志能达到几百MB。如果你想从日志里还原“这个Agent为什么选择了这个工具”基本等于大海捞针。我们当时用了四五个小时反复在日志条目里搜关键词才定位到根因某个上游服务更新后返回了带特殊符号的字段Agent把它塞进后续prompt后触发了推理服务的分词器异常导致生成卡死。这段经历让我确信智能体基础设施的可观测性不能再假设“链路是静态的、日志是纯文本的”。你需要的是事件序列级别的记录以及围绕“会话上下文”而不是“请求ID”来关联所有操作。3. 给智能体建基础设施的五个设计原则含选型参考事故之后我们花了一个多月复盘把智能体基础设施的设计原则重新梳理了一遍。这五条不是理论推演是从真实的崩溃里长出来的教训。3.1 原则一状态要“可搬移”而不是“可访问”传统架构里状态放在Redis或数据库谁都能访问这没问题因为状态小、读取便宜。但智能体的状态主要是KV Cache和会话上下文它们不是便宜的数据是昂贵的推理资产。我们的做法是给会话状态增加了“搬移”语义不再默认所有实例都能访问Redis里的上下文而是把KV Cache视为与某个GPU实例绑定的亲和性资源。调度器在决定把某条会话的下一轮推理放到哪台机器时会优先考虑已经缓存了该会话KV Cache的实例即使这个实例当前负载偏高。只有当缓存命中率太低或实例过载时才允许在其他实例重建缓存。选型上我们在对比了几个开源项目后最终采用的做法是用vLLM的Prefix Caching功能做跨请求的自动缓存再在自定义调度器里读取vLLM暴露的cache hit指标来做路由加权。效果很直接长会话场景下重复预填充的比例从40%降到了18%TTFT的P95从2.3秒回落到0.7秒左右。3.2 原则二调度器必须理解DAG而不只是资源水位K8s原生的调度器是按“资源请求量”来的CPU多少、内存多少满足就调度。但智能体的任务天然是一个DAG有向无环图先调用A服务拿到结果才能调B服务B服务的结果决定是继续C方案还是D方案。资源水位看不到这层结构。我们在这块走了不少弯路一开始想直接改K8s调度器发现太重了。后来调整思路在Agent运行时之上做了一个任务编排层它不负责“容器放哪”而负责“步骤资源怎么预留”。每个Agent任务进来先做一次执行路径预分析基于历史数据估算后续步骤的算力需求然后向推理集群预留对应的“步骤预算”。如果预分析发现当前算力不足以支撑后续分支就把任务排队而不是让它跑起来之后才到处抢资源。这个层我们用的是一个内部实现的DAG调度器底层把预算分配抽象成“token信用额度”每个Agent任务按预估消耗领取额度用完可以申请追加但超额前必须经过一次“是否值得继续”的检查。这套机制把突发任务的级联效应限制在了单任务范围内不再像以前那样一个任务失控拖垮整片集群。3.3 原则三自动伸缩要按“意图”计不要按“QPS”计传统HPA按QPS或CPU伸缩在智能体场景下会反复误判。原因是同一时刻的QPS高并不代表算力消耗高反过来QPS不高但上下文巨长的请求也能把GPU干爆。我们试过按“活跃任务数”伸缩效果比QPS好但依然不够因为活跃任务数接近上限时会一次性触发大量扩容等实例就绪任务已经排队到超时了。最后我们定的指标是**“并发推理token吞吐率”——也就是每秒实际进入模型处理的token总量加上“待处理token队列长度”**。这两个指标直接反映推理服务的真实压力。配合上对任务DAG的预分析我们能做到“任务还没到推理阶段扩容信号就已经发出”。实测下来伸缩误判率降低了60%多而且扩容提前量从原来的“事后补救”变成了“事前准备”。这里要留意别只看推理侧的指标工具调用侧的线程池使用率和外部API的P99延迟也要纳入伸缩信号。有时候瓶颈不在模型在Agent调用的下游服务但表现出的现象是推理任务排队变长。我们吃过这个亏所以后来把Agent运行时的线程池水位和下游依赖的健康度一并接入了伸缩判断。3.4 原则四故障域的尺度需要重新定义传统微服务故障域是“实例/容器”一个Pod挂了用户请求被路由到别的Pod就行。智能体这边不行它的故障域是会话。如果承载某个长会话上下文和对应KV Cache的实例挂了丢掉的不只是执行进度还包括经过多轮工具调用、用户反馈累积下来的宝贵上下文。我们的用户场景里一个客服Agent处理到第15轮时前面的轮次里有用户明确说过的偏好、有历史工单的关键结论全在上下文里。实例一挂这些全得从头来。所以我们对故障域的要求是会话级别的热迁移能力或者说至少要能保证“优雅降级”——实例挂掉时自动把会话进度做Checkpoint保存然后新实例加载Checkpoint继续跑而不是让用户重新开始。实现上我们把会话的每一步包括模型输出、工具调用结果都异步写入一个事件日志这个日志本身是幂等的重放之后能还原执行状态。听起来像事件溯源对就是把事件溯源的思想用在了Agent会话管理上。这个改造的工程量不小但做完之后我们Agent任务的“可恢复率”从0提升到了75%以上——剩下的25%是外部API副作用无法恢复的场景这个后续再说。3.5 原则五数据布局要贴住模型而不是贴住CPU最后一个原则可能是最容易被忽视的。传统数据密集型应用的优化方向是“数据离CPU近”所以有各种缓存、局部性调度。但智能体的瓶颈在推理推理的瓶颈在显存/内存带宽。所以我们的优化方向变成了“数据要离GPU近”。具体来说我们把和推理强相关的数据——embedding向量库的索引分片、KV Cache的缓存池、甚至常用工具返回的标准化结果——都尽量和推理实例放在同一台物理机或同一个可用区。坐标调度上我们把机架感知引入进来推理实例和它依赖的数据分片优先落在同一个交换机域内减少跨网络的数据搬运。这个原则看起来简单做起来很琐碎因为涉及的问题非常多数据分片怎么跟GPU亲和、冷热数据怎么分层、多副本一致性怎么保证。但方向是明确的智能体的关键路径是模型推理一切不为推理服务的东西都应该让路而不是反过来。4. 我们自己验证过的路线从会话编排到量化排队的落地实战原则清楚了落地才是难点。这一节把我认为最有复用价值的几个具体方案写出来包括我们踩过的坑和可以照抄的配置。4.1 会话级缓存编排让“重复理解”消失第一个落地是会话级缓存编排。我们选型的时候对比了vLLM的Prefix Caching、SGLang的RadixAttention还有专门的KV Cache pool方案。最终结论是如果你的推理服务以vLLM为主先用好Prefix Caching再考虑更重的KV Cache池。vLLM的Prefix Caching原理是自动缓存已经处理过的token序列如果新请求的prompt前缀和历史缓存匹配就可以跳过预填充。对智能体场景同一会话的后续轮次天然共享前缀这几乎是为Agent量身定做的。但默认配置下缓存命中率并没有我们预期的那么高原因是一次请求里如果带了工具调用结果或系统提示词的小幅变动前缀就算不上了。我们的解决方法是把系统提示词和固定内容放进一个“stable prefix”区域让每次请求的这部分内容保持一致动态变化的部分全部追加在开头或末尾而不是穿插在中间。调整之后缓存命中率从31%提高到了62%。一句话总结这个优化几乎不花钱纯粹是工程习惯问题建议所有Agent平台先做这一步。4.2 KV Cache感知的路由与调度让长会话不被冷落有了缓存还得让请求尽量打到有缓存的实例上。我们自己实现了一个轻量的“Cache-Aware Router”逻辑很简单Agent运行时在发起新一轮推理时先查一下Redis里的会话元数据看最近在哪台实例上跑过如果那台实例的健康度尚可就优先把请求路由过去。这个方案最大的坑是亲和性堆积某些热门会话总是路由到同一批实例导致这些实例的负载越来越高而冷实例闲着。后来我们加了一个容忍度设置如果目标实例的当前负载超过某个阈值我们设为集群平均负载的1.4倍就不再强制亲和宁可去其他实例重建缓存。这一下把亲和和负载的平衡做了出来。具体参数上我们的路由逻辑是这样的伪代码简化版def route_to_inference(request): session load_session_meta(request.session_id) candidates list_available_inference_instances() if session.get(last_instance) and session[last_instance].health_ok(): inst session[last_instance] if inst.current_load() 1.4 * cluster_avg_load(): return inst # 找拥有最长共享前缀缓存的实例 return max( candidates, keylambda i: prefix_cache_match_length(i, session[context_hash]) )这个路由层放在Agent运行时的上游本身无状态可以水平扩展。我们加了之后长会话请求落到正确实例的比例从40%提升到81%跨实例的上下文搬运次数大幅减少。4.3 用任务队列语言统一编排让每个动作可重试、可追溯前面提到Agent的执行路径是个动态DAG这让调试和恢复变得很难。我们的应对方案是用一种“任务队列语言”来统一描述Agent的每一步动作把每一步抽象成一个可重试的原子任务。听起来很高大上做起来其实不复杂Agent每决定调用一个工具或生成一段回复就把这个意图封装成一个任务对象推入队列。执行引擎负责消费队列任务完成或者失败后结果写回会话事件日志再由Agent决定下一步动作。这个模式的好处非常明显任务天然支持重试。外部API超时或返回异常时任务可以按策略重试而不需要Agent额外写重试逻辑。整个执行历史都在日志里还原会话状态时只需要重放日志不需要让大模型重新思考一遍。队列自带**背压backpressure**能力。当下游全部拥堵时任务自然堆积在队列里而不是挤爆Agent运行时。我们用的是自己的轻量队列实现底层直接基于Redis Stream没有引入Kafka。因为Agent平台的体量还没到需要Kafka的规模Kafka的运维成本和交付延迟对我们来说反而得不偿失。这里也建议先别忙着重型化按自己的任务量级选最简方案。4.4 基础设施团队的工作方式要改从“容量规划”到“容量期货”最后说一个组织层面的经验。智能体基础设施和传统基础设施最大的不同是容量需求的不确定性高了一个数量级。传统业务的大促容量规划可以看历史曲线来预估但Agent任务的算力消耗高度依赖模型的决策路径这个没法用历史曲线外推。我们现在采取的方式是“容量期货”任务进来之前先根据任务类型和历史统计做一次算力预估把预估结果作为容量计划输入。比如“简单工单处理”平均要消耗5万token“复杂合同审查”平均要消耗30万token。平台根据当前在途任务和各自的预估消耗做一个未来10分钟的算力需求预测提前给推理集群打扩容信号。这个思路执行下来我最大的感受是基础设施团队的KPI要从“保障资源充足”变成“保障资源利用率与体验的平衡”。捂着一堆GPU不用是安全的但成本上不允许追着任务跑又必然出事。只有把容量管理从“事后看监控”改成“事前看意图”才能跑得稳。5. 未来12个月基础设施演进的三个节奏聊完落地说点更长远的。智能体的基础设施还远没到成熟期我们内部讨论下来未来12个月有几件事是必须推进的按节奏分为短期、中期和长期。5.1 短期0-3个月先修指标和可观测性大多数团队现在连“智能体负载到底怎么度量”都还没统一。我建议短期内先把三类指标铺到位一是推理侧的TTFT、TPOT、KV Cache命中率、预填充token占比二是会话侧的活跃会话数、平均上下文长度、每会话平均工具调用数三是工具调用侧的P99延迟、失败率、重试次数。可观测性方面别再迷信传统Trace了。你需要的是**“会话时间线”**把模型请求、工具调用、任务队列事件全部贴到同一个时间轴上前面挂会话ID这样回放问题就像看剧本——什么时候模型决定调用哪个工具什么时候工具返回了结果其中模型又是如何据此修正计划的。我们找了一圈开源工具最终自己的内部面板是用时序数据库加自定义事件聚合做的撑过了一波又一波排查。等社区里更成熟的会话级追踪方案出来再考虑迁移。5.2 中期3-9个月把调度器本身变成一个智能体这句话不是标题党。我越来越觉得基础设施的调度器也应该具备“感知和预测”的能力。现在的调度器都是基于实时指标的被动响应但智能体任务的下一步是决策驱动的调度器如果不懂决策的意图就只能事后救火。中期我们计划把调度器的输入从“容器资源请求”扩展成“任务意图描述”Agent当一个动作投入推理队列时附带上它的预估上下文增长量、可能的工具调用扇出计划、预期的外部依赖延迟。调度器根据这些信息而不是单纯的CPU/内存请求来做扩容和缩容决策。这本质上是一个规模更小、领域更窄的智能体——它做的事情就是预测下一步算力需求提前把GPU预热好。这个方向目前没有成熟的开源方案大概率需要自研。我们正在评估是否可以用强化学习把调度策略调优但还没到可以在生产环境铺开的阶段。如果你在社区看到类似项目建议先试用再评估别急着上生产。5.3 长期9-12个月及以后计费、配额和安全模型都要重构长期来看智能体基础设施对整个平台的产品形态都有影响。首先是计费模型现在的计费是按token或按调用次数但在智能体时代一个“任务”可能包含几十次模型调用和上百次工具调用平台需要一个“每任务”粒度的计费语言而不是“每API调用”粒度。其次是配额模型传统配额是“每秒请求数”智能体业务需要的是“每时段的算力预算”。一个客户可能在非高峰时段提交大量长任务这需要更灵活的预付费或后付费算力信用体系而不是简单粗暴地限流。安全模型也要改智能体要访问多个工具、多个数据源它的权限边界不仅是“API Key能调哪些接口”还要有“这个Agent任务在执行这一步骤时是否被允许把用户A的数据喂给服务B”这种上下文物级的细粒度授权。这个在传统网关上是做不到的需要专门为Agent编排设计。最后说说我个人的体会。做了将近一年智能体基础设施我最大的感触是不要把智能体当作“更复杂的微服务”而要当作“一个会自己决定怎么用资源的新物种”。传统基础设施回答的是“资源在哪里、怎么分配给请求”智能体基础设施要回答的是“资源如何随着决策动态变形、如何在推理与行动之间无缝流动”。前者的核心词是调度后者的核心词是适配。如果你正打算给Agent平台搭基础设施我的建议是别先急着堆GPU和买商用方案先从会话级缓存、亲和调度、任务队列这三件事做起它们成本低、见效快。等这三个支柱站稳了再往智能化的调度方向走也不迟。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑