艾2的头像
Shippy 是一款专为高风险决策而构建的海事人工智能智能体,错误的答案会产生真正的影响。以下是其背后的架构,以及我们在 Ai2 的其他环境平台中汲取的经验教训。
Shippy 回答有关加纳专属经济区的实时询问。响应显示了其工作:边界源、数据截止、查询时间戳以及返回 Skylight 地图的深层链接,以便分析师可以验证每个数字。
为保护海洋等高风险操作领域构建人工智能智能体首先是一个可靠性问题。对于海事分析师来说,错误的答案可能会使巡逻船驶向错误的方向数英里,从而耗费大量本已捉襟见肘的资源,并可能使人员受到伤害。
因此,当 Skylight 团队着手构建 Shippy(我们的用于实时海域感知的人工智能)时,真正的工作并不是模型。它正在构建一个我们可以信赖的系统,该系统是正确的,不会超出其限制,并且能够胜任广泛的任务。我们必须根据 Skylight 的实时数据来验证所有这些数据,这些数据随着新的卫星和船舶信号的到来而不断更新,而不是静态快照。
我们将像 Shippy 这样的智能体视为三件事:灵魂、技能和配置。
灵魂是塑造 Shippy 角色并设定行为界限的系统提示。技能告诉 Shippy 如何处理特定类型的请求。灵魂和技能一起融入到 Docker 镜像中——一个版本化的、可部署的工件,定义了 Shippy 是什么。 Config 涵盖了其他所有内容:要运行哪个智能体工具(在 Shippy 的例子中是 OpenClaw,一个开源智能体框架)、要使用哪个 LLM(目前,Shippy 依赖于 Claude Opus 4.6)以及运行时设置。 API 密钥等秘密是在运行时注入的;交换模型或线束是配置更改,而不是重建。
Shippy 的技能遵循 Claude Code 和 Codex 等编码工具使用的相同智能体技能规范 - 带有结构化 frontmatter 的纯 Markdown 文件。这使得每项技能都易于理解、版本化且易于修改。 Shippy 目前包含以下技能:
例如,Skylight API 查询技能对回答有关特定区域的问题的完整工作流程进行了编码。当分析师或用户询问“显示上个月巴拿马专属经济区的特定经济活动活动”时,该技能的说明会指示 Shippy 首先通过 Skylight 的区域 API 将“巴拿马专属经济区”解析为边界多边形,而不是猜测或硬编码坐标,然后查询该几何图形内的特定经济活动事件,使用返回 Skylight 地图的深层链接格式化结果,并对从 Skylight 合作伙伴(例如 Global Fishing Watch 或 TMT)提取的任何船只元数据进行归因。
向 Shippy 提出的一个问题可以同时涉及多种技能。 “科伊巴山脉海洋保护区附近有船只在作业吗?”利用 Skylight 技能进行数据查询、我们的合作伙伴 ProtectedSeas 的 MPA 边界上下文数据库以及用于解释船只行为的船只跟踪技能。所有这一切都发生在一个对话回合中。
灵魂定义了 Shippy 会做什么和不会做什么。它不会对船只是否违法做出法律决定——这是由人们而不是智能体人做出的决定。它也不会进行超出数据支持范围的推测。这些边界在系统提示中是明确的,而不是在微调中隐含的,这使得它们可审计且易于修改。
智能体是不确定的。您无法控制模型决定做什么,但您可以使其使用的工具可预测。为此,Shippy 通过调用 API 的专用 CLI 与 Skylight 进行“对话”,而不是自行发出原始调用。
我们的 API 具有数十种输入类型、嵌套过滤器对象、分页光标和复杂的几何输入。在早期原型中,我们让 Shippy 从头开始构建 API 调用。它产生了源源不断的细微错误:格式错误的分页会默默地删除结果、几何编码错误以及由于误解的过滤器类型而返回错误数据的看似正确的查询。
Skylight CLI 将这种复杂性压缩为可预测的界面。 Shippy 发出单个命令 - 使用类型化过滤器标志进行天窗事件搜索 - CLI 处理身份验证、分页和结构化输出。 CLI 也是自我记录的:大量的 --help 文本和详细的错误消息为智能体(和人类开发人员)提供了足够的上下文来从错误中恢复,而无需猜测。其输出始终写入本地 JSON 文件,而不是通过 shell 进行管道传输。早期,大型结果集会达到管道缓冲区限制或破坏 jq 等下游工具。写入磁盘可以避免这两个问题,并允许智能体在后续步骤中以编程方式访问查询结果。
CLI 的底层是一个标准化的 API:多种资源类型——Skylight 事件、船舶、区域、卫星图像、船舶轨迹等——可通过一对通用的操作、搜索和聚合进行访问。 API 的输入和输出被定义为具有字段级描述的类型化模式。
这种分层(类型化 API、确定性 CLI 以及引用 CLI 命令的智能体技能)意味着 Shippy 的每个组件都可以独立测试。 API 有自己的测试套件。 CLI 可以由人或智能体执行。智能体技能参考了处理管道的 CLI 命令,这样 Shippy 就不必在每次访问 Skylight API 时重新发明轮子。每一层都会缩小下一层可能出错的范围。
Skylight 为 70 多个国家/地区的数百家政府机构和非政府组织提供服务。菲律宾的一名渔业官员拥有其 Skylight 帐户范围内的感兴趣区域、船只监视列表和警报配置。当他们向 Shippy 询问问题时,智能体的 API 调用需要返回他们的数据,并且他们的对话历史记录绝不能对其他人可见。
每个用户都在自己短暂的、孤立的会话中与 Shippy 进行对话,并使其大规模可靠地工作是该项目背后最重要的工程工作之一。我们构建了 Mothership,一个智能体托管平台,为每个用户会话提供专用的 Kubernetes 部署。当用户打开对话时,系统会启动一组打包智能体运行时、其技能和 Skylight CLI 的 Pod。用户的 Skylight JWT 在配置时注入,因此智能体的 API 调用范围仅限于该用户的数据。
智能体在多步骤分析期间写入的文件仅存在于该会话中,并且永远不会在用户之间共享。在沙箱内,智能体可以编写和运行代码、安装依赖项、提取数据集并进行多步骤分析。在网络级别,沙箱仅限于其所需的服务。
大多数基准测试都会在静态问题上对通用人工智能进行排名。它们不会捕获智能体连接到真实工作流程后的行为方式:它如何选择工具、查询实时数据、对结果采取行动以及知道在哪里停止。因此,我们围绕 Shippy 的工作原理构建了自己的评估系统,根据实时数据对整个智能体(模型、技能和沙箱)进行评分。
在我们的评估框架中,主题专家编写场景和评分标准,选择适用于每项任务的标准并设置权重,以便每项任务都根据对其真正重要的内容进行评分。例如,钓鱼事件查询最看重数据准确性,其次是边界分辨率和时间范围,其次是源归因和响应方式。他们还会将个人的回答注释为正确或错误,为法官提供评分依据。主题专家还会将个人回答注释为正确或不正确,为法官提供评分依据。
流程很简单:自然语言提示贯穿沙箱,LLM 法官对每个标准从 0 到 1 进行评分,并以书面形式解释为什么响应满足或不满足该标准,并根据固定的通过阈值检查加权聚合,如下图所示。
如何在我们的管道中对单个任务进行评分。自然语言提示贯穿沙箱,大语言模型法官通过书面推理对每个评分标准进行评分,加权汇总根据固定阈值确定通过或失败。
任务通过Harbor(一个开放的评估框架)执行。我们编写了一个 Harbor 插件,它可以根据用户会遇到的相同真实数据,在正在测试的确切版本上启动真实的 Shippy 会话。该套件针对特定版本的 Shippy 构建并行运行,生成带时间戳的结果文件以及相对于先前运行的分数变化报告。每当技能、模型或底层数据发生变化时,我们都会重新运行该套件,并且最终用户无法到达最终用户手中符合我们评估标准的 Shippy 版本。
Shippy 在数据检索和护栏任务中得分一致,正确拒绝军事情报请求,维护用户数据隔离并准确归因来源。在我们最新的运行中,最清晰的模式是巡逻计划任务,其中 Shippy 超越了战术建议而不是决策支持,几何敏感查询,其中边界简化导致错过了事件,以及智能体发明了一个不存在的 CLI 命令的情况。其中每一个都直接影响我们下一轮的技能改进。
Shippy 的评估套件在 Skylight 中运行:每个场景都根据加权标准进行评分,法官的推理可见,因此失败会指向需要修复的特定行为。
我们正在滚动向早期采用者开放 Shippy,并邀请他们对其进行压力测试,以找出智能体回答不佳的问题以及可能需要加强的护栏。这是我们接下来要构建的内容:
我们在 Shippy 上的工作已经改变了我们对 Ai2 其他地方智能体的看法——最直接的是我们的野生动物保护平台 EarthRanger 和我们的开放式地球观测工具套件 OlmoEarth。母舰的建造是为了通用并容纳其他特工,因此虽然海事是我们应用它的第一个领域,但我们不希望它是最后一个。
Shippy 是由 Ai2 的 Skylight 团队构建的。 Skylight 是一个免费的海域认知平台,已被 70 个国家/地区的 300 多个合作伙伴使用。