把大语言模型接进规划决策支持,最早让我觉得“这事能成”的,不是它帮我写出了一份漂亮的规划说明,而是一次很普通的演示:有人给了模型一段话,说“某老城片区要补一块教育用地,但现状建筑密度很高,西侧又有历史保护要求,请你分析矛盾,给出两个可选方向”。模型没有直接给结论,而是先把约束一条一条列出来,再指出哪个目标之间会打架,最后给了取舍建议。那一刻我突然意识到,规划这个行当里,真正缺的往往不是算力,而是一个能把“一堆牌摊开、再帮你理清怎么出牌”的对话型推理助手。
这篇内容想聊的,就是我自己在“大语言模型用于城市规划决策支持中的推理应用”方向上的真实做法。不是什么通用AI教程,而是聚焦一点:如何让模型在规划决策中承担逻辑推演、方案权衡、合规判断这些“动脑子”的环节,以及为了防止它胡说八道,我们要在周围补上哪些工程手段。如果你正在做规划信息化、智慧城市、或者任何需要“AI给建议但必须对结论负责”的系统,这篇应该对你有用。
1. 规划决策支持的核心短板:不是缺数据,而是缺“语义推理层”
1.1 传统决策支持系统能算,但“听不懂话”
规划这个领域,过去几十年攒下来的工具其实不弱:有GIS做空间叠加,有指标计算做容积率校核,有各种专题模型做交通预测、环境影响评估。但真到了“决策支持”这一步,你总会撞上一个尴尬:这些工具都是被动的——你告诉它算什么,它才算什么;你不把一个模糊的诉求翻译成精确的查询语句,它就什么都给不了你。
更麻烦的是,规划决策里大量的信息根本不是数字,而是文字。比如“该片区应结合更新提升公共服务能级”“历史地段周边建设应注重风貌协调”“现状人口老龄化趋势明显,需补充适老化设施”。这类话,决策者每天要看几十条,但它们无法直接变成SQL查询条件,也没法用Python脚本直接处理。结果就是:真正影响决策的那些语义判断,反而靠人脑硬扛。
1.2 大语言模型带来的不是“自动化”,而是“推理外包”
大语言模型出现后,我开始试一种新玩法:在数据系统和决策者之间,加一层“语义推理层”。这层不负责精算,也不负责画图,它负责干这几件事:
- 把决策者一句口语化的需求,拆解成目标、约束、矛盾点。
- 在规划文本、专项规划、上位规划之间检索相关条款,并判断“当前问题涉及哪些条文”。
- 对不同方案做比较推理,分析各自的利弊和适用前提。
- 把“如果选A,什么会被牺牲;如果选B,什么目标达不到”这类权衡关系讲清楚。
本质上,就是把原先需要人脑完成的一部分分析过程,交给模型先跑一遍,再由规划师复核。注意,是“复核”,不是“照单全收”。这也是整个应用能够落地的底线思路。
1.3 从“问答机器人”到“推理组件”的关键转变
很多人刚尝试时,容易把大语言模型当成一个放大版的搜索引擎,问什么答什么。这方向基本走不通,因为在规划决策里,答案必须是“算出来的、引得出处、经得起追问的”。我自己踩过这个坑:最初做了一个问答Demo,模型回答得很流畅,但用户追问“你这个结论依据的是哪版控规哪一条”,它就答不上来。那次之后,我才把重心从“让模型答得好”转移到“让模型按一个可追溯的推理流程走”。
所以这篇博文真正要讲的,是“推理应用”四字。它不是让模型代开规划会,而是让模型成为一个参与分析过程的协作者,每一步推演都能被记录、校验、回溯。
2. 给模型搭一个“推理流水线”:规划决策支持的参考框架
2.1 城市决策问题的结构化:把模糊变成四种要素
我把一次规划决策请求,拆成四个要素:目标(要达成什么)、约束(不碰什么红线)、资源(哪些可调配)、权衡(目标冲突时怎么取舍)。最初模型对这四个词不敏感,但一旦我把输入输出格式固定下来,推理质量立刻不一样。
比如“某旧改项目拟增补社区养老设施”这句话,无结构输入时,模型会自由发挥;结构化以后,它会处理成这样:
- 目标:补齐片区养老床位缺口,服务半径覆盖老年人口集中区域。
- 约束:用地性质符合规划;建筑高度不突破限高;周边道路可承载新增交通。
- 资源:目前有三块存量用地可用,面积分别为约4200平方米、2800平方米、5600平方米。
- 权衡:若选面积最大的地块,建设规模最充足,但距现有老年人聚居区较远;若选最近的地块,需拆迁现状建筑,成本高。
一旦把问题格式化成这样,模型就能在一个相对稳定的语义空间里做推演,而不是每次生成都在“猜你的需求”。
2.2 五步推理流程:解析、约束提取、检索增强、方案推演、校验输出
我最终在内部项目里跑通的流程,分五步。每步单独做成一个可调用的模块,模型角色被限定在“该步骤负责的事”里:
- 问题解析:从自然语言输入中抽取目标、范围、利益相关方、时间要求。
- 约束提取:针对解析结果,去规范文本库中找对应硬约束,并标注条款编号。
- 检索增强:把上位规划、分区规划、专项规划的相关章节嵌入向量库,对问题做相似度匹配。
- 方案推演:模型基于前述信息生成候选方案,并对每个方案做多目标评估。
- 校验与输出:用独立校验器检查第四步结论与第二步约束是否矛盾,矛盾则打回重推。
这里特别说一下第二步和第五步的关系。第二步抽取约束时,模型用的是“检索+识别”;第五步校验时,必须用“程序判断”,不能再让模型自己查自己。我在实际开发里是让校验器去查数据库里的结构化规则表,条文编号对不上、容错超过阈值的结论,直接拒绝提交给用户。
2.3 为什么必须做“模块化”而不是把问题一次全抛给模型
早期我也尝试过把整个问题连同规范文本一起塞进上下文,让模型一次性给出最终结论。看似省事,但有两个致命问题:一是长文本会让模型注意力分散,后提出的约束容易被忽略;二是中间过程不可见,哪怕结论错了,你也不知道它是在哪一步开始跑偏的。
模块化后,每步的输出都是下一步的输入,任何一步都可在用户界面上单独查看、单独修正。这一点在城市规划这种强责任场景里特别重要——你不能让一个错误结论一路黑箱到底,必须留出人在环路里干预的窗口。
3. 实地演练:我用这个框架跑通了一次选址推理解析
3.1 一次真实感很强的输入:旧改片区的养老设施选址
为了让说明更具体,我拿一个简化的实际场景作例子,这是我在某规划信息化试点项目里处理过的同类任务(数据和名称一律做了脱敏):
输入原文大致是:
片区老龄化程度高,现状无集中式养老设施。拟在更新范围内新增一处养老照料中心,优先考虑利用存量房屋改造,需满足步行可达性要求,并尽量减少对现状居住功能的影响。
如果用传统方式,做这个选址,需要人工先读控规、看现状权属、查房屋结构、跑一遍可达性分析,至少两三天。而把这个问题丢进我这套推理流水线后,过程是这样的。
3.2 模型产出的结构化推演过程
第一步,解析器给出一套目标树:
- 功能目标:新增不少于60张床位的养老照料中心,配置日间照料、康复辅助、助餐等功能空间。
- 空间目标:优先改造存量建筑,若新建,则占用更新地块指标。
- 可达性目标:服务半径建议按800米控制,重点覆盖老年人口密度高的几个居住小区。
- 冲突提示:可能出现“存量改造面积不足”与“新建占用绿地指标”之间的矛盾。
第二步,约束提取返回了两条关键条文:一条来自片区控规,条文内容是“存量工业、仓储用地在更新中可优先转为公共服务设施用途”,这给改造路径提供了政策依据;另一条来自养老专项规划,要求“新建养老设施应独立占地,且建筑密度不大于35%”。
第三步,检索增强找到了两个候选存量建筑:一栋是原街道办旧楼,建筑面积约1800平方米,结构状况良好,但周边道路较窄;另一栋是废弃仓库,建筑面积约3200平方米,临主干道,但土地权属复杂。
3.3 方案推演和对比表:模型如何形成推荐意见
模型在第四步生成了两套方案,并输出了一张对比表。我在实际系统里会让模型按固定JSON结构输出这种表格的事实性内容,再由前端渲染:
| 评估维度 | 方案A:改造街道办旧楼 | 方案B:改造废弃仓库 |
|---|---|---|
| 可建设面积 | 约1800平方米,床位约60张 | 约3200平方米,床位可达100张 |
| 服务覆盖 | 地处片区中心,步行800米覆盖约70%老年人口 | 临主干道,覆盖约55%老年人口 |
| 改造难度 | 结构较好,仅需加固;但周边道路窄,施工期间交通影响大 | 结构较旧,改造成本高;权属复杂,周期预计多6个月 |
| 规划符合性 | 符合,无需调整用地性质 | 需协调工业用地转公共服务用地手续 |
模型的推荐意见是:若近期需求迫切,优先方案A,因其建设周期短、服务覆盖更好;若中期床位缺口持续扩大,再启动方案B的准备,同步处理权属问题。
这个结论不惊艳,但它是对的,而且每一步都有出处。这比模型说出一大段漂亮的空话有用得多。
3.4 为什么模型在这类问题上能“帮上忙”而不是“添乱”
核心原因在于:这类选址推理的本质,是在有限选项里做多目标权衡,而不是在未知信息里做创造。模型不擅长精确创造事实,但它擅长“在给定信息下梳理选项关系”。只要我们把选项和约束喂给模型,它就能逻辑自洽地把权衡关系描述清楚。
当然,前提是信息本身要可靠。所以我在系统设计里,候选建筑的信息不是模型生成的,而是来自资产数据库的结构化记录。模型只做“基于这些记录的比较”,不做“自己觉得自己应该补充什么记录”。这一条边界,是后面所有防幻觉操作的前提。
4. 推理应用最怕的“一本正经胡说八道”:三个高频坑和兜底方案
4.1 坑一:模型会“记住”不存在的规划条款
用过的人基本都会遇到:模型非常自信地引用一条看起来极其专业的条文,但你回去翻规范文本,根本找不到。它并不是故意骗你,而是训练语料里见过相似文本,生成时“脑补”出了相近的表述。
我的兜底方案很简单:让引用必须走检索通道。模型不能直接输出“根据某条规定”,而是先由程序去条款库做检索,再把检索到的候选条文编号传给模型,模型只能引用编号范围内的条款。引用库之外的东西,一律在输出前由校验器过滤掉。这也是我坚持做第二步“约束提取”而不是让模型自由发挥的原因。
4.2 坑二:数字换算和空间关系容易崩
城市决策避不开数字:建筑密度、容积率、服务半径、床均面积。模型对“3000平方米每天照料100人够不够”这类计算,偶尔能对,但只要你换一个更绕的表述,它就可能算出离谱的结果。另外,空间关系上,模型没有真正的空间认知,“这个地块在另一个地块东侧800米”这种描述它很难准确判断。
解决方案:数字计算和空间计算一律不给模型做。在流水线里,凡是涉及指标换算、空间叠加的,调用外部计算模块——GIS做服务半径,脚本做指标核算,模型只负责解释这些计算结果的规划含义。我把它称作“模型管语义、程序管事实”的混合架构。
4.3 坑三:前后推理不一致
有一种情况在长对话里尤其明显:前一轮模型说地块A满足日照要求,后一轮讨论方案优化时,它又默认地块A日照不达标,因为“前期提到周边建筑较高”。它不会主动告诉你它悄悄改口了。
针对这个,我在校验层里加了“结论一致性检查”:把同一任务的所有关键结论汇总成一张布尔表。比如“方案A是否满足日照要求”,只允许模型在每一轮里给出相同状态,如果出现变化,必须要求模型明确说明“之前判断有误,原因是……”,否则系统不更新结论。这个机制在人工审核时也非常好用,因为一眼就能看出哪些点被反复翻转过。
4.4 工程兜底:规则引擎、数据源接入和人工复核缺一不可
最后总结我的经验:模型做推理应用,真正能不能用的关键,不在模型本身,而在周围有没有一套“较真”的工程系统。我在项目里引入了三条兜底原则:
- 单位置事实:所有事实性数据(地块面积、人口、权属)必须以结构化数据源为准,模型输出中若出现与数据源不一致的数字,直接以数据源修正。
- 双层校验:第一层是程序校验(数值范围、条款编号、指标是否达标),第二层是规划师复核(语义上是否恰当、背景是否遗漏),两层都过才可出系统。
- 责任留痕:每一次推理的输出与依据,都自动写入追溯记录,任何人可以在事后核查“当时为什么给这个建议”。
这三条看着简单,但在实际系统里执行到位并不容易。一旦执行到位,大语言模型在城市规划决策支持中就从一个“有趣但不敢用”的玩具,变成一个“能分担工作量但不出圈”的工具。
5. 让推理过程可回溯:面向规划决策场景的可解释性设计
5.1 规划决策不同于日常问答:结论必须有“案底”
我用这套系统时,反复被规划口的同行问一个同样的问题:“AI给的建议,我怎么写进会议纪要和上报材料里?”言下之意,如果AI的建议没有出处、没有推演过程,哪怕结果再合理,也没法承担公共决策中的举证责任。
所以可解释性不是加分项,而是硬需求。我的做法不是让模型用长篇大论解释自己,而是建立一套“推理记录表”。每个建议背后,都对应一条可回查的记录。
5.2 推理记录表:一个可落地的字段设计
在系统数据库里,每条建议都会生成一条记录,字段大致如下:
| 字段名 | 内容示例 | 用途 |
|---|---|---|
| 任务编号 | TASK-2025-0114 | 一次完整决策请求的唯一标识 |
| 输入描述 | “拟新增养老照料中心,请给出选址建议” | 保留决策者原始意图 |
| 引用条款 | 控规第X章X条、养老设施专项规划第X条 | 说明建议的法理依据 |
| 数据来源 | 某片区资产数据库、人口统计库 | 说明建议的事实依据 |
| 主要矛盾 | 存量改造面积不足与新建占地指标受限 | 说明主要权衡点 |
| 推荐结论 | 优先改造原街道办旧楼 | 核心输出 |
| 复核状态 | 待复核 / 已通过 / 已驳回 | 人工闭环入口 |
有了这张表,整个推理过程的性质就变了:它不再是一个不可捉摸的模型吐字,而是一个有编号、有依据、有状态的“电子工单”。规划师审核时只需要做一件事:逐项核验依据和结论是否匹配,而不是从头理解一堆对话。
5.3 通过“最小确认原则”把决策权留给人
我后来在系统里还加了一条交互规则,叫“最小确认原则”:如果推理结果需要改变原有用地的法定用途,或者会突破某个限制性指标,系统不能直接出方案,而必须弹出一条人工确认项,提示“该建议涉及指标调整,请规划师确认后再继续”。
这么做的好处是:既发挥了模型在推演环节的效率,又不让模型在“法定边界”上做决定。在城市的公共决策里,这种“人机权限分离”比任何性能指标都重要。
6. 哪些规划决策适合大语言模型推理、哪些还不行:我的划分清单
6.1 适合的:方案初筛、矛盾提示、材料起草、情景权衡
经过大半年的反复测试,我总结出四类适合让大语言模型承担推理工作的场景:
- 方案初筛:从十几个备选地块、备选路网里先过滤明显不合理的,缩小人工评审范围。
- 矛盾识别:给定多个规划目标,让模型快速列出彼此冲突的组合,提示决策者重点讨论。
- 材料起草:基于结构化数据生成规划说明书的初步文本,人工润色。
- 情景权衡:输入“如果优先保产业空间,公共服务设施会受影响多少”,让模型把利弊关系推演出来。
这四类的共同点是:结论不需要百分之百精确,但推理的广度和速度很重要,而这两点恰好是模型的强项。
6.2 还不太适合的:法定审批、精确空间计算、涉众利益分配
同时我也必须说实话,有三类事情现阶段我绝不建议让模型直接参与决策:
- 法定审批定论:比如“该地块能否提高容积率”,这是行政许可范畴,必须依靠有法律效力的条文和人工审批,模型只能作为参考材料,不能作为定论。
- 精确空间计算:服务范围是否全覆盖、日照遮挡角度是否达标,必须由专业计算引擎完成,模型描述性回答不构成技术结论。
- 涉及多方利益分配的裁决:比如“哪个村优先获得安置”,这类问题牵扯复杂社会语境,模型推理反而可能简化掉关键背景,容易误导。
6.3 给想动手做同类系统的几点实操建议
如果你也打算做类似的东西,我最后分享几个从坑里爬出来才明白的小建议:
- 优先控制输出格式。一开始就要求模型输出JSON结构化的推理结果,比让它自由写作再解析要节省大量开发时间。
- 温度参数调低些。规划推理不是创意写作,温度建议在0到0.2之间,减少随机性。
- 示例Prompt要真实。我自己曾用一套编造的规划问答做示例,效果很差;换成由规划师实际修改过的真实任务示例后,模型表现明显提升。
- 版本管理你的规范库。规划条文会更新,每次更新都必须同步重算向量索引和条款编号表,否则模型就会引用过期内容,这是最隐蔽的坑。
我现在的习惯是,每次接入一个新场景,先不急着追求“聪明的结论”,而是先确保“笨但正确”的流程可以跑通。把引用、校验、记录这些地基砌稳,再让大语言模型的推理能力在上面发挥。顺序反了,后面大概率要重建。