Skip to content

S2 充电/车位查询(场景 PRD) ​

项内容
文档定位08_移动端AI场景设计.md §5 学生时间线 08:20、§10 学生模块 S2 充电/车位查询 的场景 PRD;写法见 公共规范.md §8
通用规范引用前端形态、单会话、系统提示词边界、数据与输出规范见 公共规范.md;本文只写 S2 场景本身
能力来源停车/充电业务系统的只读接口(车位占用、进出、充电状态)
复用关系停车/充电为业务系统只读能力,仅做 MCP 封装;导航复用 T2(plan_route / resolve_space),本文只引用不重定义;space-agent 无停车/充电能力,本文不引用
角色说明本文定位学生助手场景。教师有固定车位,不推实时车位,见 08 §12
版本v0.1

1. 场景定义 ​

1.1 一句话 ​

MBA 学生开车到校前后,用一句话问「B2 还有充电车位吗」或「我的车充得怎么样了」,Agent 调停车/充电系统的只读接口,回分区空位 + 更新时间 + 导航入口,或回本人车辆的充电进度。

1.2 用户与价值 ​

项内容
用户开车到校的在职 MBA 学生(示例固定账号 S1001)
价值不用翻充电 App、不用到岗亭问;到校前知道哪个区还有桩,充上电后知道还要多久
频次到校日 0–2 次(MBA 多集中周末上课),按需被动触发
场景位置08 §5 08:20「充电/车位查询」

1.3 触发方式 ​

  • 被动问答(L2 只读),无定时任务;入口是学生助手悬浮球。
  • 两类意图、两个 case:
Case用户原话前置条件Agent 动作输出
A 未充电「B2 还有充电车位吗?」无(车位是公共资源)查指定车库/区域的空闲充电位分区空位、占用率、更新时间、导航入口
B 已充电「我的车现在充得怎么样了?」已完成车牌或充电桩绑定按当前用户查本人车辆充电状态脱敏车牌、电量、功率、预计充满、是否已充满
  • 未说明「充电位 / 普通车位」时,默认按充电车位查,并在首句注明口径;用户明确说「普通车位」再切。
  • 一轮只处理一个主意图;同轮既问空位又问自己的车,先答空位,末尾给「要不要看你的车」选项。

1.4 边界 ​

不做原因
车位预约、锁位、排队、占位停车系统无此能力;Agent 承诺了也保不住
代客泊车、现场调度线下人工流程,不由对话介入
充电启停、预约充电、断电写操作,涉及设备安全与责任边界;本期只读
实时车程、路况、ETC无当前定位与交通方式,算不准(08 §5、§12 明确不推)
停车费预估、缴费计费规则未接,且涉及支付
给教师推实时车位教师固定车位,价值低(08 §12)
查他人车辆、他人充电记录隐私与权限;按 user_id + 绑定关系隔离
承诺「一定有位置 / 一定能充上」空闲位是瞬时快照,随时被占用
把不同车库/楼层的数字相加入口、步行距离不同,相加会误导
前端自定义业务卡片公共规范 §2.5:只做 Markdown + Mermaid + 编号选项/链接

2. Demo 形态 ​

通用形态见 公共规范.md(小程序悬浮球、DeerFlow 聊天区、单会话、Markdown + Mermaid)。本场景只约定:

  • 学生助手 + 悬浮球 + 单会话:登录后进入学生助手常驻会话,不新建会话、不做会话列表。
  • 连续追问:可以先问「B2 还有充电车位吗」,再问「我的车充得怎么样了」;Agent 继承上文车库上下文,但**「我的车」只认绑定关系,不从上下文猜车牌**。
  • 不写首页洞察卡片:被动问答不属于 L4 主动服务,结果只落在当前会话。
  • 演示账号:S1001 已绑定车牌 苏A·1**89 与 B2 东区 03 号桩;S1002 未绑定,用于演示绑定指引。
  • 演示数据:使用真实接口;无真实接口时用明确标注的模拟快照,并在回复末尾注「演示数据」。
  • 导航不内嵌地图页:以 Markdown 链接或编号选项调用 T2 导航能力。

3. Agent 输出设计 ​

3.1 输出元素 ​

元素用途
Markdown 文字结论、更新时间、快照声明、缺失说明
Markdown 表格分区车位表 / 本人充电状态表
Mermaid xychart-beta仅多车库、多区域对比时使用,一次最多 1 张
编号选项 / 跳转链接导航入口、换车库、查我的车、绑定指引
不输出JSON、HTML、自定义卡片、前端组件

