场地分析 Agent · 演示

输入全国任意一个地址(中国大陆),自动检索周边 1 km 设施,由大模型撰写学术风格的场地简报,并由代码逐个校验简报中的数字。

本页展示的是预先生成的真实结果,不是实时查询:数据来自高德开放平台,简报由 DeepSeek 生成,数字校验由本项目代码完成。可自由输入地址的在线版见下方链接。

类别数量最近设施距离

数量为高德 POI 点位数,不等于用地性质;地铁按出入口计数;“≥”表示高德返回总数已封顶,实际更多。

周边设施地图

设施对比

场地分析简报

它是怎么工作的

  1. 1
    输入地址用户仅限北京;不存在或不在北京的地址会被明确拒绝。
  2. 2
    地址转坐标高德地理编码接口,并检查结果确实在北京市内。
  3. 3
    检索周边 1 km 的 7 类设施高德地铁出入口、公交、教育、医疗、商业、公园绿地、工业;分类编码已用真实接口逐个核实。
  4. 4
    统计代码计数、按距离排序、取最近设施。数字全部由代码计算,不交给大模型,因为大模型数数不可靠。
  5. 5
    撰写简报大模型DeepSeek 只负责把统计数据写成书面语,并被要求:不得计算、估算数字,设施名称必须来自数据。
  6. 6
    断言校验代码逐条核对简报里的断言:「设施名」是否存在于数据、其后的距离是否属于这个设施、“某类别 N 处”的 N 是否等于该类别的数量,其余数字至少要出现在统计表里。有问题就带着具体的纠错信息让模型重写一次;仍不通过则在页面上标红警告,不会悄悄放行。
  7. 7
    展示页面统计表先出,简报随后出现,并标明校验是否通过。

设计原则:模型负责写作,事实由代码裁决。

校验拦截

校验器是怎么演进的

第一版:只查数字是否出现在统计表里。能拦住凭空编造的数字,但有一个漏洞:把“地铁站出入口共 32 处”改成“共 36 处”,而 36 恰好是另一处设施的距离,就会被放行——因为它检查的是“这个数字在不在表里”,不是“这个数字说的是哪一项”。

第二版(现在):逐条核对断言。「设施名」必须存在于数据;名称后的距离必须属于这个设施;“某类别 N 处”的 N 必须等于该类别的数量。为了让校验器认得出来,提示词要求模型使用固定句式。认不出的数字仍会核对“是否在统计表里”,但只计入覆盖率、不判违规。

旧版与新版对比(在一份真实的国贸简报上做六种篡改)

篡改方式旧版新版
数量改成别处设施的距离漏过发现
数量改成另一类别的数量漏过发现
距离改成另一个设施的距离漏过发现
互换两个设施的距离漏过发现
改一个设施名漏过发现
编造一个不存在的数量发现发现

下方的交互工具可以自己复现这张表:每次篡改后会同时显示旧版与新版的判定。

两次真实发生的问题(开发记录)

1. 提示词里的数字被抄进简报。我加了一条规则“每类最多列举 3 处设施”,随后首钢园的简报第一段出现了“……每个类别最多列举距离最近的 3 处设施”。“3”不在统计数据里,被校验器拦下。这是提示词的缺陷而非模型编造,改成不含具体数字的说法后不再出现。

2. 校验器自己的误报。升级后第一次用真实数据测量,12 份简报里有 2 份被判违规,重试后仍不通过:“「国贸地铁站(公交站)」距离 1000 m(数据中为 0 m)”。原因是模型写了“以「国贸地铁站(公交站)」为中心,分析半径 1000 m”,中心地址恰好也是数据里的一个公交站,其后的半径 1000 m 被解析器当成了它的距离。这是解析器的缺陷,模型没有错。修复解析器(名称与数字之间出现“半径”则不视为距离断言)并在提示词里要求场地地址不加「」之后,12 份新简报全部一次通过。真实数据测出来的问题,单元测试是想不到的。

自己试一试

下面是当前所选案例的简报,可以直接改文字,或点按钮追加一条错误的断言。校验规则在你的浏览器里实时运行,与项目中的 lib/verify.ts 一致;红色标出的是新版判定为不合规的位置。

旧版(只查数字是否出现在统计表里):
新版(逐条核对断言):

数据局限

关于这个项目