时间:2025-09-05 15:38
人气:
作者:admin
我之前写过两篇如何构建 AI 应用 / AI Agent 的文章,里面涵盖了多个环节,多个领域的组件,整体的核心思路是想表达 AI 应用的本质是以 AI Agent 为表现层/推理指引层/业务入口层的一个有机系统,Sandbox,LLM,MCP,MEM,可观测等都是这个系统里重要的组成。
但是目前鲜有客户完全落地了这套系统,而更多的是使用其中某几个组件做 POC 和尝试,最常见的组合就是普通服务 + LLM,进阶一点的就是普通服务 + LLM + MCP(不带MCP Registry)。使用 AI 网关和 MSE Nacos 也有比较成熟的落地方案,所以今天通过真实案例,向大家分享再进阶一点的 Sandbox 的落地实践。
目前,LLM的使用被大众最广泛认知的还是以 Chat 模式为主,而 AI Agent 让大家体感最强的,或者说目前应用最好的是在 Coding 场景,而且每家厂商几乎都将 Coding 功能明显的展现了出来。
之所以各个厂商都在 Coding 场景落地 AI Agent,我个人认为有这么几个因素:

这里我不对整体架构做解释,我想通过落地过程中,或者说 AI Agent 场景中势必会遇到的挑战点以及解法的维度向大家做分享,然后你们再回头来看这个架构图,应该自然而然就可以理解了。
从目前看,无论是 Coding 场景,还是写 PPT 啊,文本分析啊,文生图/图生图啊等等,还是用 Chat 类型模型更加易用。包括互联网其他客户的现存业务在融入 AI 能力时,基本也都是 Chat 模式,比如一些客户的智能点餐业务,一些 CRM/ERP 厂商的智能客服,智能问数,智能 BI 等等,都是 Chat 模式。
我锚定后续出现的其他 AI Agent 的场景,大概率也都是以泛 Chat 模式为主。整体的方案架构中,会因为 Chat 模式带来额外的挑战点,所以我将 Chat 模式和 AI Agent 作为一个整体系统架构来看挑战点。
本文作为偏方案科普向文章,会尽可能用大白话表述,非常细节的内容就不在文章里赘述了。有想要针对某个点做详细讨论的同学,可以联系我和我们的团队(钉钉群号:64970014484)。
这是 Chat 模式最具代表性的一个挑战点。以 Gemini,Claude 为例,每次新建一个聊天/对话/ chat 就产生了一个新的会话:

会话发起后,你会和 LLM 进行交互,此时该会话底层就会有对应的计算资源实例在运行,提供运行环境(Runtime)。
在这个会话中,你和 LLM 的交互产生几类数据:
上述第一类数据可以存在各类数据库里,但是后三类数据在计算资源实例还在存活时,只能在实例中。这时可能会有同学要问,挂载一个文件系统行不行呢?
因为在这个场景中,数据的隔离性是强诉求,挂载 NAS 并做不到绝对强隔离,除非一个实例挂载一个文件系统,这也不实现,因为在这个场景下计算资源实例会非常多。
上述第4类数据无论如何只能是在实例级别,因为和 OS,和容器文件系统相关。
综上,在这种场景下,需要会话和计算资源实例通过某种方式绑定,每次打开这个会话,请求要路由到相同的实例,从而保证该会话生命周期里所有数据、状态的一致性。
函数计算 FC 支持三种亲和性:
在帮助客户落地时,大都使用了 HeaderFiled 亲和方式,在每个会话里发起请求时,Header 里会带着 UserID+会话 ID 作为 SessionID,实现了会话里的每个请求都能路由到相同的实例中,从而保证了会话的所有数据、状态的一致性。
除此以外,函数计算 FC 在函数级别还可以设置每个实例的 Session 并发度,即一个实例允许接几个 Session 的请求,从而满足更灵活的业务场景。

除了 AI Agent 场景,该能力在游戏场景也有广泛应用,比如 IGame 工作室的《第四纪元》游戏底层游戏服、平台服、WS 服全部使用函数计算 FC,实现游戏底层完全 Serverless 化。
在泛 Chat 类型的场景下,用户的不同会话之间,不同用户的会话之间都需要完全隔离,这是数据安全、用户隐私安全的的刚需诉求。
这里包括了以下若干方面的隔离性:

