Skip to content

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

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


1. 逻辑架构 (Pipeline Architecture)

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

1.1 核心流程图


2. 三步法详细说明

2.1 槽位归一化与一致性匹配 (Normalization)

在此阶段将不稳定的语义槽位转换为确定的时间区间,并利用区间交集算法 (Range Intersection) 拦截所有逻辑矛盾。

  • 1.1 槽位提取与默认补全 (Pre-processing)
    • Date 补全:若 start_date 为空,补全为 Today
    • Duration 补全:若 duration_hours 为空,默认补全为 1.0 (1 小时)。
  • 1.2 候选窗口流生成 (Generation)
    • 将用户的意图转换为 1 或 2 个 [Start, End] 时间窗口:
      • NOW [CurrentTime, CurrentTime + Duration]
      • ASAP [CurrentTime, 23:59]
      • 数字时间 结合上下午生成对应窗口(无 Period 则生成双候选)。
  • 1.3 候选流生成 (Generation)
    • 经过匹配与消歧后,输出最终的 “有效候选窗口流 (Candidate Window Stream)”
    • 后续流向:无论是单窗口(OK)、多窗口(AMBI)还是搜索窗口(ASAP),均统一进入 Phase 2 的漏斗过滤(如营业时间过滤),并最终由 Resource Pipeline 执行物理检索。

2.2 漏斗过滤 (Funnel Filtering)

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

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

2.3 决策与建议 (Resolution)

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

  • 唯一 (Count = 1):直接 OK,结束。
  • 歧义 (Count > 1):返回 AMBI,交给 Agent 追问。
  • 空窗 (Count = 0):直接报错 ERROR,告知用户该时间段不可用(已过期或非工作时间)。不再执行跨天自动顺延逻辑。

3. 异常场景穷举 (Edge Case Matrix)

为确保系统稳定性,研发需针对以下场景进行逻辑覆盖:

3.1 AMBI (歧义确认)

场景触发条件预期 ReasonAgent 预期话术
缺少具体时间用户仅说“订明天的会议室”,未提供 start_time缺少具体时间"好的,请问您想订几点的呢?"
上下午歧义“订9点的”,且 09:00 和 21:00 均在未来且在营业时间内上下午歧义"请确认是上午9点还是晚上9点?"

3.2 ERROR (逻辑拦截)

场景拦截规则预期 Reason示例输入
日期已过期Date 规则日期已过期“帮我订昨天的会议室”
时空逻辑矛盾语义一致性规则逻辑冲突“预定明天现在”、“上午 16:00”
时间已过期历史时间规则时间已过期当前 14:00,预定“今天上午 10:00”
非营业时间营业时间规则非营业时间“帮我订凌晨 3 点的会议室”
时长超限Config 规则时长超限会议时长 10 小时(Max: 4)

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

4.1 输入参数 (Input)

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

参数名数据类型必填默认值说明
start_dateStringnull日期 "yyyy-MM-dd"
start_timeStringnull时间 "HH:mm" 或语义标签 "NOW" / "ASAP"
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
}

4.2 输出参数 (Output)

字段名数据类型说明示例
statusEnum处理状态: OK / AMBI / ERROR"AMBI"
candidatesArray有效候选项 (标准 DateTime)["2026-03-23T14:30:00+08:00"]
reasonString若为 ERROR/AMBI,返回具体诱因"逻辑冲突 (AM/PM 矛盾)"、"候选数超限"、"时间已过期" 或 "缺少具体时间"

5. 落地建议

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

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

Released under the Private License.