01. Ai2 发布 Shippy 复盘
二零二六年七月十五日,Ai2 团队在 Hugging Face 发布了一篇文章,作者是 Kyle Wiggers,复盘他们构建海事分析智能体 Shippy 的过程。
02. Shippy 面对实时海事数据
Shippy 运行在 Ai2 的 Skylight 海事态势平台上。分析员可以直接问它:上个月,巴拿马专属经济区里有哪些捕鱼活动?或者,某个海洋保护区附近有哪些船只?
为了回答这样一个问题,系统要先找到准确的海域边界,再查询持续更新的卫星和船舶信号,解释船舶轨迹,最后生成可以回到地图核对的结果。所以 Shippy 面对的不是一份静态知识库,而是真实、持续变化的业务数据。
03. 风险首先暴露在工具调用上
这类任务的风险很具体。原文说,如果答案错了,可能让巡逻船驶向错误方向,浪费本来就紧张的资源,甚至把人员置于危险之中。
但 Shippy 的早期版本,恰恰在最基础的数据查询上出了问题。当时团队让模型直接拼接 Skylight 的接口请求。这个接口包含几十种输入、嵌套过滤条件、分页游标和复杂的地理边界。
04. 三种静默错误
模型生成的请求看起来经常是对的,实际却会悄悄漏数据:分页参数写错,部分结果直接消失;地理边界编码错误,查询范围发生偏移;过滤条件理解错了,接口正常返回,内容却不是用户真正要的数据。
这比接口直接报错更危险,因为一个格式完整、数字齐全的错误答案,很容易被当成正确结果。
05. 不要求模型更小心
这些错误确定了整套系统的核心思路:不要继续要求模型“调用接口时更小心”,而是把不需要模型判断的工作,从模型手里拿走。
后来,Shippy 不再直接请求复杂接口,而是只调用一套专门的命令行工具。模型负责理解用户意图,决定要查询什么;命令行工具负责身份认证、分页、参数校验和结构化输出。
06. 确定性工具接管精确操作
比如查询捕鱼事件时,智能体只需要提交带有类型约束的过滤条件。怎样翻页、怎样组织请求、怎样返回统一格式,都由确定性程序完成。接口出错时,工具还会提供明确的错误信息和帮助说明,让智能体可以根据真实反馈修正,而不是自己猜。
大型查询结果也不再通过命令行管道传递,而是写入本地 JSON 文件。这样既不会因为结果太大撞上缓冲区限制,后面的分析步骤也可以反复读取同一份数据。
07. 三层工具链
重构以后,Shippy 的工具链分成三层。
最底层是类型化接口。输入和输出都有明确的数据结构与字段说明。中间是确定性命令行工具,把复杂接口压缩成少量稳定命令。最上层才是任务技能,告诉智能体在什么场景下调用哪个命令,以及拿到结果后继续做什么。
这三层不是换了三种说法。接口层可以单独测试数据结构,命令行工具可以由人直接运行,任务技能可以检查流程是否正确。每往上一层,留给模型自由发挥的空间都更小。
所以这套设计真正解决的,不是“模型会不会调用工具”,而是怎样避免一个错误参数在系统里静默传播,最后变成一份看起来可信的分析报告。
08. 答案必须能够被用户复核
工具调用更可靠以后,答案本身仍然不能只给一个结论。
Shippy 的回答会同时给出海域边界的来源、数据截止时间、查询时间戳,以及返回 Skylight 地图的深链接。分析员可以沿着链接回到原始地图,检查边界、时间范围和每一个数字。
这相当于给输出规定了一份固定契约:结论从哪里来,数据新到什么时间,查询什么时候执行,用户到哪里复核,都必须随答案一起交付。
对于高风险智能体,“减少幻觉”太抽象。更可执行的要求是:即使系统给错了答案,用户有没有足够的证据及时发现它错在哪里。
09. 把身份、流程和配置分开
解决了数据查询和答案复核,下一步是让智能体的行为能够被版本管理。
Ai2 把系统拆成三部分。第一部分定义 Shippy 的角色和行为边界;第二部分保存不同任务的处理流程;第三部分放模型、智能体框架和运行参数。
10. 行为制品与运行配置分离
角色边界和任务流程一起打进容器镜像,形成可以部署、可以回滚的版本。模型、运行框架和参数则通过配置替换,密钥只在启动时注入。
这样做的意义是,换模型不会顺手改变业务规则;调整任务流程也不需要重新定义整个智能体。一次行为变化究竟来自模型、流程还是配置,工程师能够明确追踪。
11. 不同用户的数据绝不能串线
行为可以追踪以后,还有一个不能依赖提示词解决的问题:不同用户的数据绝不能串线。
Skylight 服务于七十多个国家的数百个政府机构和非政府组织。每个账户都有自己的关注区域、船舶观察名单和告警配置。一个用户的查询结果和对话历史,不能被另一个用户看到。
12. 每个会话一套临时环境
Ai2 为此建立了 Mothership 托管平台。每次用户打开会话,系统都会启动一套独立的临时 Kubernetes 运行环境。智能体、任务技能和命令行工具都在里面运行,用户身份令牌在启动时注入,因此所有接口调用只能访问这个用户有权看到的数据。
会话产生的文件不会跨用户共享,网络也只允许访问完成任务所需的服务。隔离不是在系统提示里写一句“不要访问别人的数据”,而是让智能体在运行时根本拿不到这些数据。
13. 决策边界也必须能够检查
数据不能越权,回答本身也不能越过人的决策边界。
Shippy 可以整理船舶活动和数据证据,但不能判断某艘船是否违法,因为法律定性必须由人完成。它也不能在证据之外推测,更不能把决策支持变成军事情报或战术建议。
这些限制首先写进角色与行为边界,但不会只停留在提示词里。评测中会专门加入越界请求,检查智能体能不能正确拒绝;运行环境也只开放完成任务所需的网络服务,限制它能够采取的动作。
这里的重点不是让模型承诺“我会克制”,而是让每条禁止事项都能在版本、权限和测试报告中被检查。
14. 用真实场景定义评分标准
工具、权限和边界都建立以后,Ai2 最后要回答的是:这套系统在真实任务里到底靠不可靠?
他们没有使用静态问答榜单代替生产评测,而是让领域专家编写真实场景和评分标准。不同任务的评分权重也不同。查询捕鱼事件时,数据准确度权重最高,其次是边界解析和时间范围,来源归属与表达风格的权重更低。
15. 评测的是完整系统
一条自然语言请求会进入真实的 Shippy 会话,调用真实任务技能、工具和实时数据。评测模型再逐项给分、写出理由,并按照固定阈值判断通过还是失败。
所以被评估的不是某个模型能不能答对一道题,而是模型、任务技能、工具、权限和运行环境组合以后,能不能正确完成一项工作。
16. 每次变化都重新跑测试
这套评测也不是上线前只跑一次。只要任务技能、模型或者底层数据发生变化,完整测试就会重新执行。
每次运行都会生成带版本和时间戳的报告,并与上一个版本比较。只要关键指标发生回退,这个版本就不能交给用户。
17. 失败直接进入下一轮测试
原文还公开了当前系统的具体失败:有时 Shippy 会越过决策支持的边界,直接给出战术建议;有时地理边界被简化以后,部分事件没有查到;还有一次,它编造了一个根本不存在的命令行指令。
这些失败没有被藏进一个总分里,而是直接变成下一轮任务技能和测试用例的修改依据。可靠性不是证明系统永远不会错,而是每发现一种新错误,就让它以后更难再次通过上线门禁。
18. 六层机制各自阻断一种风险
现在再回头看 Shippy 的架构,就不会只看到一堆分散的技术名词。
输出携带证据,是为了让错误能够被发现;角色和流程版本化,是为了知道行为为什么变化;确定性工具,是为了减少错误被制造出来;会话隔离,是为了限制一次错误能够波及的范围;完整系统评测,是为了在真实任务里暴露问题;持续回归,是为了阻止已经修过的错误重新上线。
19. 六层在解决同一个问题
六层机制解决的是同一个问题:不能让模型的一次不确定判断,在没有证据、没有边界、没有检查的情况下,一路传到真实业务里。
20. 沿着一条高风险请求检查
如果要把这套方法用在自己的项目里,可以先挑一个真正高风险的用户请求,不要先做一张大而全的架构图。
沿着这条请求逐步检查:答案有没有数据来源和时间;模型是不是直接面对复杂接口;不同用户的身份、文件和网络有没有隔离;禁止事项有没有对应的权限限制和测试;模型、工具或数据变化以后,系统会不会自动重跑真实场景。
21. 主动制造失败
然后主动制造几种失败:让分页返回多页数据,输入一个复杂边界,提交一个越权请求,再换一次模型或任务技能。观察错误能不能被发现、能不能被限制,以及坏版本能不能被上线门禁挡住。
高风险智能体的可靠性,不是相信模型这次会答对,而是即使它答错,系统也能尽快发现、限制影响,并阻止同类错误再次进入生产环境。
参考资料与延伸阅读
本文事实来源
- 发布方:Ai2(Hugging Face 上的 AllenAI 官方组织页)
- 发布日期:2026-07-15
- 发布人:Kyle Wiggers(Ai2Comms)
- 原始标题:What building Shippy taught us about building agents
- 原文:https://huggingface.co/blog/allenai/shippy-tech-blog
使用边界:视频总结 Shippy 的工程经验,不将其架构视为所有 Agent 场景的唯一实现。
相关观看入口
资料核验日期:2026-08-23。