从存储机制和介质类型方面来说,无非就是两种方式:
以上两类方式在这个场景中都会用到,会在合适的场景下使用合适的方案。这个场景的存储机制包括4个核心问题:
这个问题主要源自 AI Agent Code Interptreter Sandbox 场景的不确定性特性之一,环境依赖的不确定性。既每个用户发起的 Coding 任务,都需要各种不同的依赖包,所以需要在执行任务的过程中动态安装依赖。
所以,以 NodeJS 为例,会在构建项目的过程中在node_modules文件里生成大量的各种组件、依赖的文件,并且不同项目的组件、依赖重复度较高。如果每个项目的node_modules文件都保存下来,那么存储成本压力会非常大。
大部分客户在解决这个问题时使用了函数计算FC函数磁盘+OSS 的方式。
PreStop生命周期方法中(函数实例销毁时调用),将除了node_modules文件的所有其他文件打包上传到 OSS。通过这种方式用户只需要持久化保存项目的主干工程即可,不需要将依赖都保存下来,并且在实现过程中,也不需要特意去考虑删除node_modules文件的工作,因为函数实例只要释放了,实例磁盘里的数据也就都删除了,所以用户只需要实现简单的选择文件打包上传 OSS 的逻辑即可。
但这种不存依赖的方案再恢复会话时有一定时延的弊端,这问题在下文对应章节会解释如何优化。
数据完整性问题指的是当计算资源实例出现非预期的 Crash 时,是否能最大程度的保存下来当时的各种数据。在这个前提下无疑挂载文件系统的方式是最有效的,因为整个 IO 操作都是通过文件路径实时写入文件系统的,所以在实例 Crash 的一瞬间,可能只有极少数的文件会丢失。
而云盘+OSS 的方式,因为上传 OSS 并不是实时的,所以在实例 Crash 的一瞬间,可能会丢失相对更多的文件。但是经过我们反复的技术调研、测试以及和客户的推演讨论,最终认为在 Sandbox 场景下,还是云盘+OSS 的方式是最适合的。
文件系统不适合 Sandbox 场景的核心原因主要有2个:
mount 权限,但在使用 WebShell 登录计算资源实例(仅限于神龙)时,给到用户的是root权限, 可以成功执行mount指令,挂载到文件系统的任意目录。所以再次印证了为什么 Code Interptreter Sandbox 推荐使用函数磁盘+ OSS 的方案。
这个问题源自 AI Agent Code Interptreter Sandbox 场景的另一个不确定性的特性。那就是挂载存储的路径是动态的,是不确定的。只有请求到了实例里后,才知道要挂载的路径是什么。
因为通常路径都是用户ID/会话ID/[任务ID],如果是新创建的会话,只有该会话的第一个请求进了实例,才知道完整的路径是什么。所以这就需要计算资源实例可以动态挂载存储介质,而不是先挂载路径后启动实例。并且每个实例挂载的路径都是不同的。
函数计算 FC 的在持久化方面,原本就支持在函数维度设置 NAS 或 OSS 的挂载路径,在这种情况下,该函数的所有实例都会共享该挂载路径。而现在,我们又支持了可以在实例维度动态的挂载 NAS 和 OSS 路径的能力,实现了同一个函数的不同实例,可以挂载同一个文件系统/ OSS Bucket 的不同路径。

