端侧智能体架构。
把模型跑在用户自己的机器上,能实打实换来三样东西——每一步的边际成本归零、循环内部不再有网络往返、以及一个在飞机上也能用的智能体——外加一样它不断被当作卖点、却根本换不来的东西:隐私。你的本地智能体一旦调用日历或支付 API,用户的数据就在一个模型永远看不到另一端的请求里越过了网络。切分的依据,应当是问"循环的哪些部分为了时延必须在本地、哪些为了判断力必须在远端",并且把设备边缘当成一条恰好长得像安全边界的性能边界。
三项真实收益,外加一项会蒸发的。
本地推理已经真正可行:为智能体循环塑形的 300 亿参数开放权重模型,如今能装进一张消费级 GPU 或一台配置不差的笔记本,量化到 4 bit 上下,快到足以待在循环里面而不是循环旁边。用它们的理由很硬,值得说准确——因为清单上听起来最有力的那条,恰恰是最弱的一条。
- 边际成本归零。这是那个改变设计、而不只是改变预算的收益。当一步是免费的,你就负担得起在每个动作前跑一遍分类器、在每次工具返回后重读整段上下文,或者起草三个候选再挑一个——这些事在按量计费下你永远不会做。在 API 上不经济的循环,变成了寻常做法。
- 网络离开了内层循环。在托管模型上跑一个二十步的任务,要付二十次连接建立、排队与首令牌时延。在本地,同一个循环付的是内存带宽。哪怕托管模型每令牌更快,端到端的循环也可能更慢。
- 没网也能用。在产品是手机、车辆、车间或医院地下室之前,这一条一直被低估。
- 它不会让系统变得私密。模型只是一个部件。工具才是其余部分,而数据是从工具那里离开的。
最后这一点是本文会反复回到的地方,因为它正是"能在你的设备上跑"这类发布,在其上构建的系统里稳定产出的那种失效。
循环有五个部分,每一个本地化的理由都不同。
"端侧智能体"不是一个架构选择,是五个;把它们当成一个整体打包,正是团队最终做出"在贵的地方本地、在敏感的地方远端"的智能体的原因。把智能体循环拆开看:
- 模型。为成本与时延放本地。这是所有人嘴里说的那部分,也是五者中与安全关系最小的一个。
- 索引与记忆。放本地,因为敏感语料本来就在那儿——邮件、笔记、文件、消息历史。端侧索引是这套架构里最硬的隐私主张,而且它并不需要一个本地模型,只需要一步本地的嵌入。
- 工具执行。基本在远端,因为工具是别人的服务。这就是出网路径,而没有任何一种"端侧"能把它去掉。
- 策略检查。放本地方便,放远端才可执行。一个住在用户机器上的额度,是一个用户的机器可以被劝着忽略的额度。
- 会话状态。默认本地,对隐私好,对连续性坏——没法交接到另一台设备,出事时服务端看不到,而且除了你自己写到磁盘上的部分,也谈不上可恢复性。
按"放到远端会坏掉什么"给这五项排序,答案是:模型——成本与速度;索引——隐私;工具——什么都不坏,它们本来就在远端;策略——什么都不坏,远端反而更好;状态——连续性。这份清单上只有一行是隐私那一行,而它不是模型。
时延是设计的驱动因素,而它在设备上的表现不一样。
托管部署优化吞吐,因为它要用一张 GPU 服务很多用户。设备只服务恰好一个用户,也没有队列,这就把几个熟悉的取舍翻了个个儿。
投机解码在这里赢,在数据中心里输。它用额外算力换更低的每令牌时延,所以在空闲的个人 GPU 上几乎免费,在繁忙的共享 GPU 上则是吞吐的倒退——一个默认开着投机解码出货的模型,等于在告诉你它预期被独占运行。见投机解码。
预填充是你能感觉到的那笔开销。在设备上,解码受内存带宽约束,预填充受算力约束,而智能体循环每一步都要重读一段不断增长的上下文。没有缓存复用的话,第十二步要为前十一步产出的一切买单。各家本地运行时在"跨调用是否保温 KV 缓存"上差别很大,而且没有一家能跨应用重启保住它,于是恢复一段会话就要重付一次完整预填充。要为它显式做预算——这就是预填充、解码与 KV 缓存里描述的机制,只是把托管服务商的前缀缓存拿掉了。
GPU 是你自己的时候,稠密胜过稀疏。专家混合模型按被激活的专家计算算力、按全部专家计算显存,这在租来的算力上是笔划算买卖,在一张 24 GB 的卡上则是一次昂贵的误判。70 亿到 300 亿区间的稠密模型之所以是端侧的天然选择,正是这个原因;见专家混合(MoE)。
空闲之后的第一个令牌,才是用户评判的那一个。权重会被从内存里赶出去,运行时要冷启动,于是一个"本地所以即时"的智能体,要花九秒才说得出你好。让一个小模型常驻、按需把大模型调进来,通常比一个从来热不起来的中等模型体验更好。
升级闸门,以及它为何该是一条静态规则。
几乎每一个认真的端侧智能体都是混合式的。有意思的设计问题是"什么把活儿送出设备",而那个诱人的答案——让本地模型自己判断任务是不是太难——是错的。难度估计本身就是一个困难的判断,它由那个你本来就不太信任的部件做出,而且它的失效方向恰是代价最大的那个:一个不知道某条规程的模型,同样不知道自己不知道。
改成按动作的静态属性来路由。实践中站得住的规则是凡是会绑定用户的,就升级:
- 任何不可逆的动作——购买、发送、删除、预订。
- 任何受成文规程约束、且需要在有人与它争辩时始终遵守的事。这是小模型差得最远的一条轴,差距很大,靠多少提示词都补不上。
- 任何会以"用户所写"的名义展示给第三方的内容。
- 任何"错了很贵、慢了不贵"的事。
其余的——分类、抽取、摘要、起草、排序、决定先试哪个工具——都留在本地。这是一张你能读、能测、能审的路由表,而一个学出来的难度估计器不是。这与模型路由与级联从成本一侧得到的结论相同:按任务的静态路由拿下了绝大部分好处,却没有那份脆弱。
本地模型还有一个更安静的角色,值得刻意设计进去:站在网络前面当门房。一个用来判断"这个请求究竟需不需要远端模型"的本地预分类器,是混合式智能体里杠杆最高的部件,因为它是唯一能把一次计费调用变成零次调用的东西。
你实际拥有的那条信任边界。
把真实的边界画出来,好几个假设会同时崩掉。
本地模型、远端工具,同一个泄漏。一个在本地读用户邮件、随后调用某个托管工具——日历 API、地图查询、支付端点——的智能体,已经把用户数据放上了网络,而那个请求的内容,用户从来没有逐条批准过。把推理放在本地只去掉了一条出网路径,其余每一条都原封不动待在原处。管住这件事的是出网策略,不是部署位置;见智能体的出网管控与数据驻留与数据主权。
本地索引成了皇冠上的宝石。把邮件、文件与消息历史归拢进一个内嵌向量库,会造出一份此前并不以这种形态存在的资产。设备上任何进程都能读它,而且不像服务端存储那样有访问日志、有吊销、有事故响应。用绑定到操作系统钥匙串的密钥做静态加密,并且想一想一次设备备份里都装了什么。
提示词注入在端侧是更糟,不是更好。智能体用用户自己的凭据去读用户自己那些不可信的内容——陌生人的邮件、下载的文档、网页——中间没有一个服务端代理可以检查或拒绝。提示词注入防御里每一项依赖收敛点的缓解措施,都必须在客户端重做一遍,而攻击者可能也正站在那儿。
你没法吊销。一个被攻陷的服务端智能体,离被停掉只有一次部署。一个被攻陷的端侧智能体,离被停掉隔着一次软件更新,而且卡在用户装不装上。把紧急开关设计成客户端去查询的服务端能力检查,而不是一个客户端标志位,并且接受一件事:离线的设备听不见它。
运营一支你看不见的机群。
架构那部分是容易的一半。运维那一半在于:你为托管智能体所依赖的每一项做法,都假定机群归你控制,而现在你有的是一支只能向它提问的机群。
- 版本歪斜是永久的。托管智能体跑一个版本。出货的智能体跑的是任何人拒绝更新后留下的每一个版本,在你没挑过的硬件上,以运行时替他们选定的量化精度。"这条追踪是哪个模型产出的",从一个你知道的事实,变成一个你必须记录的字段。
- 回滚不是一个按钮。灰度与版本化那套纪律依然适用,但单位是一次应用发版,时间线以天计。把行为用服务端特性开关控住,这样你不必下发新权重也能改变本地模型被要求做什么。
- 追踪受同意约束且稀疏。你看到的会是一个有偏样本:选择了加入的那些用户,以及不成比例地、事情糟到愿意来报告的那些。把本地智能体做成能在设备上保留一份丰富追踪、用户一步即可导出,并围绕这次导出而不是围绕你收不到的遥测来设计失败路径。
- 按硬件档位分别评测,而不是只测一次。同一份权重在笔记本上 4 bit 与在工作站上 8 bit,从评测角度就是两个模型;而量化是先劣化指令遵循、后劣化流畅度——恰恰是你的评测集最不容易注意到的那种失效。
- 经济账翻转了。没有按令牌的账单,却有支持成本、安装包体积、电量预算,以及一整类你如今默认要支持的硬件。把它当成计价表被挪了位置的单位经济来建模,而不是当成免费。
从切分出发,而不是从模型出发。把索引放到设备上,因为那才是真正成立的隐私主张;把模型放到设备上是为了成本与时延,就诚实这么说,别管它叫隐私。把升级规则写成一张按动作属性列出的静态清单——不可逆、受规程约束、会被第三方看到——并且把它留在代码里,好让人能评审。然后写下你的出网清单:智能体能触达的每一个主机,逐个工具地列。如果那张清单很长,那么设备边界只是装饰,而这个季度真正值得做的活儿在清单上,不在权重上。
相关:小模型与本地模型谈如何挑模型本身,为智能体自建推理是这个问题在服务端的孪生兄弟,智能体设计模式全景看混合切分在其他模式中的位置,以及记忆存储谈那个端侧索引里该放什么。