3.2 输出口径(硬规则) ​

规则写法
结论先行第一句直接回答「有 / 没有 / 暂无 / 查不到」
空值接口字段为 null 或未返回 → 「暂无」,不写 0
更新时间每次给数都带「更新于 HH:mm」
新鲜度≤10 分钟正常;10–30 分钟加「数据可能不准确」;>30 分钟视为不可用,按「暂无」处理
瞬时值必带「实时快照,以现场为准;不提供预约/占位」
跨车库分区/分库列示,只引用系统返回的合计行,不自行相加
脱敏车牌只出现「苏A·1**89」形式;不出现车主姓名、手机号
预计时间estimated_full_at 为 null 时只给当前电量,不给预计
不承诺不说「肯定有位置」「保证充上」

3.3 Case A:未充电,查空闲充电位 ​

用户

B2 还有充电车位吗?

Agent

有。B2 东区还有 5 个空闲充电位,西区只剩 1 个(更新于 08:19),东区更宽裕。

车库 / 区域类型总位空闲占用率更新时间
B2 东区充电车位16568.8%08:19
B2 西区充电车位8187.5%08:18

以上为实时快照,以现场为准;不提供预约或占位。

  1. 导航到 B2 东区充电区(调用 T2 导航能力,起终点不明确时会先问你在哪)
  2. 看 B1 的充电位
  3. 查我的车充电进度

注:东区、西区分开列示,不合成「B2 共 6 个」;只有停车系统返回合计行时才引用合计。

3.4 Case A 变体:多车库对比 ​

用户

B1 和 B2 哪个充电位多?

Agent

空闲比例上 B2 东区最好(68.8% 占用),B1 最紧张(83.3% 占用)。两个车库入口不同,空位数不相加。

车库 / 区域总位空闲占用率
B112283.3%
B2 东区16568.8%
B2 西区8187.5%
  1. 导航到 B2 东区充电区
  2. 查我的车充电进度

3.5 Case B:已充电,查我的车 ​

用户

我的车现在充得怎么样了?

Agent

你的车(苏A·1**89)正在 B2 东区 03 号桩充电,当前电量 68%,功率 11.2 kW,预计 08:52 充满(约 32 分钟)。数据更新于 08:20。

项目内容
车牌苏A·1**89
充电桩B2 东区 · 03 号
状态充电中
当前电量68%
充电功率11.2 kW
预计充满08:52(约 32 分钟)
  1. 充满后提醒我(仅本次会话文字提示,不做推送)
  2. 查 B2 其他空位

注:已充满时改为「已于 08:52 充满(100%),可以拔枪离开;充电桩状态以现场为准。」不推算费用。功率为 null 时写「功率暂无」,并去掉预计时间;预计时间 null 时只给当前电量。

3.6 Case C:未绑定车辆 ​

用户

我的车充得怎么样了?

Agent

还没有查到你的车辆绑定,暂时无法查询充电状态。请先在「我的 → 车辆绑定」绑定车牌或充电桩编号,绑定后直接问我「我的车充得怎么样了」。

为保护隐私,我不会按姓名或手机号猜车,也不会展示他人的车辆或充电记录。

  1. 去绑定(跳转「我的 → 车辆绑定」)
  2. 我有充电桩编号,先完成绑定

注:多辆车已绑定时,列出脱敏车牌反问「你问的是哪一辆」,不默认查第一辆。

3.7 Case D:接口无数据或失败 ​

用户

B1 还有充电车位吗?

Agent

B1 的充电车位数据暂无:停车系统没有返回该车库的充电位信息,可能是该车库未接入或接口暂时不可用。

空值不代表 0,也不代表没有车位。可以改问 B2,或到服务台/岗亭确认。

  1. 查 B2 的空位
  2. 查我的车充电进度

注:失败时不展示上一次的缓存数字;确有 ≤10 分钟缓存时,必须标注「缓存数据,更新于 HH:mm」。

3.8 异常与降级 ​

