主题
M8 人流密度(Demo 场景 PRD)
| 项 | 内容 |
|---|---|
| 文档定位 | 08_移动端AI场景设计.md §10 中反引号标记的 demo 模块的场景 PRD。本文是 M8;模板见 公共规范.md §8 |
| 通用 demo 规范 | 前端形态、系统提示词边界、定时任务方式、数据与输出规范见 公共规范.md;本文只写 M8 场景本身 |
| 能力来源 | 02_人流密度与空间洞察.md(数据源、点位映射、空间类型口径) |
| 版本 | v0.1 |
1. 场景定义
1.1 一句话
管理者按需问「现在哪里人多、会不会超容、会不会堵」,Agent 给实时人数、密度分级、趋势峰值、超容与突增提示,并给分流、新风、安保建议(只建议,不控制)。
1.2 用户与价值
| 项 | 内容 |
|---|---|
| 用户 | 管理者(demo 账号 M1001) |
| 价值 | 不翻看板、不逐个点摄像头,一句话拿到「哪挤、为什么、要不要现在处理」 |
| 频次 | 按需,无定时推送 |
1.3 触发方式
- 被动问答,没有定时任务。
- 典型 query:
- 「现在 3 楼哪些区域人多?」
- 「报告厅散场会不会堵?」
- 「今天上午人流高峰什么时候?」
- 「哪个区域人数突然变多?」
- 「302 现在坐了多少人?会不会坐不下?」
- 首次未说明范围时,默认「当前楼栋、实时」,并在回复中写明口径,让用户追问换楼层/换时段。
1.4 边界
| 不做 | 原因 |
|---|---|
| 不做定时任务、主动推送 | M8 是被动问答;超容/突增的主动预警归 O1/O9,并与信息发布联动 |
| 不做真实平面热力图 | 需要平面图叠加和前端渲染,聊天区只能出 Markdown + Mermaid;demo 用「楼层面分布柱状图 + 密度分级表」表达,历史热力待确认 |
| 不控制设备 | 新风、照明、信息屏、门禁只给建议,执行由规则引擎/BA 完成 |
| 不做个人识别与轨迹 | 不人脸识别、不存人脸图、不按人追踪 |
| 不统计停车/充电 | 车辆归 S2,车位 ≠ 人数 |
| 不用 WiFi/蓝牙探针、不用 CO₂ 反推人数 | 精度与归属不可靠(见 02 §1) |
| 不跨空间类型排名 | 教室看占用率、通道看密度,口径不同,混排会得出错误结论 |
| 不承诺精确人数 | 摄像头计数误差约 ±10%~20%,对外只给分级和趋势 |
1.5 前置条件:点位-空间映射配置
M8 的所有指标都建立在「点位 → 空间」映射上。没有这张表,摄像头和闸机的人数无法落到房间、楼层,本场景不成立。
1.5.1 配置字段
| 字段 | 说明 | 示例 |
|---|---|---|
point_id | 数据源点位 ID | CAM-3F-301 / GATE-1F-E01 |
source_type | 数据源类型 | camera / turnstile / parking |
space_code | 绑定的空间编码,未映射时为空 | A-3F-302 |
space_name | 空间名称 | 302 案例讨论室 |
space_type | 空间类型 | classroom / discussion / study / auditorium / canteen / corridor / office / interview / lounge |
coverage | 该点位覆盖的物理范围 | 室内全画面 / 3F 东侧走廊 |
area_m2 | 覆盖面积(㎡) | 65 |
capacity | 设计容量(人);通道类可空 | 40 |
effective_from / effective_to | 生效期,to 为空表示长期 | 2026-09-01 / — |
owner | 配置维护人/班组 | 弱电 |
status | 状态 | active / inactive / pending |
1.5.2 映射规则
- 一个点位只绑一个主空间(跨空间覆盖时拆点位);一个空间可绑多个点位(多摄像头、摄像头 + 闸机)。
- 同空间多点位不直接相加:由空间级
combine_mode决定——重叠覆盖取max,互补覆盖取weighted(权重按覆盖面积配置,和为 1)。模型不自行选择,MCP 按配置算。 - 未映射 / 已过有效期 /
status≠active的点位进「待配置」清单,看板与回答都标「待配置」,显式列出,不计入合计,不静默丢弃。 - 空间主数据存在但没有有效点位,该空间同样标「待配置」,不显示为 0。
- 变更走后台维护页并保留版本;demo 用样例点位表 + 模拟数据把机制跑通,正式建设替换真实点位。
1.5.3 样例点位表(demo)
| point_id | source_type | space_code | space_name | space_type | coverage | area_m2 | capacity | effective_from/to | owner | status |
|---|---|---|---|---|---|---|---|---|---|---|
| CAM-3F-301 | camera | A-3F-301 | 301 阶梯教室 | classroom | 室内全画面 | 180 | 100 | 2026-09-01 / — | 弱电 | active |
| CAM-3F-302 | camera | A-3F-302 | 302 案例讨论室 | discussion | 室内全画面 | 65 | 40 | 2026-09-01 / — | 弱电 | active |
| CAM-3F-303 | camera | A-3F-303 | 303 研讨室 | discussion | 室内全画面 | 40 | 30 | 2026-09-01 / — | 弱电 | active |
| CAM-3F-PUB-A | camera | A-3F-PUB | 3F 公共区 | corridor | 电梯厅 | 120 | — | 2026-09-01 / — | 弱电 | active |
| CAM-3F-PUB-B | camera | A-3F-PUB | 3F 公共区 | corridor | 中庭 + 东侧走廊 | 240 | — | 2026-09-01 / — | 弱电 | active |
| CAM-3F-305 | camera | —(未绑定) | — | — | 3F 东侧走廊北段 | 80 | — | 2026-09-01 / — | 弱电 | pending |
| CAM-AUD-01 | camera | A-1F-AUD | 报告厅 | auditorium | 观众席全画面 | 400 | 200 | 2026-09-01 / — | 弱电 | active |
| CAM-AUD-FOYER | camera | A-1F-AUD-FOYER | 报告厅前厅 | corridor | 前厅 + 东侧通道 | 120 | — | 2026-09-01 / — | 弱电 | active |
注:3F 公共区两路摄像头在电梯厅入口重叠约 40 ㎡,直接相加会把同一批人算两遍;空间级规则配 max,取两路中的较大值。面积按并集 320 ㎡ 计(120 + 240 − 40)。
1.5.4 空间组合规则
| space_code | combine_mode | 说明 |
|---|---|---|
| A-3F-PUB | max | 两路重叠,取最大值 |
| A-1F-AUD | max | 单路,等价于原值 |
| 其他空间 | max(默认) | 只有显式配 weighted 才加权 |
1.5.5 demo 如何跑通
启动时加载样例点位表与空间主数据,每个点位模拟实时人数(含断连、未映射两种异常);MCP 按 space_code 聚合、按 combine_mode 去重、按空间类型算指标与分级;回答同时给出「已映射合计」和「待配置/暂无」清单,证明没有静默丢弃。
1.5.6 通道/出口档案
点位表只解决「哪个点位的人数归到哪个空间」;通道宽度、出口数量、通行能力属于通道/出口档案,不在点位表里,由业务系统维护,用于流量判断与散场预判(见 §10)。没有这份档案时,M8 只能给当前密度,不能给「会不会堵」的定量结论。
1.6 数据源边界
| 数据源 | 提供什么 | 用途 | 限制 |
|---|---|---|---|
| 闸机 | 进/出计数、刷卡记录 | 出入口人数、楼层净流入校验 | 只覆盖出入口,不能直接当房间人数 |
| 摄像头 AI 人数统计 | 区域/画面人数 | 房间、区域、通道的当前人数与历史 | 有遮挡和误差,断连时为空 |
| 预约 / 课表 / 活动 | 计划人数、时段 | 未来值、解释突增、散场预判 | 计划值,不是实测 |
| 停车 / 充电 | 车位、进出 | 不归 M8 | 归 S2 |
| WiFi / 蓝牙探针 | 终端数 | 不采用 | MAC 随机化、跨层归属不清 |
| CO₂ 反推人数 | 浓度 | 不采用 | 精度不可靠,只作环境指标 |
| 人脸识别 / 人脸图 | — | 不做 | 隐私边界 |
1.7 空间类型决定口径
| 空间类型 | 主口径 | 分级依据 | 当前人数怎么用 |
|---|---|---|---|
| 阶梯教室 / 教室 | 占用率 = 人数 ÷ 容量 | 舒适 <80%,接近容量 80–100%,超容 >100% | 看是否坐满、是否影响上课 |
| 案例讨论室 / 研讨室 / 面试间 | 占用率 = 人数 ÷ 容量 | 同上 | 看是否接近满员、有无备选 |
| 自习区 | 座位占用率 = 人数 ÷ 座位数 | 同上(容量按座位数配) | 看座位是否紧张 |
| 报告厅 / 食堂 | 当前占用率 + 峰值 | 当前按占用率;结论看峰值和散场 | 看峰值是否超容、散场是否拥堵 |
| 公共通道 / 大堂 / 交流区 | 密度 = 人数 ÷ 面积(人/㎡) | 舒适 <0.5,接近容量 0.5–1.0,超容 >1.0 | 不看占用率,看密度与峰值 |
- 阈值按空间类型配置,由业务系统或 MCP 计算并返回
density_level/flow_level,模型不自己判。 - 同类空间可横向比较;跨类型不排名,只给趋势。 例如不能把 302 的 95% 占用率和公共区的 0.18 人/㎡ 放在一张榜上比。
- 通道类容量可空;容量为空时只算密度,不算占用率。
2. Demo 形态
通用形态见 公共规范.md(小程序悬浮球打开 DeerFlow 聊天区、单会话、Markdown + Mermaid)。
本场景只约定:
- 登录管理者账号,点悬浮球,在常驻会话直接提问;追问沿用上一轮范围,如先问「3 楼」再问「那 4 楼呢」。
- 回复由「结论段 + 空间表 + 最多 2 张 Mermaid + 提示 + 建议」组成,不出现自定义业务卡片;热力用「楼层面人数分布柱状图 + 密度分级表」表达,不做平面图叠加。
- 结果不写首页洞察卡片(M8 不是 L4 主动服务)。
注(演示脚本):问「现在 3 楼哪些区域人多?」→ 看实时表与分级 → 追问「报告厅散场会不会堵?」→ 看散场预判与建议。
3. Agent 输出设计
3.1 输出元素
| 元素 | 用途 |
|---|---|
| Markdown 文字 | 结论、口径、原因、建议 |
| Markdown 表格 | 空间清单(空间/人数/容量/占用率/密度/等级/更新时间) |
Mermaid xychart-beta(bar) | 楼层面人数分布,最多 8 个空间 |
Mermaid xychart-beta(line) | 时段趋势、散场曲线 |
| Markdown 链接 | 「查看人流看板」跳转 |
一次回复最多 2 张图;不输出 JSON、不用 HTML、不输出快捷按钮。
3.2 实时查询(主场景)
示例(2026-11-04 10:42,3F):
用户
现在 3 楼哪些区域人多?
Agent
3F 当前已映射空间合计 186 人(10:42)。301 阶梯教室 92 人、占用率 92%,302 案例讨论室 38 人、95%,都接近容量;3F 公共区 56 人、密度 0.18 人/㎡,舒适。303 研讨室摄像头断连,暂无数据;东侧走廊点位未映射,待配置。
空间 当前人数 容量 占用率 密度(人/㎡) 等级 更新时间 301 阶梯教室 92 100 92% 0.51 接近容量 10:42 302 案例讨论室 38 40 95% 0.58 接近容量 10:42 3F 公共区 56 — — 0.18 舒适 10:42 303 研讨室 暂无 30 — — 数据不可用 — 3F 东侧走廊 待配置 — — — 待配置 — 合计 186 — — — — 10:42 说明:
- 合计只含 3 个已映射且有数据的空间(92 + 38 + 56 = 186),303 和东侧走廊不计入;公共区两路摄像头取
max,不是 48 + 56,直接相加会多算重叠区。- 表格按楼层/空间编码排列,不按等级排名;柱状图只表示人数分布,不表示利用率高低。
- 建议:301、302 均接近满员,课间在 3F 电梯厅引导分批进出,避免两间同时散课叠加;303 修好摄像头后再纳入观察;公共区舒适,无需调整新风。
3.3 时段趋势与峰值
示例:
用户
今天上午 3F 人流高峰什么时候?
Agent
上午有两个高峰:08:50–09:05 入场,约 210 人;10:20–10:30 课间流动,约 200 人。10:42 回落到 186 人,11:00 后开始离楼。
口径:3F 已映射空间合计,不含 303 与未映射走廊;09:00 峰值对应 08:50 前后的入场,10:30 峰值对应课间流动。历史和实时必须同口径才能比较。
3.4 散场预判(有日历)
示例(16:50):
用户
报告厅散场会不会堵?
Agent
会短时超容。报告厅 17:00 结束(讲座,报名 180 人),当前 175 人(今日峰值 180)、占用率 87.5%。按同类讲座历史曲线,约 80% 的人在结束后 5 分钟内离场,预计 140 人集中进入 120 ㎡ 前厅(按 1.0 人/㎡ 运营密度阈值折合容量 120 人),瞬时密度约 1.17 人/㎡,超过超容阈值。
建议:
- 提前 5 分钟开东侧门并广播分两批离场,单批约 70 人、密度约 0.58 人/㎡,回到接近容量。
- 前厅加派 2 名安保,重点看东侧通道汇入口。
- 信息屏切到「东侧通道」引导画面。
注:计算链由业务系统/MCP 完成,Agent 只展示结果:175 × 80% = 140 人;140 ÷ 120 ㎡ ≈ 1.17 人/㎡;分两批 70 ÷ 120 ≈ 0.58 人/㎡。本例的 1.0 人/㎡ 是运营密度阈值,不是消防疏散通行能力;正式项目应同时取通道档案的 capacity_ppm,用「离场流率 vs 通行能力」判断瓶颈。历史曲线来自模拟样本,正式项目用真实散场数据。
3.5 散场预判(无日历/无历史)
- 没有活动日历或历史散场数据时,只给当前值,不硬预测。
- 示例:「报告厅当前 175 人、容量 200、占用率 87.5%(16:50)。该时段没有活动日历,也没有可用的历史散场曲线,无法判断结束时间和集中离场人数。建议现场确认活动结束时间后再看通道。」
- 有日历但无历史曲线时:可给结束时间,但不给离场人数与密度,写「缺历史散场样本,只能按结束时间提醒」。
- 有历史但无日历时:可给「若散场,约 N 人」,但必须标「假设」,并说明结束时间未知。
- 没有实时流量接口时:只给当前人数/密度,不给流率,也不做「会不会堵」的定量判断。
3.6 突增提示
示例:
用户
哪个区域人数突然变多?
Agent
15:20 报告厅 5 分钟内从 20 增至 180(+160,+800%),超过突增阈值(5 分钟 +100 人或 +50%,且人数 ≥80)。日历显示 15:30 有讲座入场,属预期突增,不是异常。当前 180/200(90%,接近容量),建议入口分流、加派 1 名安保。
- 有日历:说明「预期突增/非预期」,并引用活动名称与开始时间。
- 无日历:标「原因待核实」,不武断判为异常;给出现场确认建议。
- 阈值由配置给出,MCP 返回事件等级,模型不自己设阈值。
3.7 异常与降级
| 情况 | 输出 |
|---|---|
| 点位未映射 / 已失效 | 该空间标「待配置」,列入清单,不计入合计 |
| 摄像头断连 | 该空间「暂无」,不写 0,不画进柱状图 |
| 同空间多摄像头重叠 | 按 combine_mode 去重,回复注明「已去重,取最大值/加权」 |
| 人数误差 ±10%~20% | 对外用「舒适/接近容量/超容」分级和趋势,不承诺精确人数 |
| 未来值来自课表/预约 | 明确写「计划值,非实测」;调停课、缺席会使实际偏离 |
| 突增误报 | 结合活动日历解释;无日历标「待核实」 |
| 历史样本不足 | 只给当前值,不做趋势和散场预测 |
| 无实时流量接口 | 只给人数/密度分级,注明「流量数据不可用」,不做拥堵判断 |
| 无通道/出口通行能力 | 不给定量散场预测,只给当前密度和定性建议 |
| 阈值档案缺失 | 用空间类型默认值,标注「默认阈值,未经甲方确认」 |
| MCP 失败 | 回「暂无数据」,不编造、不按 0 处理 |
3.8 口径说明(随回复附一句)
- 占用率 = 当前人数 ÷ 设计容量;密度 = 当前人数 ÷ 覆盖面积;都由 MCP 算好,带
updated_at。 - 房间类阈值:<80% 舒适、80–100% 接近容量、>100% 超容;通道类:<0.5、0.5–1.0、>1.0 人/㎡。demo 用默认值,生产按空间类型配置。
- 合计只汇总「已映射且有数据」的空间;同空间多点位先去重再汇总。不同更新时间的数字不放在同一句里比较。
3.9 输出模板(开发参考)
本节给 Skill 组装输出用,业务评审可跳过。
实时查询:
结构固定:结论段({范围}当前已映射空间合计 {N} 人,{时间};{最挤的 1–2 个};{异常空间})→ 空间表 → 柱状图(只画有数据的空间)→ 待配置/暂无说明 → 建议(≤3 条)。
时段趋势与峰值:
结构固定:结论段({范围}上午高峰在 {时段},约 {峰值} 人;次高峰 {时段})→ 折线图 → 峰值与课表/活动的对应关系 → 口径说明。
散场预判:
结构固定:结论(会/不会短时超容)→ 依据(结束时间、当前人数/占用率、历史散场比例、通道面积/通行能力)→ 数字(预计 X 分钟后 Y 人离场,密度约 Z 人/㎡)→ 建议(分流/安保/信息屏)。
4. MCP 设计
4.1 query_crowd_realtime
| 项 | 内容 |
|---|---|
| 作用 | 查指定范围的当前人数、密度与分级 |
| 入参 | scope_type(space|floor|building)、scope_id(空间编码/楼层/楼栋)、space_types(可选,数组)、include_pending(bool,默认 true) |
返回:
| 字段 | 类型 | 说明 |
|---|---|---|
| scope | object | scope_type、scope_id、scope_name |
| updated_at | string | 数据更新时间 |
| total_people | int/null | 已映射且有数据空间的合计;无法汇总时为空 |
| total_basis | string | 合计口径,如「已映射 3 个空间,未含待配置」 |
| data_quality | enum | high / medium / low |
| spaces | array | 空间数组,字段见下 |
| pending_spaces | array | 待配置/暂无清单:space_code、space_name、reason(unmapped/expired/offline)、last_seen |
spaces[] 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| space_code / space_name | string | 空间编码与名称 |
| space_type | enum | classroom / discussion / study / auditorium / canteen / corridor / office / interview / lounge |
| floor | string | 楼层 |
| people | int/null | 当前人数;断连为空 |
| capacity | int/null | 设计容量,通道类可空 |
| area_m2 | number | 覆盖面积 |
| occupancy_rate | number/null | 占用率(0–100),通道类为空 |
| density | number/null | 人/㎡ |
| density_level | enum | comfortable / near_capacity / over_capacity / unavailable |
| flow_in_ppm | number/null | 实时流入率(人/min),业务系统返回;无接口时 null |
| flow_out_ppm | number/null | 实时流出率(人/min),业务系统返回 |
| net_flow_ppm | number/null | 净流入率(人/min),流入 − 流出 |
| flow_level | enum/null | comfortable / near_capacity / over_capacity / unavailable |
| flow_basis | enum | measured / derived / unavailable |
| threshold_version | string | 阈值档案版本,用于解释「为什么判这个等级」 |
| mapping_status | enum | mapped / unmapped |
| data_quality | enum | high / medium / low / unavailable |
| source_types | array | camera / turnstile |
| combine_mode | enum | max / weighted / single |
| updated_at | string | 该空间数据更新时间 |
| note | string | 去重、断连等说明 |
注(计算位置):人数聚合、去重、占用率、密度、流量、分级、阈值比较全部由业务系统或 MCP 指标服务算好;Agent 不使用「人数 ÷ 面积」「人数 ÷ 时间」自行推算,也不自行判断是否超阈值。
4.2 query_crowd_history
| 项 | 内容 |
|---|---|
| 作用 | 查时段趋势、峰值与峰值时段 |
| 入参 | scope_type、scope_id、space_codes(可选)、start、end(ISO 时间)、granularity(5/15/30/60 分钟)、metric(people|density) |
返回:
| 字段 | 类型 | 说明 |
|---|---|---|
| updated_at | string | 数据更新时间 |
| granularity | int | 采样粒度(分钟) |
| data_quality | enum | high / medium / low |
| spaces | array | 每空间:space_code、space_name、capacity、area_m2、mapping_status、data_quality、series(ts、people、density_level)、peak(ts、people、density_level)、peak_periods(start、end、people) |
注:序列中的空值保留为 null,不补 0;有效样本覆盖不足时标「样本不足」,不补点。
4.3 query_space_calendar
| 项 | 内容 |
|---|---|
| 作用 | 查课程/预约/活动,用于解释突增与散场预判 |
| 入参 | space_codes(数组)或 floor、start、end |
返回:
| 字段 | 类型 | 说明 |
|---|---|---|
| updated_at | string | 数据更新时间 |
| data_quality | enum | high / medium / low |
| events | array | event_id、space_code、space_name、title、start、end、expected_people、source(course/booking/activity)、status、`updated_at |
注:expected_people 是计划值,不是实测;无日历时返回空数组,不推断。
4.4 query_crowd_events(可选)
| 项 | 内容 |
|---|---|
| 作用 | 查超容/突增/断连事件 |
| 入参 | scope_type、scope_id、start、end、event_types(over_capacity/surge/sensor_offline)、min_level |
返回:events[] 含 event_id、space_code、space_name、type、level、started_at、ended_at、peak_people、threshold、calendar_event_id、status、mapping_status、data_quality、updated_at。
4.5 query_crowd_flow
| 项 | 内容 |
|---|---|
| 作用 | 查单位时间内的流入、流出、净流与流量分级,用于拥堵、突增、散场判断 |
| 入参 | scope_type(space|floor|building)、scope_id、space_codes(可选)、window_min(1 / 5 / 15,默认 5) |
返回:
| 字段 | 类型 | 说明 |
|---|---|---|
| updated_at | string | 数据更新时间 |
| window_min | int | 统计窗口(分钟) |
| spaces | array | 每个空间/通道的流量结果,字段见下 |
| data_quality | enum | high / medium / low |
spaces[] 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| space_code / space_name | string | 空间编码与名称 |
| flow_in_ppm | number/null | 流入率(人/min) |
| flow_out_ppm | number/null | 流出率(人/min) |
| net_flow_ppm | number/null | 净流入率(人/min) |
| flow_level | enum | comfortable / near_capacity / over_capacity / unavailable |
| capacity_ppm | number/null | 通道/出口通行能力(人/min),来自通道档案 |
| basis | enum | measured / derived / unavailable |
| threshold_version | string | 阈值档案版本 |
| data_quality | enum | high / medium / low / unavailable |
注:流量不在 Agent 里算。 有越线计数或闸机进出计数时,业务系统直接返回 basis=measured;只有区域人数序列时,由业务系统或 MCP 指标服务按时间差分估算,basis=derived,回复必须标「估算值」;两者都没有时返回 unavailable,M8 不做流量判断,只做人数/密度分级。
4.6 通用约定
- 所有工具返回
updated_at;人数聚合、密度、流量、分级与阈值比较在业务系统或 MCP 内完成,模型只解读。 - 人数为空返回
null,不返回 0;空数组表示「无数据」,不是「没人」。 - 同一空间多点位在 MCP 内按
combine_mode去重后再返回,模型不做聚合。 - 工具不返回摄像头原始画面、人脸特征、个人轨迹。
5. Skill 设计
5.1 职责
把「解析范围 → 实时 → 按需取历史/日历 → 判断分级与突增 → 组装输出」这套固定流程写死,保证每次回复结构一致、数字都有来源。
5.2 流程
5.3 提示词草稿
你是上海交通大学新院区 IBMS 的管理者助手。用户会问人流密度、趋势和散场拥堵,你要给出可执行的建议。
输入:
- 管理者 ID:从对话上下文取(demo 固定 M1001)
- 数据范围:全院
步骤:
1. 解析范围:空间/楼层/楼栋,时间默认当前;没说范围时按当前楼栋并写明。
2. 调 query_crowd_realtime 取当前人数、容量、面积、occupancy_rate、density、density_level、flow_level、mapping_status、data_quality、updated_at。
3. 问流量/拥堵:调 query_crowd_flow 取 flow_in_ppm、flow_out_ppm、net_flow_ppm、flow_level、capacity_ppm、basis;流量、阈值、分级都直接用返回值,不自己算。
4. 问趋势/峰值:调 query_crowd_history,按 30 分钟粒度给折线。
5. 问散场/未来/突增:调 query_space_calendar 取结束时间和计划人数;再结合实时流量和历史散场曲线。
6. 分级只用工具返回的 density_level / flow_level,不自己算、不自己定阈值。
7. 组装:结论 → 空间表 → 最多 2 张图 → 待配置/暂无说明 → 建议(≤3 条)。
输出要求:
- 只用 Markdown 和 Mermaid,不输出 JSON、不用 HTML。
- 空值写「暂无」,不写 0;待配置空间单列,不计入合计。
- 同空间多点位按工具结果去重,不自行相加。
- 不跨空间类型排名;教室看占用率、通道看密度,只给趋势。
- 流量、阈值、分级只用工具返回值;不用人数÷面积、人数÷时间自行推算;工具无流量时写「暂无流量数据」,不做拥堵判断。
- 人数有 ±10%~20% 误差,用分级和趋势表达,不承诺精确。
- 未来值写「计划值,非实测」。
- 日历和历史都缺时,明确说只能给当前值,不硬预测;只缺一项时说明假设与缺口。
- 建议只给分流、新风、安保、信息屏引导,不控制设备。
- Few-shot:把本文 §3.2(实时)和 §3.4(散场预判)的示例原文放入 skill。5.4 工具调用顺序与失败策略
| 步骤 | 调用 | 失败时 |
|---|---|---|
| 1 | query_crowd_realtime | 回「暂无数据」,不编造;不继续猜 |
| 2 | query_crowd_flow | 只给人数/密度,注明「流量数据不可用」,不做拥堵判断 |
| 3 | query_crowd_history | 只给当前值,注明「趋势暂不可用」 |
| 4 | query_space_calendar | 只给当前值,注明「无活动日历,无法预判散场」 |
| 5 | query_crowd_events | 跳过突增段,不影响主结论 |
| 6 | 组装回复 | — |
注:实时是主数据,必须成功;历史、日历、事件都是增强,失败时降级而不是编造。
5.5 追问绕过 Skill
- 「那 4 楼呢?」「302 呢?」「看 9 点到 10 点」这类追问,直接调对应工具换参数,不重跑整套 Skill;换范围沿用上一轮时间口径,换时段沿用上一轮空间口径,并在回复中写明。
6. 定时任务配置
无。
M8 是被动问答,不配置 DeerFlow 定时任务。超容/突增的主动预警归 O1 交接班、O9 夜间巡检/告警值班,并与信息发布屏联动;M8 只负责用户提问时的查询与解释,不在这里新增定时任务。
7. 权限与数据范围
- 管理者账号
M1001,数据范围「全院」;demo 不做按楼/部门的权限切分。 - 只返回空间/楼层/楼栋维度的聚合人数与分级,不返回个人身份、刷卡记录、个人轨迹。
- 不返回摄像头原始画面、截图、人脸图;只返回统计值。
- 空值与 0 严格区分:断连写「暂无」,未映射写「待配置」,都不写 0。
- 生产环境按角色 + 数据范围鉴权;越权范围直接拒绝并说明原因。
8. 验收要点
| # | 验收项 | 标准 |
|---|---|---|
| 1 | 映射缺失 | 未映射点位和空间在回复中标「待配置」,列入清单,不计入合计,不静默丢弃 |
| 2 | 空值处理 | 摄像头断连显示「暂无」,不显示 0,不画进柱状图;合计不含该空间 |
| 3 | 类型口径 | 通道只给密度和峰值,不给占用率;房间给占用率 |
| 4 | 跨类型不排名 | 回复和图表都不出现跨类型利用率排名,只给分布或趋势 |
| 5 | 散场预判(有日历) | 给出结束时间、离场人数、通道密度和分流建议,数字能对上 |
| 6 | 散场预判(无日历/历史) | 明确写「只能给当前值」,不编造结束时间、离场人数或密度 |
| 7 | 图表数量 | 一次回复最多 2 张 Mermaid;柱状最多 8 个空间 |
| 8 | 分级来源 | 等级来自 MCP 的 density_level,模型不改阈值、不自行判定 |
| 9 | 去重 | 同空间多摄像头按 combine_mode 去重,公共区不出现 48+56=104 |
| 10 | 不承诺精确 | 回复用分级/趋势表达,注明人数误差约 ±10%~20%,不承诺精确计数 |
| 11 | 更新时间 | 每个数字带 updated_at,不同时间的数字不混在一句里比较 |
| 12 | 流量来源 | 流量数字来自 query_crowd_flow 或业务系统接口,Agent 不自算;basis=derived 时标「估算值」 |
| 13 | 阈值来源 | 阈值与等级来自业务系统/MCP,回复带 threshold_version;默认阈值标注「未经甲方确认」 |
| 14 | 拥堵判断 | 有流量和通行能力才给定量拥堵结论;缺任一项时只给密度分级,不给「会不会堵」的数字 |
9. 已确认与待确认
9.1 已确认
| # | 事项 | 结论 |
|---|---|---|
| 1 | 交互形态 | 被动问答,无定时任务 |
| 2 | 前置条件 | 必须先有点位-空间映射配置,否则场景不成立 |
| 3 | 数据源 | 人数用闸机 + 摄像头;预约/课表只作计划值与时段解释;不用探针、CO₂、人脸 |
| 4 | 分级 | 舒适 / 接近容量 / 超容三档,阈值由配置给出,业务系统或 MCP 计算 |
| 5 | 热力表达 | demo 用分布柱状图 + 分级表,不做平面热力图 |
| 6 | 权限 | 全院聚合,不返回个人与摄像头画面;demo 固定 M1001 |
| 7 | 计算位置 | 人数聚合、去重、密度/流量、分级、阈值比较由业务系统或 MCP 完成,Agent 只解读 |
| 8 | 流量口径 | 实时流量由业务系统提供;无越线计数时由指标服务差分估算并标「估算值」;都没有则不做流量判断 |
| 9 | 阈值分层 | 状态阈值(占用率/密度)与流量阈值(人/min)分开定义,不互相替代 |
9.2 待确认
- 正式点表与覆盖范围由谁提供?摄像头/闸机点位清单何时可用?
- 每个空间的面积、设计容量、座位数是否有准确台账?通道面积怎么算?
- 同空间多点位的去重规则:哪些空间重叠、哪些互补?
weighted权重谁来配? - 分级阈值(80%/100%、0.5/1.0 人/㎡)是否由甲方确认?是否按空间细分?
- 实时刷新频率是多少?MCP 缓存多久?超过多久算「数据过期」?
- 活动日历/课表能否实时同步?调停课、临时活动是否推送?
- 历史散场曲线是否有足够样本?没有时是否接受「只给当前值」?
- 是否需要历史热力图/平面图叠加?若需要,前端由谁实现?
- 业务系统是否已有实时流量接口?摄像头是否支持越线/方向计数?若只有区域人数,是否接受差分估算并标「估算值」?
- 通道/出口的宽度、数量、通行能力(人/min)由谁提供、按什么标准配置?
- 状态阈值和流量阈值由谁定义、多久评审一次?默认阈值是否需甲方书面确认?
- 消防疏散安全是否明确不纳入 M8?(建议归消防/安保系统,M8 只做运营拥堵提示)
10. 对业务系统的要求
注:本节是 M8 能否成立的前提。M8 不在 Agent 里算人数、密度、流量或阈值;业务系统(或 MCP 指标服务)必须先定义指标、维护参数、提供查询。没有这些接口,M8 只能降级为「查人数 + 看密度」。
10.1 必须定义的阈值
| 类别 | 阈值 | 单位 | 粒度 | 用途 |
|---|---|---|---|---|
| 状态 | 实时人数 | 人 | 空间/点位 | 展示、合计;不直接分级 |
| 状态 | 人数上限 | 人 | 空间/区域 | 容量缺失时的替代分级;有容量时优先用占用率 |
| 状态 | 密度阈值 | 人/㎡ | 空间/通道/空间类型 | 舒适/接近容量/超容 |
| 状态 | 占用率阈值 | % | 房间/座位区 | 舒适/接近容量/超容 |
| 流量 | 流入率阈值 | 人/min | 出入口/通道 | 入场拥堵、突增 |
| 流量 | 流出率阈值 | 人/min | 出口/通道 | 散场拥堵 |
| 流量 | 净流入率阈值 | 人/min | 楼层/区域 | 人员积聚风险 |
| 流量 | 突变阈值 | Δ人/Δmin 或 % | 空间/区域 | 突增事件 |
| 通行 | 通道/出口通行能力 | 人/min(或 人/min·m) | 通道/出口 | 拥堵判定的分母 |
| 散场 | 散场曲线 | 累计离场 % | 空间/活动类型 | 预测离场人数与时间窗 |
要求:
- 状态阈值和流量阈值必须分开定义,不能用「人数上限」代替「流量阈值」。
- 阈值按空间类型给默认值,允许按单个空间/通道覆盖。
- 每条阈值带
threshold_version、生效期、维护人。 - 消防疏散安全阈值不在此列,由消防/安保系统按规范负责;M8 的阈值只用于运营拥堵提示。
10.2 必须提供的查询
| 查询 | 必须返回 | 用途 |
|---|---|---|
| 实时状态 | people、capacity、area_m2、occupancy_rate、density、density_level、updated_at、data_quality | query_crowd_realtime |
| 实时流量 | flow_in_ppm、flow_out_ppm、net_flow_ppm、flow_level、window_min、basis、updated_at | query_crowd_flow |
| 阈值档案 | 各空间/通道的阈值、默认值/覆盖值、threshold_version、生效期 | 解释分级与验收 |
| 通道/出口档案 | width_m、exit_count、capacity_ppm、source | 散场与拥堵判断 |
| 空间主数据 | space_code、space_name、space_type、area_m2、capacity/seats、floor | 密度/占用率 |
| 点位映射 | point_id、source_type、space_code、coverage、status | 人数归属 |
| 历史序列 | people/density/flow 的时序、峰值、峰值时段 | 趋势与散场曲线 |
| 日历 | event_id、space_code、start、end、expected_people | 散场预判 |
| 事件 | over_capacity / surge / sensor_offline 及阈值、等级 | 突增与异常解释 |
10.3 实时流量到底谁算
明确三条:
- 业务系统有流量接口:直接返回
flow_in_ppm/flow_out_ppm/net_flow_ppm,basis=measured。MCP 只透传、聚合、单位换算,Agent 只读。 - 业务系统只有区域人数:由业务系统或 MCP 指标服务按时间差分估算,
basis=derived,并返回window_min。回复必须标「估算值」,不能把估算值说成实测。 - 两者都没有:返回
basis=unavailable,M8 不做流量判断,只给人数/密度分级;不允许 Agent 用人数 ÷ 时间临时推算流量。
补充:
- 流量窗口建议支持 1 / 5 / 15 分钟,默认 5 分钟。
- 越线/方向计数比区域人数差分可靠;如果甲方要求准确流量,需在摄像机选型或安装位置阶段就明确。
- 流量和人数必须同口径、同时间窗,否则不能放在一句话里比较。
10.4 配置与维护责任
| 配置项 | 谁维护 | 频率 | 缺失时 |
|---|---|---|---|
| 空间面积/容量/座位数 | 空间管理/资产 | 建设期 + 变更 | 只给人数,不算密度/占用率 |
| 通道宽度/出口数/通行能力 | 基建/消防/运维 | 一次性 + 改造 | 不做定量散场预测 |
| 状态/流量阈值档案 | 运营/学院/消防 | 初次 + 定期评审 | 用空间类型默认值并标注 |
| 点位-空间映射 | 弱电/IoT | 建设期 + 变更 | 标「待配置」,不计入合计 |
| 活动日历 | 教务/活动系统 | 实时 | 无法预判结束时间 |
| 历史散场曲线 | 数据平台 | 运营后积累 | 只给当前值 |
10.5 降级规则
| 缺失 | M8 的输出 |
|---|---|
| 无流量接口/无流量数据 | 只给人数、密度分级,不判断「会不会堵」 |
| 无通道/出口通行能力 | 不给定量散场预测,只给当前密度和定性建议 |
| 无历史散场曲线 | 只给活动结束时间提醒,不给离场人数/密度 |
| 无阈值档案 | 用空间类型默认值,标注「默认阈值,未经甲方确认」 |
| 无活动日历 | 不预测散场,只给当前状态 |
| 无点位映射 | 标「待配置」,不显示为 0 |
10.6 接口契约
- 所有指标由业务系统/MCP 算好,Agent 不做除法、不做阈值比较。
- 返回
updated_at、data_quality、mapping_status、threshold_version、basis。 - 空值返回 null,不返回 0;失败返回错误码和原因,不返回猜测值。
- 阈值变更后旧回答不可追溯时,需在回答中带版本号。
11. 关联文档
| 文档 | 关联内容 |
|---|---|
02_人流密度与空间洞察.md §1–§5 | 数据源边界、点位-空间映射、空间类型口径、对话示例、隐私约束 |
08_移动端AI场景设计.md §7、§10 | M8 场景来源、管理者时间线、demo 模块定义 |
公共规范.md | 前端形态、常驻会话、智能体边界、输出规范、场景 PRD 模板 |
prd/M7-空间洞察.md | 同目录写法;空间类型口径与「不跨类型排名」保持一致 |
01_能源类AI能力-现状与自有发挥.md | 新风/无人关停的联动阈值归能源篇,M8 只引用 |
prd/ 中 S2、O1、O9 | 停车归 S2;主动预警归 O1/O9,M8 不重复 |
注:上述文档与本文保持一致。如有差异,以本文为准,回写更新对应文档。