SA 会议预定 - 设计实现偏差问题说明(现状 vs 产品预期)
状态:待评审 | 范围:对话端(Chatbot)会议预定 | 关联:SA 空间预约 Agent 设计、时间处理逻辑、物理执行逻辑、会议室推荐算法逻辑、查询取消功能设计 | 问题定位:Dify 编排实现相对设计文档存在多处简化、下沉与缺失
0. 问题清单总览
等级说明:由强哥手动维护优先级,P0(阻断/必须本期解决)> P1(本期应解决)> P2(后续版本/需求点)。未定级时留空。
| # | 问题 | 等级 | 定性 | 处理建议 |
|---|---|---|---|---|
| 1 | 上下午歧义澄清(AMBI)被移除,改为 LLM 默认推断 | P1 | 设计简化,稳定性待实测 | 实测后定(见 §4.1) |
| 2 | NOW / ASAP 语义标签完全未实现 | P2 | 功能缺失(需求点) | 记录为需求,未排期 |
| 3 | 指名房间冲突时无平替推荐 | P0 | 功能缺失 | 待整改 |
| 4 | 推荐排序算法未在 Dify 层落地(是否按人数/房间大小排序待后端确认) | P1 | 下沉 / 待确认 | 对齐后端后定 |
| 5 | 日期范围查询仅支持"单日 + 默认 7 天",范围/上周查询缺失 | P1 | 功能缺失 | 待整改 |
1. 问题一句话
会议预定 Dify 子流程相对设计文档在"时间消歧、即时/尽快预订、冲突平替、推荐排序、日期范围查询"五个能力点上存在简化或缺失,其中部分为明确的验收缺口(对应测试用例集失效项),部分为设计决策待确认。
2. 产品预期(PRD 汇总)
按设计文档的原始定义:
- 时间三态决策(OK / AMBI / ERROR):上下午歧义时输出
AMBI引导用户确认(如"订9点的" → "请确认是上午9点还是晚上9点?");"上午 16:00" 等时空矛盾输出ERROR拦截(时间处理逻辑 §3、测试用例集 TP-03/TP-05)。 - NOW / ASAP 语义:"现在/马上" → 即时预订;"尽快/越快越好" → ASAP 专用贪婪搜索,返回最早可用空档(测试用例集 NL-03/NL-04/RP-03)。
- 冲突平替(Case 1):指名房间被占/设施不满足时,剥离房间限定,按容量硬约束推荐同规格替代房间(推荐算法逻辑 §4.1)。
- 推荐排序:模糊预约按容量适配度
Fit_cap排序,避免大房小用(如 10 人优先推荐 12 人房而非 30 人房,算法 §3 策略 B)。 - 日期范围查询:支持单日与日期范围(如"这周/下周/6.10-6.20 的会"),过去日期按范围照常展示(查询取消设计 §4.1 / 测试用例 Q-12~Q-19)。
3. 现状实现与偏差定性
3.1 时间状态模型:三态 → 两态(AMBI 被移除)
现状 会议预约时间校验 只输出 ok / reject(含 past / missing_time / outside_hours / error),period 槽位已删除,上下午语义由 Slot 提取 Prompt 直接转成 24h 制,且明文规定了"未指上下午的 1–11 点默认下午"。由此:
上下午歧义不再追问,由 LLM 单次"替用户做决定";
"上午 16:00" 这类时空矛盾输入,因 Prompt 明确"时间字段按字面提取、不做合理性校验",会被提取为
16:00并通过工作时段校验(16 点在 13:00–22:00 内),静默按下午 4 点执行,无任何冲突拦截。
3.2 NOW / ASAP 缺失
Prompt 中无 NOW / ASAP 语义标签,也无对应执行分支。输入"现在订个会议室 / 越快越好"时,Slot 提取器无时间可输出 → 落入 missing_time 追问分支,直接要求补充开始时间。
3.3 指名房间冲突无平替
现状 输出可用会议室 在"指定房间 + 空结果"时仅回复"您申请预订的会议室当前已被占用,无法完成预约",不剥离房间限定发起同规格平替检索。
3.4 推荐排序未在 Dify 层落地(待后端确认)
现状 Dify 层只构造 startTime/endTime/capacityAtLeast/topK/roomDeviceIds/locationIds 请求体,不携带任何排序权重,也不做 Top 3 截断(默认 topK 20),排序完全由后端 list_available_meeting_rooms 决定。算法文档中的 Fit_cap(容量适配度)与 W_base(业务权重)公式是否在后端实现,待确认。
3.5 日期范围查询缺失
现状 会议查询时间校验:有 date → [date, +1天),无 date → [今天, +7天)。即仅支持"单日"与"默认 7 天","这周/下周/指定日期区间"会被折叠为单日查询;且过去日期被钳到今天,上周会议无法查到。
4. 测试用例(实测清单)
4.1 上下午歧义处理稳定性实测(P0,先实测后定)
目的:验证当前"LLM 默认推断下午"的策略是否稳定,是否会偶发"大冒险"(随机推断上午/下午),以及时空矛盾是否被静默放行。
| ID | 输入 | 设计预期 | 现状预期 | 判定 | 验证方式 |
|---|---|---|---|---|---|
| T-AM-01 | "订个 9 点的会议室"(无上下午) | AMBI 追问"上午还是下午" | 固定输出 start_time=15:00 | 设计差异 | 同一输入跑 10 次,核对输出是否 100% 一致且为 15:00 |
| T-AM-02 | "订明天 9 点的会" | AMBI 追问 | 固定 15:00 | 设计差异 | 同上 |
| T-AM-03 | "上午 16 点开会"(时空矛盾) | ERROR"上午没有 16 点" | 提取 16:00 且通过校验,静默按 16:00 预订 | 缺陷 | 观察是否出现冲突拦截;无拦截即确认静默放行 |
| T-AM-04 | "上午 9 点开会" vs "晚上 9 点开会" | 09:00 / 21:00 | 09:00 / 21:00 | 稳定基线 | 确认 AM/PM 正向编码稳定,作为对照 |
结论判定标准:
T-AM-01/02 若 10 次输出一致 → 现状可接受(行为确定,仅与设计文档有出入),更新设计文档对齐即可;
若出现不一致(随机上午/下午)→ 属"大冒险"缺陷,必须回退为 AMBI 追问或加默认值兜底。
4.2 NOW / ASAP(需求点记录,未排期)
| ID | 输入 | 设计预期 | 现状预期 | 判定 |
|---|---|---|---|---|
| T-NA-01 | "现在订个会议室" | start_time=NOW 即时预订 | 时间缺失 → 追问"请补充会议开始时间" | 功能缺失 |
| T-NA-02 | "越快越好,帮我找间会议室" | start_time=ASAP 贪婪搜索最早空档 | 同 T-NA-01,追问或按普通 booking 处理 | 功能缺失 |
4.3 指名房间冲突平替
| ID | 输入 | 前置条件 | 设计预期 | 现状预期 | 判定 |
|---|---|---|---|---|---|
| T-REP-01 | "订一下 801 会议室" | 801 该时段被占 | CONFLICT:解释占用 + 推荐同规格平替(如 802) | 仅回复"已被占用,无法完成预约",无平替 | 功能缺失 |
| T-REP-02 | "订 802" | 802 该时段被占,且无满足容量硬约束的替代 | 返回失败话术(无平替) | 同现状 | 基线一致 |
4.4 推荐排序(需后端确认)
| ID | 输入 | 前置条件 | 设计预期 | 现状预期 | 判定 |
|---|---|---|---|---|---|
| T-SORT-01 | "5 个人开会" | 801(10人) / 802(20人) 均空闲 | 按容量适配度优选 801 | 返回顺序取决于后端;若后端未按人数适配排序,则为缺失 | 待后端确认 |
| T-SORT-02 | "找个能坐 15 人的房间" | 801(10人) / 802(20人) | 硬过滤 801,仅推荐 802 | 观察 capacityAtLeast=15 是否被后端硬过滤 | 待后端确认 |
4.5 日期范围查询
| ID | 输入 | 设计预期 | 现状预期 | 判定 |
|---|---|---|---|---|
| T-DATE-01 | "查一下这周有什么会" | [周一, 周日] 全周 | date 解析为周一 → 仅查 [周一, 周二) | 功能缺失 |
| T-DATE-02 | "查一下 6月10号到6月20号的会" | [6/10, 6/20] 区间 | 仅查 [6/10, 6/11) | 功能缺失 |
| T-DATE-03 | "查一下上周的会" | 按上周日期区间照常展示(Q-19) | 过去日期被钳到今天 → 上周会议查不到 | 功能缺失 |
5. 整改方向(供评审)
- 上下午歧义:按 T-AM 实测结论执行——稳定则更新设计文档对齐现状(含将"上下午定义"移交给会议系统侧,见 §6);不稳定则回退 AMBI 追问。
- 时空矛盾静默放行(T-AM-03):无论上下午策略如何,建议在时间校验节点补充
start_time合理性硬校验(如 00–23 点范围 + 基础工作时段),避免"上午 16 点"被静默预订。 - 平替推荐:在
输出可用会议室节点增加降级分支——指定房间空结果时,剥离room_name限定、保留容量/设备约束二次检索同规格替代,并输出"已被占用,为您推荐以下房间"。 - 推荐排序:与后端确认
list_available_meeting_rooms是否实现容量适配度排序;若未实现,将Fit_cap计算下沉至后端并给出排序字段,Dify 层按返回顺序截取 Top 3。 - 日期范围查询:
会议查询时间校验支持date_to,slot 提取按查询取消设计 §4.1 补充date_from/date_to两字段,范围与过去日期照常下发。 - NOW / ASAP:作为独立需求点排期(涉及 Time Pipeline 新语义 + ASAP 搜索接口),本期不整改。
6. 已决策 / 不纳入项(评审确认后冻结)
| 项 | 决策 | 依据 |
|---|---|---|
营业时间硬编码(_DEFAULT_MEETING_CONFIG) | 不算问题,保持现状 | 当前无对外面板配置诉求,硬编码可接受;设计文档"软约束配置化"暂不落地 |
时长超限校验(max_duration_hours) | 本期不做 | 会议系统后续升级会提供该约束数据,应从后端获取而非本地定义 |
上下午定义(period / AM-PM 逻辑) | 本地不再维护 | 同上,随会议系统升级从后端获取;本地仅保留"默认下午"兜底策略 |
7. 例外说明
本问题不影响正向预订主链路:指名/模糊预订在时间合规、房间空闲时行为正确。
营业时间过滤、过期拦截、设施过滤(
roomDeviceIds)等已落地能力不在本次问题范围。多轮支持正常 ✅:主智能体经 Chatflow Invoker 传入
chathistory(近 3 轮),会议词槽提取节点用户提示词含"历史:{{#...chathistory#}}",且 Slot Prompt 内置"上下文继承"规则(历史已提字段、当前输入未否定则继承)——多轮槽位延续可用。