在 AI Agent Coding 或者 Vibe Coding 场景下 ,用户可以随便写个类似云盘的项目,或者论坛的项目。所以可以随意上传文件,如果被非法利用,可能会引起被白嫖存储的问题。所以需要对每个项目可上传文件总量大小做限制。
目前文件系统虽然支持路径级别设置 Quota,但是 AI Agent Coding 这个场景下路径数量会非常多,可预见性的会有几万,十几万个甚至更多,所以需要另寻解决方案。
目前的方案有 2 个:
目前函数计算 FC 正在和 PolarFS 做产品间集成,集成后这块会直接换成 PolarFS 方案。我在这里和大家分享一下当前是如何基于函数计算 FC 的特性做的临时实现。
上文中我有提到,函数计算 FC 函数的每个实例都有自己的磁盘,最小是 512MB,也有更大的额度。当超过磁盘大小后会报错。所以目前写好的项目运行在函数计算 FC 实例中,写文件的操作是先写进函数实例的磁盘中,写入成功后,再 CP 到文件系统里。当函数实例磁盘写满报错后,就不会再对文件系统做交互。相当于用函数实例的磁盘做了一层中转,但是依赖函数磁盘 Quota 的强限制,变相解决了路径配额的问题。
会话恢复的逻辑本质上是比较简单的,但是这部分涉及到效率问题也涉及到记忆问题,所以结合函数计算 FC 的特性和大家作以分享和探讨。
上文中提到了,会话底下的 Code Interpreter Sandbox 这部分使用的是函数实例磁盘+OSS 的存储方式,所以当会话需要恢复时,需要有2部分的数据需要恢复:
LLM输出的这一大堆文本(上下文),可以选择使用一些记忆组件,也可以选择关系性数据库做存储。
代码工程文件自然是从 OSS 中下载解压做恢复,但是前文中说了node_modules并没有存储,所以在会话恢复过程中,有一部分耗时的地方就是要重新下载安装依赖。这也是我说的效率问题。
这部分如果想要从根本解决效率问题,就得把所有的依赖文件都存下来,但是面临巨大的存储成本压力,多金土豪的客户自然可以用这种方式。但我相信绝多大数客户还是会在效率和成本之间寻找一个平衡的解决方案。
我们目前的做法限制用户可以在1小时内快速恢复会话,超过1小时后就会慢一些:
会话网络管理本质上就是会话底层计算资源实例的网络管理,最核心的其实就是 IP 分配的问题。
函数计算 FC 作为 Serverless 计算产品,自己有足够大的资源池,函数实例不会使用用户的 IP,并且底层容器的调度和 K8s 也是完全不一样的,而且在安全组方面,相同的 uid+role+vsw+vpc+sg 是复用一个 IP 的,和函数数量没关系,和实例数量也没关系,所以无需客户做任何事情,可以完美解决上述的问题。
在 Vibe Coding 环境中,当一个完全不懂编程的人,只靠一些想法,通过一些平台就可以完完全全实现出来,我觉得除了自己很兴奋外,应该会立马想把自己实现的产物分享给自己身边的朋友,无论是以什么目的做的分享,我相信这份成就感是无与伦比的,这也正是 Vibe Coding 性感的地方之一。
现在很多 AI Agent 产品主打的就是生成完整的项目,可以直接运行的项目,分享出去后可直接使用的项目,所以都会有类似发布分享的功能。大家可以想象一下,当一个由 LLM 写出来的项目,被发布了以后,其实它和什么 AI Agent,Sandbox 就没有任何关系了,运行这个项目的底层计算资源其实就是一个传统的 Server。
但这个传统 Server 面临着不普通的挑战点:
我用大白话将上述挑战点翻译成客户的需求:分享出去的项目对应的资源要相互隔离,互相不影响,项目没请求的时候不要给我拉起资源,有请求时再拉起资源,而且资源可以根据 QPS 量快速横向扩容,而且扩出来的实例可以共享存储,保持项目的状态一致。
从最根本上讲,就是成本的问题。这是标准的 Serverless 形态计算资源解决的问题,所以函数计算可以 FC 完美的解决这个变态的场景。
爆款项目这个场景很类似我们以前做的一些RTA场景(某客户RTA场景高峰期70w QPS,低峰期30w QPS,QPS 方差达到 40w),或者像高德这种 QPS 有明显波峰波谷且方差比较大的场景。
这个需求本质是因为 AI Agent 场景下的 Sandbox 执行什么样的任务是不可控的,比如有的任务就是简单的推理、查询等,对 CPU 和内存的消耗不高。但有些任务是处理文件、处理音视频,这一类的任务就是 CPU 密集型的场景,要求更高的 CPU 和内存规格。
如果是在同一个函数下的话,就需要函数的实例可以纵向扩容,函数计算 FC 的基础架构底层是支持的,但是没有对应的计费逻辑,或者说这样对客户来说计费逻辑会很复杂,所以目前函数计算 FC 从对外透出的产品能力上并不支持 VPA。
目前给推荐客户的方案如下:

项目做分享这个功能需要涉及到以下几个核心的点:
基于以上这些核心需求,引入了云原生 API 网关做统一的南北向流量入口管控。
通过 Sandbox 与 Serverless 的深度融合,AI Agent 不再是“黑盒”实验,而是可被企业精准掌控的生产力工具。这种架构不仅适配当前 AI Agent 的动态交互特性,更为未来多模态 Agent、跨系统协作等复杂场景提供了可复用的技术底座。
若您的企业正面临 AI Agent 规模化落地的挑战,不妨从 Sandbox 架构入手,结合函数计算 FC 的Serverless能力,快速验证并构建安全、高效、可扩展的AI应用系统。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。