情况输出
车库未接入 / 不在配置清单「暂无」+ 列出已接入车库,不猜测车库名
接口超时、非 200「暂无」+ 建议稍后再试或问服务台
空闲位字段 null「暂无」,不显示 0
总位为 0正常写「该区没有充电车位」,建议换区
用户未绑定绑定指引,不猜车牌、不列举他人车辆
绑定多辆车列脱敏车牌反问,不默认
充电中但功率 null给状态和电量,不给功率与预计时间
预计充满 null只给当前电量 + 「预计时间暂无」
充电桩故障状态「故障」+ 建议换桩或联系现场,不给预计
数据超过 30 分钟未更新按「暂无」处理,提示数据不可用

3.9 输出模板(开发参考) ​

本节给 Skill 组装输出用,业务评审可跳过。

Case A 空闲车位:

{结论:哪个区还有几个空闲充电位,更新于 HH:mm}

| 车库 / 区域 | 类型 | 总位 | 空闲 | 占用率 | 更新时间 |
|---|---|---|---|---|---|
| … | 充电车位 | … | … | … | HH:mm |

以上为实时快照,以现场为准;不提供预约或占位。

1. 导航到 {车库} {区域} 充电区(调用 T2 导航能力)
2. 看其他车库
3. 查我的车充电进度

Case B 我的车:

你的车({脱敏车牌}){状态},当前电量 {SOC}%,充电功率 {功率} kW,预计 {HH:mm} 充满(约 {N} 分钟)。更新于 {HH:mm}。

| 项目 | 内容 |
|---|---|
| 车牌 | {脱敏车牌} |
| 充电桩 | {车库} {区域} · {桩号} |
| 状态 | 充电中 / 已充满 / 已插枪未充电 / 故障 / 状态未知 |
| 当前电量 | {SOC}% |
| 充电功率 | {功率} kW |
| 预计充满 | {HH:mm}(约 {N} 分钟) |

4. MCP 设计 ​

4.1 封装原则 ​

  • 停车/充电是业务系统只读能力,本项目只做两个单步原子 Tool,不新建 Agent 能力、不新建业务系统。
  • 两个 Tool 均为只读、幂等,可安全重试;最多重试 1 次,不做无界重试。
  • 超时 3 秒/次(含重试总计 ≤6 秒),超时即返回 source_status=unavailable。
  • 车库清单、区域编码、充电区映射由服务端配置;模型只能从配置清单里选,不自造编码。
  • 车牌在 MCP 出口完成脱敏,Skill 与模型不接触明文车牌。

4.2 query_parking_availability ​

项内容
作用查指定车库/楼层/区域的充电位或普通车位占用快照
权限学生助手只读;公共资源,不含个人信息
入参见下表
参数类型必填说明
garage_codestring是如 B1 / B2,取自服务端车库清单
floorstring否如 B1 / B2;缺省返回该车库全部分区
zonestring否如 east / west;缺省返回全部分区
spot_typeenum否charging / normal / all,默认 charging

返回为分区数组,每行字段:

字段类型说明 / null 语义
garage_codestring车库编码
garage_namestring车库名称,如「B2 地下车库」
floorstring楼层,如 B2
zonestring区域;车库级汇总行为 null
spot_typeenumcharging / normal
total_countint | null总位;null = 未上报,不按 0
available_countint | null空闲位;null = 未上报,界面写「暂无」
occupied_countint | null已占用;null = 未上报
occupancy_ratenumber | null占用率 0–100,保留 1 位;分母缺失时为 null
aggregatebooleantrue 表示停车系统给出的合计行,可直接引用;分区行不得相加自造合计
updated_atstring | nullISO 8601;null = 无时间戳,按过期处理
source_statusenumok / stale / unavailable
messagestring | null失败原因,如「车库未接入」

失败约定:非 200、超时、解析失败均返回 source_status=unavailable 且计数为 null;不返回部分脏数据。

4.3 query_my_charging ​

项内容
作用查当前用户本人绑定车辆的充电状态
权限只读;必须携带登录态 user_id
入参user_id(必填,来自 IAM/会话,不取自对话文本)、plate_no(可选,明文仅用于服务端匹配)、charger_id(可选)

注:plate_no 与 charger_id 至少传一个;都未传时直接返回 binding_status=unbound,不再查库。

返回字段:

