一个真实空间 Agent 的 Prompt Tool Chain 拆解

0 阅读4分钟

先给你一个“真实需求场景”

这是一个工程里真的会出现的需求,不是 Demo:

用户: “评估这个公交站点 1km 服务范围内的人口覆盖情况,并给出结论。”

拆一下,这句话里包含了什么?

目标:评估覆盖情况
对象:公交站点(点)
方法:1km 服务范围(缓冲区)
数据:人口数据(栅格 / 面)
输出:指标 + 解释

📌 这是空间 Agent 的理想试金石

  • 有空间
  • 有决策
  • 有计算
  • 有解释

整体架构先行(非常重要)

image.png

image.png

User Query
   ↓
【Chain】
- 意图解析
- 空间摘要
- 任务约束
   ↓
【Agent】
- 决定分析路径
   ↓
【GIS Tools】
- buffer
- overlay
- statistics
   ↓
【Chain】
- 结果整理
- 自然语言解释

记住一句话: Agent 从不直接面对用户,也不直接面对数据


第一部分:Prompt 拆解

Prompt 不是“说明书”,是行为边界


1️⃣ System Prompt(空间 Agent 的“宪法”)

这是最关键的 Prompt,比模型本身还重要。

你是一个【空间分析决策 Agent】。

你的职责:
- 不进行任何空间计算
- 不推断几何关系
- 不处理坐标或 CRS
- 只根据已提供的空间摘要,决定需要调用哪些空间分析工具

你只能在【可用工具列表】中选择下一步动作。
如果信息不足,明确说明“需要更多空间信息”。

你的输出必须是:
- 对下一步空间分析的明确选择
- 不得包含计算结果

📌 这个 Prompt 的作用只有一个: 砍掉 LLM 90% 的“幻觉空间”


2️⃣ 用户 Prompt(永远不是原始请求)

❌ 错误做法:

用户说:评估站点覆盖人口

✅ 正确做法(Chain 预处理后):

{
  "analysis_goal": "评估公交站点服务范围内人口覆盖",
  "current_layers": {
    "station": "点图层,1 个要素",
    "population": "人口栅格,100m 分辨率"
  },
  "available_operations": [
    "buffer_analysis",
    "raster_zonal_statistics"
  ]
}

📌 用户语言 ≠ Agent 语言


第二部分:Tools 拆解

Tool = 可控的空间动作单元

image.png

image.png

1️⃣ Tool 设计铁律(很重要)

一个 Tool 只能回答一个问题:

“你要不要我做这一步?”

而不是:

“我能不能顺便帮你把后面的都做了?”


2️⃣ 示例 Tool:缓冲区分析

@tool
def buffer_analysis(
    distance_m: float
) -> dict:
    """
    对当前站点图层执行缓冲区分析
    """
    return {
        "layer": "station_buffer",
        "geometry_type": "polygon",
        "buffer_distance": distance_m
    }

📌 特点:

  • 不暴露实现
  • 不暴露 CRS
  • 输出是结构化元信息

3️⃣ 示例 Tool:人口统计

@tool
def raster_zonal_statistics(
    zone_layer: str
) -> dict:
    """
    计算区域内人口统计值
    """
    return {
        "zone": zone_layer,
        "population_sum": 52300,
        "area_km2": 3.14
    }

📌 注意:

  • Agent 不知道怎么算的
  • Agent 只知道算出来了什么

第三部分:Agent 的真实 Thought(你很少能看到)

这是一个健康空间 Agent的内部推理(示意):

Thought:
目标是评估站点服务范围内人口
当前只有站点点位
→ 需要生成服务范围
→ 服务半径是 1km
→ 先调用 buffer_analysis

接下来:

Observation:
已生成 station_buffer 图层
Thought:
已有服务范围
→ 需要统计人口栅格
→ 调用 raster_zonal_statistics

📌 你会发现:

  • 没有“灵机一动”
  • 没有“自作聪明”
  • 像一个非常克制的工程师

第四部分:Chain 拆解

Chain 才是真正的“控制中心”

image.png

Image

1️⃣ Chain 在前:空间输入规范化

用户请求
→ 校验图层是否存在
→ 校验 CRS 一致
→ 生成空间摘要

📌 这些事:

  • 永远不交给 Agent
  • 必须 deterministic

2️⃣ Chain 在后:结果解释与表达

Agent 输出的永远是冷冰冰的结构化结果

{
  "population_sum": 52300,
  "area_km2": 3.14
}

Chain 再把它变成人话:

该公交站点 1km 服务范围覆盖人口约 5.23 万人,
覆盖面积约 3.14 平方公里,
属于中等强度服务站点。

📌 解释 ≠ 决策


一个完整调用流程(从头到尾)

用户一句话
↓
Chain:解析目标 + 校验空间
↓
Agent:选择 buffer_analysis
↓
GIS Tool:生成缓冲区
↓
Agent:选择 raster_zonal_statistics
↓
GIS Tool:统计人口
↓
Chain:格式化 + 解释
↓
最终输出

你应该从这个拆解里记住什么?

三句硬结论:

  1. Prompt 是用来限制 Agent 的,不是启发它的
  2. Tool 是空间能力,不是空间思维
  3. Chain 决定系统能不能上线,Agent 只决定像不像人

更多精彩内容请关注微信公众号 “学GIS的小宝同学”

二维码.jpg