Agent Plan × DeepSeek Harness:行星地质数据多源融合与着陆区评估实战
发布时间:2026/10/8 5:06:56 作者:尧图编辑部 阅读量:1,286

1. 行星地质数据融合为什么需要 Agent Plan 调度行星地质数据多源融合与着陆区评估本质是把遥感影像、地形高程、光谱矿物、雷达次表层、热物理、重力场这些异构数据在统一空间框架下对齐、派生指标、交叉验证最后输出一份能支撑工程评审的着陆区评分表。它适合谁适合做深空探测任务论证、着陆区选址、行星科学数据处理的工程师和研究者也适合想用 Agent 范式把零散脚本串成可复现流水线的开发者。我试过用传统脚本流水线跑一次月球南极附近的候选区评估痛点非常集中数据发现靠人翻 PDS 目录配准靠人调控制点指标阈值靠人拍脑袋报告靠人拼。一个 20×20 km 的椭圆级评估从找数据到出初稿往往要数周而且换个人重跑结果对不上。核心问题不是算力而是数据源失败 → 证据重组 → 方法替换这条决策链需要人的认知介入。比如某景光谱影像因为光照角过大不可信专家会改用另一源并降级该证据权重某 DEM 在高纬出现条带噪声专家会切换数据源重算粗糙度。这类判断正是 Agent Plan 调度擅长的地方。Agent Plan 在这里的角色是任务分解与调度器把评估某区域作为采样返回着陆区这种自然语言目标拆成有向无环任务图节点包括数据获取、预处理、配准、派生、检测、融合、评分、排序、报告节点之间以产物为边并为高风险节点预设备选分支。DeepSeek Harness 则是运行支架把大模型从聊天框变成能调用工具、能自我校验的智能体。两者配合模型负责规划、调度、解译与复核确定性算法负责配准、坡度、统计这些必须精确的计算。这里有一条安全基线必须说清楚模型不动数算法定结论。凡涉及安全阈值的结论必须由 GDAL、NumPy、ISIS 这类确定性工具算出模型只负责规划、调度、解译和复核。大模型不直接看原始遥感像素做终判它输出的是任务计划、工具参数、结果解读和论证卡片。这条原则决定了后面所有配置和脚本的写法。着陆区评估本身是一个多目标决策问题在安全性与科学价值之间寻优同时满足工程约束。安全约束类是硬门槛坡度、粗糙度、石块与撞击坑丰度、断崖裂隙任一项在触机尺度不达标即淘汰不允许科学价值高分对冲安全风险。工程条件类可优化光照、通信、热环境、大气尘埃、弹道可达性。科学价值类是加分项地质多样性、物质成分、挥发物水冰、采样可达性、时代校准价值。评估尺度遵循漏斗式收敛区域级千公里、椭圆级十到二十公里、着陆点级一公里、触机级一到十米。每一级用的数据源和指标精度都不同Agent Plan 的 DAG 要能表达这种尺度嵌套。2. TaoToken 前置准备与 DeepSeek Harness 接入配置要让 Harness 里的 DeepSeek 推理内核跑起来先得把模型接入这一层配好。我用的是 TaoToken 提供的统一接入官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。它的作用是给 Harness 提供一个稳定的模型调用端点规划器、执行器、复核器都通过它访问 DeepSeek-V3 和 DeepSeek-R1 系列。先说清楚三件套Base URL、API Key、Model ID。Base URL 填 https://taotoken.net/api API Key 在控制台的 API Keys 页面生成Model ID 按节点难度选浅推理节点用 DeepSeek-V3 类深推理节点用 DeepSeek-R1 类。这三样在 Harness 的模型路由表里按节点元数据绑定不要全局写死一个模型。Harness 的配置文件我用 TOML 管理路径放在项目根的 config/harness.toml。下面这段可以直接复制把 api_key 换成你自己的# config/harness.toml [model_gateway] base_url https://taotoken.net/api api_key sk-your-taotoken-key timeout_s 120 max_retries 3 [model_routing] # 浅推理节点意图解析、数据检索、工具参数生成 shallow deepseek-v3 # 深推理节点证据冲突仲裁、科学价值论证、异常归因 deep deepseek-r1 [planner] template_dir kb/sop max_dag_nodes 64 enable_fallback true [executor] sandbox_image planet-tools:lunar-v1 workdir /data/work qc_strict true [critic] enable_numeric_audit true enable_provenance_check true conflict_sigma 2.0模型路由表单独放一份 JSON方便 Critic 双向纠偏。路径 config/routing.json{ node_types: { intent_parse: {tier: shallow, model: deepseek-v3}, data_discovery: {tier: shallow, model: deepseek-v3}, tool_args_gen: {tier: shallow, model: deepseek-v3}, report_draft: {tier: shallow, model: deepseek-v3}, evidence_arbitration: {tier: deep, model: deepseek-r1}, science_argument: {tier: deep, model: deepseek-r1}, anomaly_attribution: {tier: deep, model: deepseek-r1} }, cost_guard: { deep_node_ratio_max: 0.25, token_budget_per_task: 2000000 } }工具协议用统一 JSON Schema每个工具声明 expects.qc 质量约束沙箱执行后由 Harness 自动核验QC 不过就触发反思不依赖模型自觉。比如地形坡度工具{ tool: terrain.slope, arguments: { dem_path: sldem2015_clip.tif, baseline_m: 3.0, unit: degree, mask: illumination_valid.shp }, expects: { product: slope_raster, qc: [nan_ratio0.01, max89.9] } }如果你用 Claude Code 或 Cline 这类客户端做辅助开发接入配置也是同一套三件套。Claude Code 的 settings 片段{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-your-taotoken-key, ANTHROPIC_MODEL: deepseek-v3 } }Cline 的 MCP 配置里把 provider 指向同一个 Base URLModel ID 填 deepseek-v3 或 deepseek-r1。Codex 的 auth.json 同理base_url 和 api_key 对齐。这三件套配好Harness 的模型侧就通了。注意 API Key 不要提交到仓库用环境变量注入Harness 启动时读取。3. 多源数据接入与 Harness 可复制配置片段数据接入是融合的地基。行星地质数据源分几类光学影像如 LROC NAC、CTX、HiRISE地形高程如 LOLA、SLDEM、MOLA成像光谱如 M3、CRISM、OMEGA雷达如 Mini-RF、SHARAD热物理如 Diviner、THEMIS重力场如 GRAIL还有就位巡视数据和地质图件。这些数据格式专业PDS3/PDS4 标签、ISIS3 cube、GeoTIFF、JP2 都有元数据遵循 PDS 标准而非通用 GIS 习惯。Harness 的数据接入层封装成 data.* 工具域负责目录查询、足迹相交、下载、PDS 解析、校验和。下面是一份数据源清单配置路径 config/data_sources.yaml声明式维护规划器初始化时加载# config/data_sources.yaml body: moon reference: radius_m: 1737400 ellipsoid: sphere projection_default: IAU2000:30100 # 极区用极球面 sources: - id: lroc_nac type: optical resolution_m: 0.5 format: pds4 gateway: pds priority: 1 - id: sldem2015 type: dem resolution_m: 5.0 format: geotiff gateway: pds priority: 1 - id: m3 type: spectral resolution_m: 140.0 format: pds3 gateway: pds priority: 2 fallback: [iim, crisp] - id: diviner type: thermal resolution_m: 128.0 format: pds3 gateway: pds priority: 2 - id: grail type: gravity resolution_m: 2000.0 format: pds4 gateway: pds priority: 3 quality_gates: registration_rmse_px: 1.0 nan_ratio_max: 0.01 coverage_min: 0.95统一分析栅格是融合的骨架定义多级分辨率金字塔和统一有效掩膜。配置路径 config/unified_grid.yaml# config/unified_grid.yaml grid: crs: IAU2000:30100 levels: - name: ellipse res_m: 100 - name: landing_site res_m: 10 - name: touch_down res_m: 1 qa_bands: - invalid - shadow - registration_failed - data_gap数据接入脚本用 Python 写调用 Harness 的 data 工具域。下面这段演示覆盖查询与裁剪可直接跑# scripts/ingest_region.py from harness.tools import data, geo, spice def ingest(target_bbox, bodymoon): # 1. 覆盖查询足迹与目标区相交 coverage data.query_coverage( bodybody, bboxtarget_bbox, sources[lroc_nac, sldem2015, m3, diviner] ) print(覆盖清单:, coverage) # 2. 数据空洞检测 gaps data.detect_gaps(coverage, min_coverage0.95) if gaps: print(数据空洞:, gaps) # 3. 下载并校验 for src in coverage[available]: path data.fetch(src, bboxtarget_bbox) data.verify_checksum(path) # 4. SPICE 内核补全 spice.load_kernels(bodybody, time_rangecoverage[time_range]) # 5. 裁剪到统一栅格 for src in coverage[available]: geo.clip_to_grid(src, gridconfig/unified_grid.yaml, levelellipse) return coverage if __name__ __main__: bbox {lon_min: 0.0, lon_max: 0.2, lat_min: -45.0, lat_max: -44.8} ingest(bbox)配准是融合的地基流程是 SPICE 初始化、相机模型几何定位、控制点匹配、平差、重投影。配准残差作为质控指标强制输出要求中误差小于 0.5 到 1 个高分辨率像元超限的影像不得进入像素级融合只能降格为定性证据。这一步的 QC 门写在 Harness 的 quality_gates 里执行器自动核验。4. 端到端验证跑通融合流程并输出着陆区评分表这一节演示一次完整验证输入样例数据跑通融合流程输出着陆区评分表。样例数据我用一小块月球南极附近的裁剪区包含 SLDEM 地形、一景 M3 光谱、一景 Diviner 热物理。目标是评估三个候选着陆点。先跑融合管线。融合不做简单平均采用置信度加权加证据理论框架每个数据源对每个命题给出基本概率分配质量层决定权重冲突因子超阈值时保留冲突并触发 Critic 仲裁。融合脚本# scripts/fuse_evidence.py import numpy as np from harness.tools import terrain, spec, cv, score def fuse(region_dir): # 1. 地形派生坡度、粗糙度 slope terrain.slope(f{region_dir}/sldem_clip.tif, baseline_m3.0) rough terrain.roughness(f{region_dir}/sldem_clip.tif, window_m10.0) terrain.qc_check(slope, nan_ratio_max0.01, max_deg89.9) # 2. 光谱矿物指数 olivine spec.mineral_index(f{region_dir}/m3_clip.img, indexOLINDEX) pyroxene spec.mineral_index(f{region_dir}/m3_clip.img, indexBDI) # 3. 撞击坑与石块检测 craters cv.detect_craters(f{region_dir}/nac_clip.tif, min_diam_m5.0) rocks cv.detect_rocks(f{region_dir}/nac_clip.tif, min_size_m0.5) # 4. 证据融合置信度加权 evidence { slope: {raster: slope, weight: 0.30, direction: lower_better}, roughness: {raster: rough, weight: 0.20, direction: lower_better}, rock_density: {raster: rocks[density], weight: 0.25, direction: lower_better}, olivine: {raster: olivine, weight: 0.15, direction: higher_better}, pyroxene: {raster: pyroxene, weight: 0.10, direction: higher_better}, } fused score.weighted_fuse(evidence, conflict_sigma2.0) return fused, evidence if __name__ __main__: fused, ev fuse(data/region_apollo) np.save(data/fused_evidence.npy, fused) print(融合完成冲突卡片数:, fused[conflicts])融合完成后跑评估引擎。安全指标先过硬门槛任一项在触机尺度不达标即淘汰不参与加权。连续指标按效用函数归一到 0 到 1权重用 AHP 生成并存档Agent 不擅自决定权重只提供敏感度分析。不确定性用蒙特卡洛抽样传播给出评分分布与排序翻盘概率。评估脚本# scripts/evaluate_sites.py import numpy as np from harness.tools import score def evaluate(fused_path, candidates): fused np.load(fused_path, allow_pickleTrue).item() # 1. 硬门槛筛查 hard_gates { slope_p95_deg: 15.0, roughness_p95_m: 0.5, rock_density_max: 0.05, } passed [] for c in candidates: window score.extract_window(fused, c[center], c[radius_m]) if score.check_hard_gates(window, hard_gates): passed.append(c) else: print(f候选 {c[id]} 未过硬门槛淘汰) # 2. 归一化与加权 weights score.load_ahp_weights(config/ahp_weights.json) for c in passed: window score.extract_window(fused, c[center], c[radius_m]) c[score] score.mcdm(window, weights) # 3. 蒙特卡洛不确定性传播 for c in passed: c[score_dist] score.monte_carlo(c, n1000) # 4. 排序与翻盘概率 ranked score.rank_with_confidence(passed) return ranked if __name__ __main__: candidates [ {id: A, center: (0.05, -44.9), radius_m: 500}, {id: B, center: (0.10, -44.85), radius_m: 500}, {id: C, center: (0.15, -44.92), radius_m: 500}, ] ranked evaluate(data/fused_evidence.npy, candidates) for r in ranked: print(f{r[id]}: 评分 {r[score]:.3f}, 翻盘概率 {r.get(flip_prob, 0):.2f})跑完输出着陆区评分表形如候选点坡度 p95粗糙度 p95石块密度橄榄石指数综合评分排名翻盘概率A8.2°0.31 m0.0120.420.811—B11.5°0.44 m0.0280.550.7420.18C13.8°0.49 m0.0410.380.6630.05这张表里A 点综合评分最高B 点科学价值略高但安全指标偏弱翻盘概率 0.18 表示 A 优于 B 的置信度约 82%。报告里每个数值都挂接数据源和计算产物可一键追溯。验证请求可以用 curl 直接打模型网关确认接入正常curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-your-taotoken-key \ -H Content-Type: application/json \ -d { model: deepseek-v3, messages: [{role: user, content: 解析任务评估月球南极候选区}], temperature: 0.2 }返回 200 且带 choices 字段说明模型侧通了。如果返回 401检查 API Key如果返回 model not found检查 Model ID 拼写。5. 本篇常见错误排查与真实报错对照跑这套流程报错集中在几个地方。下面按真实报错对照排查。401 Unauthorized。模型网关返回 401通常是 API Key 没注入或过期。检查 Harness 配置里 api_key 是否从环境变量读取别硬编码。用 curl 单独测一次确认 Key 有效。如果 Key 有效但 Harness 仍 401检查 base_url 是否漏了 /api 路径正确写法是 https://taotoken.net/api 。local proxy failed 或 connection refused。这类报错说明 Harness 到模型网关的网络不通。先确认 base_url 可达再检查沙箱容器的网络白名单是否放行了网关域名。沙箱默认只允许数据网关和模型网关如果配了自定义端点要加进白名单。注意不要用任何网络代理工具直接走合规网络出口。reading choices 报错形如 KeyError: choices。这通常是模型返回了非预期结构比如返回了错误对象而不是补全结果。打印完整响应体看 error 字段。常见原因是 Model ID 写错或者请求体里 messages 格式不对。确认 model 字段是 deepseek-v3 或 deepseek-r1messages 是标准 role/content 数组。OAuth 相关报错。如果你用 Claude Code 或 Cline 接入报 OAuth token invalid说明客户端走了 OAuth 流程而不是 API Key。把认证方式切到 API KeyBase URL 指向 https://taotoken.net/api 三件套对齐。Claude Code 的 settings 里 ANTHROPIC_BASE_URL 和 ANTHROPIC_API_KEY 要同时配缺一个都会失败。配准残差超限。报 registration rmse 1.8 px exceeds gate 1.0。这不是代码错是数据质量问题。处理方式是降级该景为定性证据不进像素级融合换替补影像。Harness 的 fallback 分支会自动做这件事如果没触发检查 DAG 里该节点是否配了 fallback 边。QC 门拦截报 nan_ratio 0.03 exceeds 0.01。说明派生栅格无效值太多通常是掩膜没对齐或 DEM 有空洞。检查统一栅格的 qa_bands 是否包含 data_gap把空洞区显式编码别让插值冒充观测。蒙特卡洛跑不动或超时。1000 次抽样在大栅格上很吃内存。把窗口裁剪到着陆椭圆范围再抽样别在全图跑。Harness 的 score.monte_carlo 支持分块配置 chunk_size 参数。模型路由报 deep_node_ratio exceeded。说明深推理节点占比超了成本护栏。检查 routing.json 里哪些节点被标成 deep把报告撰写、工具参数生成这类浅节点改回 shallow。Critic 会双向纠偏浅节点误用深模型会被打回。数据血缘断链报 provenance missing。说明某结论没挂接数据源或计算产物。Critic 的证据溯源检查会强制标红。补上 source_id 和 product_path确保每个数值都能追溯到 PDS ID 和脚本版本。6. 把评估流程固化为可复现运行包跑通一次不算完能复现才算。Harness 的交付物里有一项叫可复现运行包包含 Plan-DAG 文件、容器镜像、数据清单、一键复跑脚本。Plan-DAG 以 JSON 持久化支持人工在评审看板上修改后再执行计划可见、可改、可复现。把这次验证固化成运行包目录结构这样组织run_package/ ├── plan_dag.json # 任务图 ├── config/ │ ├── harness.toml │ ├── routing.json │ ├── data_sources.yaml │ └── unified_grid.yaml ├── scripts/ │ ├── ingest_region.py │ ├── fuse_evidence.py │ └── evaluate_sites.py ├── data_manifest.json # 数据清单与校验和 ├── image_digest.txt # 容器镜像版本 └── rerun.sh # 一键复跑rerun.sh 内容#!/usr/bin/env bash set -euo pipefail export TAOTOKEN_API_KEY${TAOTOKEN_API_KEY:?need api key} docker run --rm \ -v $PWD/data:/data/work \ -v $PWD/config:/app/config \ -e TAOTOKEN_API_KEY \ planet-tools:lunar-v1 \ python -m harness.run --plan plan_dag.json --config config/harness.toml数据清单记录每个源文件的 PDS ID、校验和、获取时间保证同一 Plan-DAG 加同一镜像重跑结论一致。血缘以 W3C PROV 模型记录为图结构报告中任何数字都可一键追溯到源数据。知识库这块别省。地质本体库约束模型用语避免把月海说成平原这类语义漂移工程阈值库逐条标注规范出处模型只引用不发明案例库把历史任务评估资料结构化入库做相似性检索SOP 配方库把成熟处理链固化规划器优先引用配方而非临场编流程。不确定性分级要显式披露统计不确定、模型不确定、数据缺失、知识不确定每级有对应处理方式报告里任何结论标注标签评审专家可按级别过滤。最后说个实用技巧验证策略用回放盲评。选已知答案的历史任务区域让系统在不知道实际着陆点的条件下评估检验排序是否把真实着陆点排在前列、安全结论是否与任务后实测一致。盲评通过标准是真实着陆点进入推荐前三、无一项安全漏报。这比任何指标都有说服力。跑通这套 Harness行星地质数据多源融合就从数月一次的手工作坊变成数小时一轮、知识持续沉淀、过程全程可复现的工程能力。