字段类型说明 / null 语义
binding_statusenumbound / unbound / multiple
binding_reasonstring | nullno_binding / not_bound / multiple_vehicles
plate_maskedstring | null已脱敏,如「苏A·1**89」;MCP 不返回明文
vehicle_countint绑定车辆数
candidatesarray | nullmultiple 时返回脱敏车牌列表,不含车主信息
charger_idstring | null充电桩 ID
charger_namestring | null如「B2 东区 03 号」
garage_code / floor / zonestring | null位置;未知为 null
charging_statusenumcharging / full / idle / fault / unknown
soc_percentint | null当前电量;null = 车辆未上报,不写 0%
power_kwnumber | null实时功率;null = 桩未上报,不写 0 kW
started_atstring | null开始充电时间
estimated_full_atstring | null预计充满;null = 无法推算,不写「即将充满」
remaining_minutesint | null剩余分钟;null 同上
updated_atstring | null数据时间
source_statusenumok / stale / unavailable

失败与越权约定:

  • 超时/非 200 → source_status=unavailable,字段为 null,Skill 回「暂无」。
  • 车牌不属于当前 user_id → 返回 unbound + not_bound,不提示该车牌是否存在,不返回任何车辆数据。
  • 绑定关系查询失败与充电数据查询失败分开返回,避免把「查不到绑定」误报成「没在充电」。

4.4 导航复用 T2 ​

  • 本场景不定义导航 Tool,只调用 T2 的 plan_route / resolve_space。
  • S2 只传目的地语义(garage_code、zone、charger_id),由 T2 解析 POI、起点与路线。
  • T2 不可用时给文字指引(如「B2 东区电梯厅旁」)+ 建议问服务台,不编造路线和步行时间。

5. Skill 设计 ​

5.1 职责 ​

把「意图分流 → 绑定校验 → 调 MCP → 按模板输出」写死,保证两个 case 的格式、口径、脱敏一致;不做定时、不做写操作。

5.2 流程 ​

5.3 Skill 提示词草稿 ​

你是上海交通大学新院区 IBMS 的学生助手。当前用户是已登录的 MBA 学生,user_id 取自登录态,不接受用户在对话里声明的身份。

意图分流:
1. 问「还有没有车位 / 空位 / 充电位 / 占用率」→ 调 query_parking_availability。
   - 未说明充电位还是普通车位时,默认 spot_type=charging,并在首句注明「按充电车位查的」。
   - 车库必须从服务端配置清单里选;用户说的车库不在清单里,列已接入车库让用户选,不猜。
2. 问「我的车 / 充得怎么样 / 充到多少 / 还要多久」→ 调 query_my_charging。
   - 未绑定时给绑定指引,不猜车牌、不按姓名/手机号查、不列他人车辆。
   - 多车绑定时列出脱敏车牌反问,不默认第一辆。
3. 一轮只处理一个主意图;两个意图同时出现,先答空位,末尾问要不要看自己的车。

输出规则:
- 结论先行;每次给数都写「更新于 HH:mm」;>10 分钟标「数据可能不准确」,>30 分钟按「暂无」。
- 空值一律写「暂无」,不写 0,不把空值当「没有车位」。
- 分车库、分区域列示,不把不同车库的数字相加;只引用系统返回的 aggregate 合计行。
- 车位回复必须带「实时快照,以现场为准;不提供预约或占位」。
- 车牌只写脱敏形式(如 苏A·1**89),不写车主姓名、手机号。
- 功率或预计时间缺失时,只给已有字段,不推算、不写「即将充满」。
- 不说「一定有位置」「保证充上」;不推车程、路况、ETC、停车费。
- 不做预约、排队、占位、充电启停。
- 导航只调用 T2 的 plan_route / resolve_space;T2 不可用时给文字指引,不编路线。
- 只用 Markdown + Mermaid(最多 1 张图)+ 编号选项/链接;不输出 JSON、HTML、卡片。

Few-shot:配置时把本文 §3.3、§3.5、§3.6、§3.7 的示例原文放入 Skill。

5.4 工具调用顺序与失败策略 ​

步骤调用失败时
1解析意图、车库、区域车库不在清单 → 列可选车库,不调用
2query_parking_availability超时/无数据 → 「暂无」+ 换车库/服务台;不展示旧缓存
3query_my_chargingunbound → 绑定指引;multiple → 反问;超时 → 「暂无」
4T2 plan_route / resolve_space仅在用户选导航时调用;失败 → 文字指引
5按模板组装—

注:两个业务 MCP 不并行调用;先完成当前意图,再响应用户的下一句。


6. 定时任务配置 ​

