基础设施赌注:从单体仓库到可复现环境

2024年初,Shopify 面临代码库分散、开发环境定制各异及反馈缓慢的痛点。为应对 AI 编写代码的趋势,公司做出了两项关键决策:将所有产品整合至名为 "World" 的单体仓库中,并全面采用 Nix 构建开发环境、CI 及生产镜像。这一基础设施层面的卫生措施旨在为 AI 提供可复现的底层支撑。尽管迁移过程痛苦且导致 CI 规模需扩大一个数量级、合并队列成为关键负载,但成功实现了跨区域的代码导航能力与完全可复现的环境一致性。这种对 Agent 友好的改造,同时也解决了人类工程师面临的知识未文档化、环境不可复现及代码库碎片化等长期债务问题,使得工程师能更轻松地理解系统全貌。

River 的公开协作机制与知识复利效应

River 作为部署在 Slack 公共频道的 AI Agent,其核心约束是禁止私聊,所有交互必须公开透明。这种设计使得每一次对话都成为可搜索、可复现的公共资产。当一名工程师通过 @river 提问时,Agent 读取代码、运行测试并返回结果;其他员工可介入提供约束或重定向,River 据此调整上下文继续工作。这种公开协作模式创造了知识复利效应:一个人的经验通过修正 River 的技能、提示词和默认设置,转化为下一个人的起点。Agent 无需重新训练模型即可变聪明,代码库教导 Agent,Agent 反过来优化代码库的使用方式,形成持续积累的智力层。这种机制确保了即使会话结束,其产生的记忆(如技能更新或文档差异)仍被保留供后续使用。

规模化数据与单体仓库的生命化转型

在最近30天的统计周期内,Shopify 内部发生了 59,918 次 River 会话,分布在 5,170 个 Slack 频道中,影响了超过 7,000 名员工。在此期间,共有 3,536 个由 River 共同撰写的 Pull Request(PR)被合并。这些数据显示了 Agent 在大规模工程中的渗透率。单体仓库 "World" 不再仅仅是代码存储,而是演变为一个包含技能、惯例和意图文档的活体系统。River 作为激活这一系统的火花,使得每次问题解决都留下“记忆鹅卵石”。随着其他团队(如 PR 审查、合规扫描等)开始请求类似的 Agentic 工作流,Shopify 意识到需要构建一个能支撑“一百个 River”的平台抽象层,以应对从单一 Agent 到多 Agent 工作流的扩展需求。

大脑与双手的解耦:安全、可替换性与可观测性

Anthropic 在 2026 年 4 月提出的观点——将 Agent 的“大脑”(决策模型)与“双手”(代码运行沙箱)解耦——验证了 Shopify 内部早已探索的方向。这种分离不仅让对话安全存储,更确立了 Agent 长期运行的形态基础。Aquifer 是 Shopify 的内部 AI Agent 运行平台,作为底层基质(substrate),它包含了会话、沙箱网关、凭证代理及可观测性管道等组件。其核心设计约束极为简单:一切其他架构均源于此,且会话必须存活。正如河流塑造世界而含水层蓄水,Aquifer 负责持久化数据,River 则是其上的一个配置文件(profile)。

在这种架构下,会话被分解为三个独立部分:Session 是基于 Postgres 的持久化身份和只追加事件日志,记录“已发生的一切”;Harness 是 Agent 循环逻辑,负责读取历史、调用模型并生成工具意图;Sandbox 则是代码实际运行的环境,包括文件系统、Shell 和仓库。关键在于 Harness 位于沙箱之外,Agent 不居住在代码运行的地方。这一物理隔离带来了三个无法通过其他方式获得的属性:安全性(Agent 循环不在 rm -rf 的爆炸半径内)、可替换性(可在不干扰沙箱的情况下更换模型、运行时甚至语言)以及 可观测性(整个决策流集中在 Harness 端,便于统一监控)。> Decouple the brain from the hands.

会话细胞:牛群而非宠物(Cattle, not Pets)

