案例库/完整蓝皮书
ADPS 企业 Agent 系统蓝皮书 · 案例报告 02
玄宿科技 GIS 数据发布 Agent:把运行经验固化成可验收管线
模型参与新管线设计,已认证管线按规则运行,真实地图请求负责最终验收。
证据边界:本文记录玄宿科技 GIS 数据发布系统的项目实践。流程、失败案例和架构取舍由案例方熊钰柯提供,尚未经过独立审计。页面截图来自案例运行环境;示例契约由 ADPS 根据公开机制整理,不代表案例方实际字段名。
案例速览
| 项目 | 现场信息 |
|---|---|
| 业务任务 | 将不同格式的 GIS 数据处理后发布到 GeoServer,并生成可供业务使用的地图服务 |
| 最难发现的失败 | 发布接口返回成功,真实 GetMap/GetTile 请求仍可能失败;部分 ServiceException 的 HTTP 状态也是 200 |
| 核心做法 | 模型参与新管线设计,已认证管线在运行期按规则执行;发布后必须用真实请求和截图验收 |
| 关键运行结构 | 六阶段管线、磁盘事实文件、错误规则、失败卡、draft/candidate/active 生命周期 |
| 当前证据 | 运行控制台、知识卡、实际地图结果和案例方失败复盘 |
| 适用范围 | 输入类型可枚举、处理链重复、错误代价高、外部结果可以自动探测的数据发布任务 |
1. 先认识这条 GIS 发布链
GIS 数据发布不等于上传一个文件。系统需要识别格式,确定坐标系,处理数据,生成样式,把数据注册到 GeoServer,配置缓存,最后验证地图服务。
几个常见字段可以先用业务语言理解。
| 字段 | 在流程中的含义 |
|---|---|
workspace |
GeoServer 中隔离一组资源的命名空间 |
store |
指向 PostGIS、栅格文件等真实数据源的连接 |
layer |
对外发布和请求的地图图层 |
SRS |
数据使用的空间参考或坐标系 |
bbox |
数据覆盖的地理边界,浏览器据此定位和缩放 |
这些值在前一步产生,后一步逐值引用。名称或坐标错一位,接口可能直接失败,也可能发布出位置错误的地图。
玄宿科技的流程还跨越桌面 GIS、GDAL、PostGIS、GeoServer 和 GWC。操作顺序长期依赖工程师记忆,重复发布后很难回答“哪一次运行的哪一步出了问题”。
2. 两个现场失败改变了设计
第一个失败来自 S-57 电子海图。一组海图导入 PostGIS 后会按物标类生成上百张表,随后逐表建立 store、发布图层并组成图层组。图层组配置为 OPAQUE_CONTAINER 后,成员图层可能从 WMS 列表消失。直接请求 GetMap 返回 LayerNotDefined,HTTP 状态仍是 200。只看状态码,系统会把错误结果登记成成功。
第二个失败出现在 WMTS 瓦片请求。GetTile 返回 400,响应含有 / by zero。排查后发现 metatile 尺寸被配置为 0×0。官方文档没有说明这个取值的后果,结论来自平台实测。
两个问题分别给出了明确要求。
- 发布接口自报成功不能作为最终验收。
- 平台实测经验必须进入下一次运行能读取的规则,不能只留在操作人员记忆里。
3. 为什么运行期没有调用模型
团队评估过将 GeoServer REST API 封装为工具,再让模型运行时选择接口和参数。这个方案没有进入主链。GIS 发布的 workspace、store、layer、SRS 和 bbox 都有严格来源,模型重新生成会增加参数漂移风险。
与此同时,输入意图可以从数据签名确定。目录中包含 .000 文件时进入 S-57 管线,包含 .tif 时进入栅格管线。未匹配签名就返回明确错误。这里不需要模型猜测用户意图。
团队把开放判断放到设计期:Coding Agent 起草新管线,工程师审阅并完成首次运行,系统验证通过后再认证为 active。运行期只使用已认证规则。
案例方把这项取舍称为推理资产化。这个名称指一件具体的事:一次开放推理的结论写成管线声明和错误规则,后续高频运行直接复用。
| 决策 | 发生位置 | 运行期动作 |
|---|---|---|
| 输入应进入哪条已有管线 | 设计期定义签名 | 查 accepts 表 |
| 某个已知错误如何处理 | 失败复盘后写规则 | 按 signature 选择 retry、abort 或 skip |
| 新格式如何处理 | 设计期由模型和人员共同完成 | 未认证前拒绝自动运行 |
“运行期零 LLM”是当前输入空间下的结果,不是系统目标,也不适合被推广为通用准则。
4. 六个阶段怎样完成一次发布
主链固定为六个阶段。每个阶段在独立子进程中运行,编排器只读取返回码、结构化输出和错误签名。
| 阶段 | 主要动作 | 必须落下的结果 | 失败时 |
|---|---|---|---|
validate |
识别格式并选择 active 管线 | 输入签名、管线 ID、原始文件清单 | 无匹配管线则拒绝 |
process |
重投影、入库或归一数据 | processed_crs、processed_bbox、处理后路径 |
不猜缺失坐标系 |
generate_sld |
生成或选择样式 | 可追溯的样式文件 | 样式契约失败则停止发布 |
publish |
调用 GeoServer REST 并配置资源 | workspace、store、layer 等发布回执 | 过最小事实检查后才调用 |
viewer |
生成浏览页和访问配置 | 可复现的服务地址和视图配置 | 不把页面生成当作验收 |
verify |
发送真实请求并截图 | verify_report.json、截图、请求统计 |
失败签名进入规则或人工复盘 |
这条链刻意没有并行。案例方记录过两个数据集并发发布时,其中一个 verify 短暂出现零个瓦片请求成功。当前规模下,团队选择排队执行,换取可复现性。吞吐要求超过排队能力时,这项取舍需要重新评估。
5. 状态为什么落在磁盘上
阶段之间不共享进程内对象,状态通过文件传递。
run/
metadata.json # 输入签名、管线、处理结果和发布坐标
run-state.json # 当前阶段、重试次数和状态迁移
verify_report.json # 真实请求、截图和验收结论
validate 写识别结果,process 追加坐标系和 bbox,下游阶段读取这些值,不重新计算。案例方称这套结构为磁盘事实平面。它遵守“一个事实一个写入者”:同一个 bbox 只有一个权威生产阶段。
文件方式带来四个直接收益:进程退出后仍可审计;重跑时可以跳过已完成阶段;前端、命令行和执行代理共享文件契约;新子进程会加载磁盘上的最新实现。
代价也很具体。状态文件需要 schema 版本,前端轮询与命令行时间精度必须一致,错误前缀若被规则表使用就不能随意改名。部署进入多机、多租户和高并发写入后,文件真源需要迁移到支持事务和隔离的存储。
6. 发布后怎样证明地图真的能用
verify 不读取 publish 阶段的“成功”字段来替代验收。它请求真实的 GetMap 或 GetTile 地址,至少核对下面三项。
- HTTP 状态符合预期。
content-type是image/*,响应体不是 XML ServiceException。- 截图或图像分析能观察到有效地图内容。
这项机制在 ADPS 中对应外部验收探针:系统离开自身状态,到真实消费端检查结果。它适用于数据库写入、文件交付、支付回执和网页发布等无法只靠内部调用结果判定的任务。
7. 一次失败怎样进入下一次运行
运行期只处理已经认识的错误签名,动作限定为 retry、abort 和 skip。缺少空间参考、海图更新链断号等问题不允许自动补猜,系统直接停止。
新的失败由人复盘,并写成五段式失败卡。
signature: "GetTile=400 and body contains '/ by zero'"
root_cause: "metatile size was configured as 0x0"
fallback: "disable the invalid metatile setting and rerun verify"
fixed_by: "set a safe SDK default"
related_rules: ["wmts-metatile-zero"]
这张卡同时保存现象、原因、当前处置、永久修复和运行规则。后续运行不需要重新阅读整篇复盘,只读取压缩后的错误签名与动作。原始事实仍可沿 source 字段回查。
8. 新能力怎样取得自动运行资格
新管线经过三个状态。
| 状态 | 可以做什么 | 进入下一状态的条件 |
|---|---|---|
draft |
生成、修改和人工检查 | 人员显式触发首次完整运行 |
candidate |
保存首跑证据,等待认证 | 六阶段通过,真实请求和截图验收成功 |
active |
自动匹配输入并运行 | 人员确认认证 |
活跃管线的当前版本与认证版本不一致时,系统自动退回 candidate。一次代码修改不会沿用旧认证继续自动运行。
模型在生长期生成脚手架,人员决定是否认证,运行时只接受 active 管线。这个生命周期比“生成后直接上线”多了首跑证据和明确责任人,也比每次运行都请人批准更适合重复任务。
9. 没有运行期模型,为什么仍把它作为 Agent 案例
名称并不由是否每次调用 LLM 决定。这个系统会感知输入签名,选择能力,修改外部环境,主动验收,按错误签名回退,并通过失败卡和管线生命周期扩展能力。
它的自主范围很窄。签名空间封闭,未知输入拒绝;已接受任务必须留下可验收结果和可查询状态。若只剩一条固定脚本,没有输入识别、能力选择、外部验收和生命周期管理,把它称为 Agent 就没有额外解释价值。
10. 复制这套做法时从哪里开始
- 选一条每周重复发生、输入类型有限、失败可以观察的发布流程。
- 把完整流程拆成阶段,为每个阶段定义唯一输出和错误签名。
- 标出必须由程序传递的机械参数,禁止下游重新计算或由模型生成。
- 设计一项离开系统内部的验收,例如真实请求、回读数据库或打开交付文件。
- 先记录三次真实失败,再决定哪些可以进入自动 retry,哪些必须 abort。
- 为能力设置 draft、candidate、active,代码变更后取消旧认证。
- 连续运行后再评估是否需要并行、动态规划或运行期模型。
这七步不依赖 GIS。数据导入、媒体转码、模型部署、报表发布和静态网站发布都可以使用同样的骨架。
11. 失效信号与迁移边界
| 当前取舍 | 成立条件 | 出现这些信号时重新设计 |
|---|---|---|
| 运行期查表 | 输入签名可枚举 | 用户意图转为开放语言,规则表持续膨胀 |
| 顺序执行 | 排队时间可接受 | 批量规模导致 SLA 无法满足 |
| 磁盘事实 | 单主机、低并发写 | 多机、多租户或多个写入者竞争同一状态 |
| 错误签名回退 | 失败模式可稳定识别 | 未知错误占比持续上升,规则误匹配增加 |
| 人工认证能力 | 新管线增长速度可控 | 认证队列成为主要交付瓶颈 |
错误规则和失败卡来自 GeoServer 与 GIS 领域,不能原样迁移。可复用的是阶段契约、单一事实生产者、外部验收、失败到规则的路径和能力认证过程。
12. 当前证据与下一步数据
| 主张 | 当前依据 | 状态 |
|---|---|---|
| S-57 与栅格输入可按文件签名路由 | 管线 accepts 机制 | 架构与运行说明 |
| HTTP 200 不能证明 WMS 结果可用 | LayerNotDefined 实测 |
案例方运行证据 |
/ by zero 来自 0×0 metatile |
失败复盘与知识卡 | 案例方运行证据 |
| 版本漂移会使 active 管线退回 candidate | 生命周期机制 | 架构说明 |
| 该设计在大规模并发下仍优于动态系统 | 尚无对照数据 | 本版不作此结论 |
下一版应记录每条管线的运行次数、成功率、人工接管率、verify 发现的假成功数、规则命中率和代码变更后的重新认证耗时。
13. ADPS 对照
| 模式或概念 | 本案例中的实现 |
|---|---|
| M4 失败日记 | 五段式失败卡回链错误规则 |
| F2 技能包 | 一条带声明、代码、证据和生命周期的管线 |
| A2 规划执行 | 六阶段静态计划,依赖在设计期固定 |
| A4 护栏三明治 | 发布前事实检查,发布后真实请求验收 |
| G3 渐进承诺 | draft、candidate、active 逐级开放权限 |
| G4 可观测性 | 文件状态、控制台、请求记录和截图 |
| 推理资产化 | 设计期结论进入管线和规则,运行期复用 |
| 磁盘事实平面 | 阶段通过版本化 JSON 交换权威状态 |
案例提供与引用
案例提供:熊钰柯(Yuke Xiong),玄宿科技。
建议引用:ADPS、熊钰柯,《玄宿科技 GIS 数据发布 Agent:把运行经验固化成可验收管线》,ADPS 企业 Agent 系统蓝皮书·案例报告 02,v0.4,2026。