主题
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 东区 充电车位 16 5 68.8% 08:19 B2 西区 充电车位 8 1 87.5% 08:18 以上为实时快照,以现场为准;不提供预约或占位。
- 导航到 B2 东区充电区(调用 T2 导航能力,起终点不明确时会先问你在哪)
- 看 B1 的充电位
- 查我的车充电进度
注:东区、西区分开列示,不合成「B2 共 6 个」;只有停车系统返回合计行时才引用合计。
3.4 Case A 变体:多车库对比
用户
B1 和 B2 哪个充电位多?
Agent
空闲比例上 B2 东区最好(68.8% 占用),B1 最紧张(83.3% 占用)。两个车库入口不同,空位数不相加。
车库 / 区域 总位 空闲 占用率 B1 12 2 83.3% B2 东区 16 5 68.8% B2 西区 8 1 87.5%
- 导航到 B2 东区充电区
- 查我的车充电进度
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 分钟)
- 充满后提醒我(仅本次会话文字提示,不做推送)
- 查 B2 其他空位
注:已充满时改为「已于 08:52 充满(100%),可以拔枪离开;充电桩状态以现场为准。」不推算费用。功率为 null 时写「功率暂无」,并去掉预计时间;预计时间 null 时只给当前电量。
3.6 Case C:未绑定车辆
用户
我的车充得怎么样了?
Agent
还没有查到你的车辆绑定,暂时无法查询充电状态。请先在「我的 → 车辆绑定」绑定车牌或充电桩编号,绑定后直接问我「我的车充得怎么样了」。
为保护隐私,我不会按姓名或手机号猜车,也不会展示他人的车辆或充电记录。
- 去绑定(跳转「我的 → 车辆绑定」)
- 我有充电桩编号,先完成绑定
注:多辆车已绑定时,列出脱敏车牌反问「你问的是哪一辆」,不默认查第一辆。
3.7 Case D:接口无数据或失败
用户
B1 还有充电车位吗?
Agent
B1 的充电车位数据暂无:停车系统没有返回该车库的充电位信息,可能是该车库未接入或接口暂时不可用。
空值不代表 0,也不代表没有车位。可以改问 B2,或到服务台/岗亭确认。
- 查 B2 的空位
- 查我的车充电进度
注:失败时不展示上一次的缓存数字;确有 ≤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_code | string | 是 | 如 B1 / B2,取自服务端车库清单 |
floor | string | 否 | 如 B1 / B2;缺省返回该车库全部分区 |
zone | string | 否 | 如 east / west;缺省返回全部分区 |
spot_type | enum | 否 | charging / normal / all,默认 charging |
返回为分区数组,每行字段:
| 字段 | 类型 | 说明 / null 语义 |
|---|---|---|
garage_code | string | 车库编码 |
garage_name | string | 车库名称,如「B2 地下车库」 |
floor | string | 楼层,如 B2 |
zone | string | 区域;车库级汇总行为 null |
spot_type | enum | charging / normal |
total_count | int | null | 总位;null = 未上报,不按 0 |
available_count | int | null | 空闲位;null = 未上报,界面写「暂无」 |
occupied_count | int | null | 已占用;null = 未上报 |
occupancy_rate | number | null | 占用率 0–100,保留 1 位;分母缺失时为 null |
aggregate | boolean | true 表示停车系统给出的合计行,可直接引用;分区行不得相加自造合计 |
updated_at | string | null | ISO 8601;null = 无时间戳,按过期处理 |
source_status | enum | ok / stale / unavailable |
message | string | 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_status | enum | bound / unbound / multiple |
binding_reason | string | null | no_binding / not_bound / multiple_vehicles |
plate_masked | string | null | 已脱敏,如「苏A·1**89」;MCP 不返回明文 |
vehicle_count | int | 绑定车辆数 |
candidates | array | null | multiple 时返回脱敏车牌列表,不含车主信息 |
charger_id | string | null | 充电桩 ID |
charger_name | string | null | 如「B2 东区 03 号」 |
garage_code / floor / zone | string | null | 位置;未知为 null |
charging_status | enum | charging / full / idle / fault / unknown |
soc_percent | int | null | 当前电量;null = 车辆未上报,不写 0% |
power_kw | number | null | 实时功率;null = 桩未上报,不写 0 kW |
started_at | string | null | 开始充电时间 |
estimated_full_at | string | null | 预计充满;null = 无法推算,不写「即将充满」 |
remaining_minutes | int | null | 剩余分钟;null 同上 |
updated_at | string | null | 数据时间 |
source_status | enum | ok / 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 | 解析意图、车库、区域 | 车库不在清单 → 列可选车库,不调用 |
| 2 | query_parking_availability | 超时/无数据 → 「暂无」+ 换车库/服务台;不展示旧缓存 |
| 3 | query_my_charging | unbound → 绑定指引;multiple → 反问;超时 → 「暂无」 |
| 4 | T2 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. 验收要点
| # | 验收项 | 标准 |
|---|---|---|
| 1 | Case A 正常 | 「B2 还有充电车位吗」返回分区空闲数、总位、占用率、更新时间,且带「实时快照」声明 |
| 2 | Case 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 能力、不新建业务系统 |
| 2 | space-agent | 完全不具备停车/充电能力,本文不引用 |
| 3 | 工具划分 | query_parking_availability(空位)+ query_my_charging(我的车) |
| 4 | 导航 | 复用 T2 plan_route / resolve_space,本文不重定义 |
| 5 | 场景边界 | 不预约、不排队、不占位、不控桩、不推车程与费用 |
| 6 | 隐私 | 车牌脱敏、只查本人、不查他人;绑定关系由业务系统维护 |
| 7 | 定时任务 | 无;被动查询,不写洞察卡片 |
9.2 待确认
- 停车/充电系统是否已有可调用的只读接口?字段是否能覆盖车库、楼层、区域、总位、空闲位、更新时间?
- 充电桩是否上报实时功率与预计充满时间?若无,Case B 只能给状态与电量。
- 车牌与学号的绑定关系由谁维护:学生自助、停车系统开户,还是学校统一同步?
- 空闲位刷新频率是多少?是否支撑 10 分钟新鲜度阈值?
- 各车库(B1/B2/B3、东区/西区)是否统一接入?是否存在只接入部分区域的情况?
- 访客、教师是否与学生共用同一套车位/充电数据与查询口径?
- 充电桩编号规则与二维码是否可绑定?用户能否从桩体直接获取编号?
- 多车绑定的上限与切换规则;是否需要默认车辆。
10. 关联文档
| 文档 | 关联内容 |
|---|---|
08_移动端AI场景设计.md §5 | MBA 学生 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.2 | resolve_space / plan_route 的定义与失败策略,本文只引用 |