先给你一个“真实需求场景”
这是一个工程里真的会出现的需求,不是 Demo:
用户: “评估这个公交站点 1km 服务范围内的人口覆盖情况,并给出结论。”
拆一下,这句话里包含了什么?
目标:评估覆盖情况
对象:公交站点(点)
方法:1km 服务范围(缓冲区)
数据:人口数据(栅格 / 面)
输出:指标 + 解释
📌 这是空间 Agent 的理想试金石
- 有空间
- 有决策
- 有计算
- 有解释
整体架构先行(非常重要)
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 = 可控的空间动作单元
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 才是真正的“控制中心”
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:格式化 + 解释
↓
最终输出
你应该从这个拆解里记住什么?
三句硬结论:
- Prompt 是用来限制 Agent 的,不是启发它的
- Tool 是空间能力,不是空间思维
- Chain 决定系统能不能上线,Agent 只决定像不像人
更多精彩内容请关注微信公众号 “学GIS的小宝同学”