Skip to content

SA 空间预约 - 时间处理逻辑 (Time Pipeline)

职责: 负责接收 LLM 提取的初始槽位,通过归一化与漏斗过滤算法,输出准确的 DateTime 候选或指引 Agent 进行 澄清/报错


1. 逻辑架构 (Pipeline Architecture)

为解决复杂场景下分支嵌套过深、维护困难的问题,时间处理逻辑采用 “三步法 (归一化 -> 漏斗过滤 -> 决策建议)”

1.1 核心流程图


2. 三步法详细说明

2.1 槽位归一化 (Normalization)

在此阶段将不稳定的语义槽位补全为标准的 DateTime 对象流候选池,并处理基本的逻辑矛盾。

  • 日期缺省补全:若 LLM 未提取到 start_date,默认补齐为 Today,并强制标记 is_auto_date = true。此标记将作为后续“顺延逻辑”的重要判断依据。
  • 时间缺省补全:若未提取到 start_time,默认补齐为当前时间的 下一个整点 (NextFullHour)
  • 候选生成与矛盾拦截 (Candidate Generation): 根据 period (AM/PM) 与 Hours 生成 24 小时制的候选时间:
    • 逻辑冲突拦截:若 period = AMHours > 12,直接中止并输出 ERROR ("上午没有{Hours}点,请问您是想预定下午吗?")。不再进入后续漏斗。
    • 明确单候选生成
      • period = AMHours <= 12:target_hour = (Hours == 12) ? 0 : Hours
      • period = PMHours >= 1:target_hour = (Hours < 12) ? Hours + 12 : 12
      • period = nullHours > 12:已输入确切 24 小时制(如 "15:00"),单选 target_hour = Hours
    • 歧义双候选生成
      • period = nullHours <= 12:存在上下午歧义(如“5点”),同时生成两个候选放入漏斗池:上午候选 Hours 与下午候选 Hours + 12

2.2 漏斗过滤 (Funnel Filtering)

此阶段将生成的候选池进行逐个规则过滤。

  • 过滤器配置化 (软约束):由 Dify 的流程节点在调用时传入配置。例如,实施人员可以在 Dify 面板中配置 "work_hours": ["08:00", "22:00"]。逻辑层读取该配置对候选池进行硬过滤。(不依赖外部不可控的日历接口,解决双休加班被锁死的问题)。
  • 执行方式:像筛子一样,层层剔除不符合要求的候选。一旦某个候选触发了拦截,记录被拦截的原因(用于后续友好提示)。

2.3 决策与建议 (Resolution)

读取漏斗过滤后的候选池情况:

  • 唯一 (Count = 1):直接 OK,结束。
  • 歧义 (Count > 1):返回 AMBI,交给 Agent 追问。
  • 空窗 (Count = 0)
    • 检查 is_auto_date。如果为 false(用户明确指定了日期,如“今天下午2点”),直接报错 ERROR
    • 如果 is_auto_datetrue(用户只说了“下午2点”,且当前时间已过2点),启用平替建议逻辑:用原时间生成明天的候选,再过一次漏斗。如果有戏,以协商口吻返回 AMBI 让用户确认是否顺延。

3. 接口契约规范 (Time Logic Contract)

3.1 输入参数 (Input)

增加了 config 字段用于企业实施阶段的轻量级软约束配置。

参数名数据类型必填默认值说明
start_dateStringnull日期 "yyyy-MM-dd"
start_timeStringnull时间 "HH:mm"
periodStringnull上午/下午标识 ("AM"/"PM")
duration_hoursFloat1.0会议时长
current_timeLong-当前时间戳
configObject见下文实施期预设的业务软规则 (由 Dify 传入)

config 示例:

json
{
  "work_hours": {
    "start": "08:00",
    "end": "22:00"
  },
  "max_duration_hours": 4.0
}

3.2 输出参数 (Output)

字段名数据类型说明示例
statusEnum处理状态: OK / AMBI / ERROR"AMBI"
candidatesArray有效候选项 (标准 DateTime)["2026-03-23T14:30:00+08:00"]
reasonString若为 ERROR/AMBI,返回具体诱因"候选数超限" 或 "时间已过期"
is_auto_dateBoolean是否是由系统自动补全的今天true
suggestedBoolean是否为顺延策略带来的推荐项true

4. 落地建议

按照此架构改造后,代码复杂度将大幅度降低:

  1. 避免深层 If-Else:新增业务规则只需编写一个新的 Filter 函数加入 Pipe。
  2. 将业务权交还给实施与客户:由实施同学在 Dify 后台配置软约束 config,开发层面不再硬编码“上下班时间”。

Released under the Private License.