当会话启动时,系统会实例化一个 Session Cell(会话细胞),这是一个在主机上运行 Go 运行时和 Agent Harness 的临时进程。如果处于空闲状态,该进程会退出;下一次交互时,系统会在同一或不同主机上启动一个新的细胞。尽管进程是短暂的,但 会话身份保持不变,且所有对话历史均完整保留。工作之所以能接续进行,是因为数据存储在 Postgres 中而非内存里。这种设计体现了 “牛群而非宠物”(Cattle, not Pets)的原则:我们不精心照料单个进程,而是基于低成本基质进行配置、运行、暂停和销毁。因此,具体使用哪种编排器并不重要,重要的是选择端到端基质并坚持这一原则。

River 只是 Aquifer 上的一个配置文件,其他如 PR Review(代码审查)和 Vanilla(无头 Agent pi)也是平级的配置文件。一个 Profile 本质上是一组数据:系统提示词、技能集、扩展程序、沙箱策略和模型默认值,所有这些都通过 Nix 构建并打包分发。添加新 Agent 产品只需新增 Bundle,而非重建平台。同一套对象支持三种截然不同的消费者模式:

消费模式 描述特征 会话性质
Mode · Interactive (River) 交互式,实时人类参与,长期存活 Durable session
Mode · Automation (PR Review) 自动化,由外部系统唤醒,通常无人类介入 Durable session
Mode · Job (CI, Batch) 作业型,临时性,配置、运行、流式传输后销毁 Ephemeral

这种架构的重要性在于,每当尝试不同体系时,最终都会重新发明这三种模式之一。该基质支持 持久的、线程化的多人游戏式对话,Agent 作为一等公民参与真实代码库和数据仓库的交互。River 是可见部分,而 Aquifer 是为了复制更多此类产品所构建的平台。

未来展望:会话必须存活的核心赌注

River 约两个月前发布,Aquifer 正逐步在其下 rollout。虽然使用数据已迅速增长甚至过时,但核心问题仍如 Robert Macfarlane 2025 年著作标题所言:“河流是活的吗?”(Is a River Alive?)。我们尚不知晓所有演变,但清楚其运作方式。River 是当底层基质学会流动时发生的事;Aquifer 负责记忆,Slack 线程则是工作浮现的表面。在这个叙事中,“River”本身成为了一个动词。Shopify 的未来 Agent 产品不再是新平台,而是新 Bundle。每个新产品都自带持久会话、网关、沙箱和多人协作语料库。下一个类 River 产品的成本不再是构建新平台,而仅仅是定义一个新的 Profile。这就是解锁点:两年后,这将成为每个有趣产品下枯燥的假设。

对于构建 Agent 基础设施的团队,有三项优先事项:首先,将大脑与双手解耦,坚持 Harness 不在沙箱内的边界,否则安全性、可替换性和可观测性将成为权衡而非必然;其次,通过构造使 Agent 具备多人协作能力。私有 Agent 有天花板(仅限键盘前的人),而公共 Agent 能让后续每个会话受益,语料库是复利资产,Agent 线程的隐私反而是劣势;最后,将下一个 Agent 视为 Profile 而非平台。如果第二个 Agent 迫使您构建第二个平台,说明基质尚未建成。> To

结论

Shopify通过构建Aquifer平台与River Agent,验证了“大脑-双手”解耦及公开协作机制在大规模工程中的有效性。其核心优势在于利用Nix与Postgres实现环境可复现性与会话持久化,结合“牛群而非宠物”的无状态设计,确保了安全性、可替换性与多用户协作能力。59,918次会话与3,536个合并PR的数据证明了该架构在单体仓库“World”中的高渗透率与知识复利效应。

然而,该方案高度依赖统一的单体仓库基础设施及严格的公开透明约束。其适用条件为具备强大底层基质支持的企业级场景,通过Profile化降低新Agent构建成本。短板在于对私有协作模式的限制及初期迁移的高昂代价,尚未证明在碎片化代码库中的通用性。