SA 空间预约:测试用例集 (High-Fidelity)
本文档定义了 SA_空间预约 模块的质量保障标准。所有测试用例均基于 “区间匹配 + 智能漏斗” 架构设计,确保在复杂交互下逻辑的确定性。
1. 测试基准环境 (Test Baseline)
- 系统当前时间:2026-05-07 15:00 (周四)
- 企业营业时间 (Config):
{"start":"08:00", "end":"22:00"} - 最大会议时长 (Config):
4.0 小时 - 默认槽位值:
duration_hours: 1.0,capacity: 0 (不限) - 可用空间资源 (Mock):
- 801 会议室:容量 10 人,权重 0.5
- 802 会议室:容量 20 人,权重 0.8
2. 槽位提取测试 (NLU Layer)
验证重点:LLM 语义还原能力(不含逻辑判断)。
| ID | 用户原始输入 | 预期提取槽位 (Raw JSON Slots) | 预期识别关键点 |
|---|---|---|---|
| NL-01 | “帮我定个 4pm 会议室” | {"start_time":"04:00", "period":"PM"} | 12h/24h 语义转换 |
| NL-02 | “订个 9 点的” | {"start_time":"09:00", "period":null} | 保留上下午歧义 |
| NL-03 | “现在订个房间” | {"start_time":"NOW"} | 语义标签识别 |
| NL-04 | “帮我约个最快能订到的会议室” | {"start_time":"ASAP"} | 语义标签识别 |
| NL-05 | “定个下周一早上 10 点” | {"start_date":"2026-05-11", "start_time":"10:00", "period":"AM"} | 相对日期计算 |
| NL-06 | “订个 10 人的开研发周会” | {"capacity":10, "topic_name":"研发周会"} | 容量与主题提取 |
| NL-07 | “下午 4 点 802 两个小时” | {"start_time":"04:00", "period":"PM", "room_name":"802", "duration_hours":2.0} | 全量槽位覆盖 |
3. 逻辑管道专项测试 (Pipeline Layer)
3.1 Time Pipeline (时间校验与区间匹配)
| ID | 场景描述 | 问题实例 (User Input) | 输入示例 (Slots) | 核心逻辑 | 预期决策 | 提示建议 |
|---|---|---|---|---|---|---|
| TP-01 | 日期过期 | “帮我定5/6会议室” | {"start_date":"2026-05-06"} | Date < Today | ERROR | “您预订的日期已过期。” |
| TP-02 | 时空逻辑矛盾 | “帮我订个明天现在的会议室” | {"start_date":"明天", "start_time":"NOW"} | Intent ∩ Constraint == ∅ | ERROR | “逻辑冲突:明天没有‘现在’。” |
| TP-03 | 语义时段冲突 | “帮我订明天上午 16 点的会” | {"start_date":"2026-05-08","period":"AM", "start_time":"16:00"} | Intent ∩ Constraint == ∅ | ERROR | “逻辑冲突:上午没有 16 点。” |
| TP-04 | 智能消歧(过去) | “订个 9 点的”(当前15:00) | {"start_time":"09:00"} | 9:00 < Now -> Intercept | OK | 自动锁定 21:00 窗口 |
| TP-05 | 真实歧义生成 | “订明天 9 点的” | {"start_date":"明天", "start_time":"09:00"} | 多窗口有效 | AMBI | “请确认是上午还是下午?” |
| TP-06 | 非营业时间 | “帮我订凌晨 3 点的会议室” | {"start_time":"03:00"} | ∩ WorkHours == ∅ | ERROR | “该时段非办公时间 (08:00-22:00)。” |
| TP-07 | 时长超限 | “帮我订个 10 小时的会议” | {"duration_hours":10.0} | Duration > Config | ERROR | “单次预约不能超过 4 小时。” |
3.2 Resource Pipeline (物理执行与寻优)
| ID | 场景描述 | 问题实例 (User Input) | 输入参数 | 预期策略 | 预期结果 (Agent 反应) |
|---|---|---|---|---|---|
| RP-01 | 指名且空闲 | “帮我订下 801” | {"room_name":"801"} | 语义权重优先 | 返回 801 详情并确认预订。 |
| RP-02 | 指名但被占 | “帮我订下 801” | {"room_name":"801"} | 忙闲拦截 (Busy) | 询问确认:“抱歉,801 已经被占用了,需要为您推荐其他房间吗?” |
| RP-03 | ASAP 寻优 | “帮我约个最快能订到的” | {"start_time":"ASAP"} | 贪婪搜索 (寻优) | 返回当前最早可用的时间块及房间。 |
| RP-04 | 紧凑匹配 (5人) | “5 个人开会” | {"capacity":5} | 容量适配度优先 | 优选 801 (10人),而非 802 (20人) 以防大房小用。 |
| RP-05 | 硬性匹配 (15人) | “找个能坐 15 人的房间” | {"capacity":15} | 容量硬性过滤 | 自动过滤 801 (10人),直接推荐 802 (20人)。 |
| RP-06 | 全域满容 | “帮我订 16:00 的” | {"start_time":"16:00"} | 资源召回池为空 | 抱歉拦截:“抱歉,该时段所有会议室均已约满,建议换个时间。” |
4. 全链路集成场景 (E2E Scenarios)
场景 A:智能消歧与成功预约
- 用户输入: “帮我订个 4 点的会议室” (当前 15:00)
- 系统处理:
NLU:提取start_time: 04:00TimePipe:识别 04:00 (AM) 已过期,自动锁定为 16:00 (PM),状态OK。ResPipe:调用固定时间接口,找到可用空间。
- 最终回复: “为您找到以下 16:00 的可用会议室...”