无。 S2 是被动查询;到校前的主动提醒由 S1 通勤提醒 承担(历史车位规律 + 建议到校时间),不在本场景重复推送。被动问答不属于 L4 主动服务,不写洞察卡片。


7. 权限与数据范围 ​

项设计
操作级别只读(L2);无任何写操作
车位数据公共资源,不含个人信息;按车库/区域查询
车辆数据学生只能查本人绑定车辆,不查他人
身份来源IAM 登录态 → user_id;对话中自称的身份一律不采信
越权校验query_my_charging 按 user_id + 绑定关系校验;车牌不属于本人时返回 unbound,不泄露车牌是否存在
车牌脱敏在 MCP 出口完成,Skill/模型只拿 plate_masked
绑定维护用户在小程序「我的 → 车辆绑定」自助维护,绑定关系存业务系统,Agent 只读(维护方待确认)
多车列脱敏车牌让用户选,不默认
审计记录 user_id、Tool、车库、结果状态;日志不记明文车牌、不记车主信息

8. 验收要点 ​

#验收项标准
1Case A 正常「B2 还有充电车位吗」返回分区空闲数、总位、占用率、更新时间,且带「实时快照」声明
2Case B 正常「我的车充得怎么样」返回脱敏车牌、电量、功率、预计充满、是否已充满
3连续对话先问 A 再问 B,同一会话内可直接接上,不需要重报车库
4未绑定返回绑定指引(我的 → 车辆绑定),不猜车牌、不出现他人车辆
5无数据车库未接入或接口失败时写「暂无」,不写 0、不写「没有车位」
6数据过期10–30 分钟标「数据可能不准确」;>30 分钟按「暂无」
7脱敏车牌只出现「苏A·1**89」形式;无车主姓名、手机号
8不推车程/费用回复中不出现实时路况、车程、ETC、停车费
9不做预约排队不提供锁位、排队、占位、充电启停;明确说明只读
10跨车库与缺失不同车库不相加;功率/预计时间缺失时只给已有字段

9. 已确认与待确认 ​

9.1 已确认 ​

#事项结论
1能力归属停车/充电为业务系统只读能力,只做 MCP 封装,不新建 Agent 能力、不新建业务系统
2space-agent完全不具备停车/充电能力,本文不引用
3工具划分query_parking_availability(空位)+ query_my_charging(我的车)
4导航复用 T2 plan_route / resolve_space,本文不重定义
5场景边界不预约、不排队、不占位、不控桩、不推车程与费用
6隐私车牌脱敏、只查本人、不查他人;绑定关系由业务系统维护
7定时任务无;被动查询,不写洞察卡片

9.2 待确认 ​

  1. 停车/充电系统是否已有可调用的只读接口?字段是否能覆盖车库、楼层、区域、总位、空闲位、更新时间?
  2. 充电桩是否上报实时功率与预计充满时间?若无,Case B 只能给状态与电量。
  3. 车牌与学号的绑定关系由谁维护:学生自助、停车系统开户,还是学校统一同步?
  4. 空闲位刷新频率是多少?是否支撑 10 分钟新鲜度阈值?
  5. 各车库(B1/B2/B3、东区/西区)是否统一接入?是否存在只接入部分区域的情况?
  6. 访客、教师是否与学生共用同一套车位/充电数据与查询口径?
  7. 充电桩编号规则与二维码是否可绑定?用户能否从桩体直接获取编号?
  8. 多车绑定的上限与切换规则;是否需要默认车辆。

10. 关联文档 ​

文档关联内容
08_移动端AI场景设计.md §5MBA 学生 08:20 充电/车位查询的原始定义
08_移动端AI场景设计.md §10 学生模块 S2 行输入、编排、兜底与「不做预约/排队」约束
08_移动端AI场景设计.md §11、§12跨系统兜底;充电/车位与停车的设计边界
02_人流密度与空间洞察.md §1、§2停车/充电提供车位占用与进出;点位-空间映射
06_校友预约vs会议预定.md §4我方业务系统已有车位状态与占用率,可复用
prd/T1-到校前简报.md场景 PRD 写法样板
prd/公共规范.md §2、§5、§6、§8前端形态、单会话、数据规范、输出规范、10 节骨架
prd/T2-到校导航.md §4.1、§4.2resolve_space / plan_route 的定义与失败策略,本文只引用

内部方案材料,请勿外传